diff --git a/Dockerfile b/Dockerfile index c63bba83e..8b144e738 100644 --- a/Dockerfile +++ b/Dockerfile @@ -82,6 +82,8 @@ ENV GITNESS_DATABASE_DATASOURCE /data/database.sqlite ENV GITNESS_METRIC_ENABLED=true ENV GITNESS_METRIC_ENDPOINT=https://stats.drone.ci/api/v1/gitness ENV GITNESS_TOKEN_COOKIE_NAME=token +ENV GITNESS_GITSPACE_DEFAULT_BIND_MOUNT_SOURCE_BASE_PATH /data +ENV GITNESS_DOCKER_HOST unix:///var/run/docker.sock COPY --from=builder /app/gitness /app/gitness COPY --from=cert-image /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt diff --git a/app/api/controller/gitspace/action.go b/app/api/controller/gitspace/action.go index 39a460753..d73671457 100644 --- a/app/api/controller/gitspace/action.go +++ b/app/api/controller/gitspace/action.go @@ -257,6 +257,6 @@ func (c *Controller) emitGitspaceConfigEvent( EntityID: config.ID, EntityType: enum.GitspaceEntityTypeGitspaceConfig, EventType: eventType, - Created: time.Now().UnixMilli(), + Timestamp: time.Now().UnixNano(), }) } diff --git a/app/api/controller/gitspace/events.go b/app/api/controller/gitspace/events.go index 6ec9d600f..47ef651f9 100644 --- a/app/api/controller/gitspace/events.go +++ b/app/api/controller/gitspace/events.go @@ -63,7 +63,7 @@ func (c *Controller) Events( gitspaceEventResponse := &types.GitspaceEventResponse{ GitspaceEvent: *event, Message: eventMessageMap[event.Event], - EventTime: time.UnixMilli(event.Created).Format(time.RFC3339)} + EventTime: time.Unix(0, event.Timestamp).Format(time.RFC3339Nano)} result[index] = gitspaceEventResponse } diff --git a/app/events/gitspace/events.go b/app/events/gitspace/events.go index 37f5d479f..e62a4024b 100644 --- a/app/events/gitspace/events.go +++ b/app/events/gitspace/events.go @@ -35,7 +35,7 @@ type ( QueryKey string `json:"query_key,omitempty"` EntityType enum.GitspaceEntityType `json:"entity_type,omitempty"` EventType enum.GitspaceEventType `json:"event_type,omitempty"` - Created int64 `json:"created,omitempty"` + Timestamp int64 `json:"timestamp,omitempty"` } ) diff --git a/app/gitspace/orchestrator/container/embedded_docker.go b/app/gitspace/orchestrator/container/embedded_docker.go index 2310c4d97..ce0970090 100644 --- a/app/gitspace/orchestrator/container/embedded_docker.go +++ b/app/gitspace/orchestrator/container/embedded_docker.go @@ -20,6 +20,7 @@ import ( "io" "os" "path/filepath" + "strings" "github.com/harness/gitness/app/gitspace/logutil" "github.com/harness/gitness/infraprovider" @@ -51,9 +52,10 @@ const ( ) type Config struct { - DefaultBaseImage string - DefaultBindMountTargetPath string - DefaultBindMountSourceBasePath string + DefaultBaseImage string + DefaultBindMountTargetPath string + DefaultBindMountSourceBasePath string + DefaultBindMountSourceBasePathAbsolute string } type EmbeddedDockerOrchestrator struct { @@ -182,7 +184,7 @@ func (e *EmbeddedDockerOrchestrator) StartGitspace( return &StartResponse{ ContainerID: containerID, ContainerName: containerName, - WorkingDirectory: e.config.DefaultBindMountTargetPath, + WorkingDirectory: strings.TrimPrefix(e.config.DefaultBindMountTargetPath, "/"), PortsUsed: usedPorts, }, nil } @@ -509,7 +511,16 @@ func (e *EmbeddedDockerOrchestrator) createContainer( gitspaceConfig.Identifier, ) - loggingErr := logStreamInstance.Write("Creating bind mount source directory: " + bindMountSourcePath) + absoluteBindMountSourcePath := + filepath.Join( + e.config.DefaultBindMountSourceBasePathAbsolute, + gitspacesDir, + gitspaceConfig.SpacePath, + gitspaceConfig.Identifier, + ) + + loggingErr := logStreamInstance.Write( + "Creating bind mount source directory: " + bindMountSourcePath + " (" + absoluteBindMountSourcePath + " )") if loggingErr != nil { return fmt.Errorf("logging error: %w", loggingErr) } @@ -548,7 +559,7 @@ func (e *EmbeddedDockerOrchestrator) createContainer( Mounts: []mount.Mount{ { Type: mount.TypeBind, - Source: bindMountSourcePath, + Source: absoluteBindMountSourcePath, Target: e.config.DefaultBindMountTargetPath, }, }, diff --git a/app/gitspace/orchestrator/orchestrator_impl.go b/app/gitspace/orchestrator/orchestrator_impl.go index c14bdb911..3f429d385 100644 --- a/app/gitspace/orchestrator/orchestrator_impl.go +++ b/app/gitspace/orchestrator/orchestrator_impl.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net/url" + "path/filepath" "time" events "github.com/harness/gitness/app/events/gitspace" @@ -66,11 +67,12 @@ func (o orchestrator) StartGitspace( o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeFetchDevcontainerStart) - devcontainerConfig, err := o.scm.DevcontainerConfig(ctx, gitspaceConfig) + repoName, devcontainerConfig, err := o.scm.RepoNameAndDevcontainerConfig(ctx, gitspaceConfig) if err != nil { o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeFetchDevcontainerFailed) - log.Warn().Err(err).Msg("devcontainer config fetch failed.") + return gitspaceInstance, + fmt.Errorf("failed to fetch code repo details for gitspace config ID %d", gitspaceConfig.ID) } if devcontainerConfig == nil { @@ -121,39 +123,27 @@ func (o orchestrator) StartGitspace( o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeAgentGitspaceCreationCompleted) - repoName, err := o.scm.RepositoryName(ctx, gitspaceConfig) - if err != nil { - log.Warn().Err(err).Msg("failed to fetch repository name.") - } - port := startResponse.PortsUsed[gitspaceConfig.IDE] var ideURL url.URL - if infra.Host == "" { - // TODO: This fix does not cover all use-cases. Ideally, we need to read the host name - // on which this docker is running and set it as the infra.Host. Remove once that change is done. - infra.Host = "localhost" - } - if gitspaceConfig.IDE == enum.IDETypeVSCodeWeb { ideURL = url.URL{ Scheme: "http", Host: infra.Host + ":" + port, - RawQuery: "folder=" + startResponse.WorkingDirectory + "/" + repoName, + RawQuery: filepath.Join("folder=", startResponse.WorkingDirectory, repoName), } } else if gitspaceConfig.IDE == enum.IDETypeVSCode { - // TODO: the following user ID is hard coded and should be changed. + // TODO: the following userID is hard coded and should be changed. + userID := "harness" ideURL = url.URL{ Scheme: "vscode-remote", Host: "", // Empty since we include the host and port in the path Path: fmt.Sprintf( - "ssh-remote+%s@%s:%s/%s/%s", - "harness", + "ssh-remote+%s@%s:%s", + userID, infra.Host, - port, - startResponse.WorkingDirectory, - repoName, + filepath.Join(port, startResponse.WorkingDirectory, repoName), ), } } @@ -303,6 +293,6 @@ func (o orchestrator) emitGitspaceEvent( EntityID: config.GitspaceInstance.ID, EntityType: enum.GitspaceEntityTypeGitspaceInstance, EventType: eventType, - Created: time.Now().UnixMilli(), + Timestamp: time.Now().UnixNano(), }) } diff --git a/app/gitspace/scm/scm.go b/app/gitspace/scm/scm.go index 5d010b305..245a0f6d4 100644 --- a/app/gitspace/scm/scm.go +++ b/app/gitspace/scm/scm.go @@ -23,6 +23,7 @@ import ( "io" "net/url" "os" + "path" "regexp" "strings" @@ -40,13 +41,15 @@ var ( var _ SCM = (*scm)(nil) type SCM interface { - // DevcontainerConfig fetches devcontainer config file from the given repo and branch. - DevcontainerConfig(ctx context.Context, gitspaceConfig *types.GitspaceConfig) (*types.DevcontainerConfig, error) - // RepositoryName finds the repository name for the code repo URL from its provider. - RepositoryName(ctx context.Context, gitspaceConfig *types.GitspaceConfig) (string, error) - // check if the current URL is a valid and accessible code repo, input can be connector info, user token etc. - CheckValidCodeRepo(ctx context.Context, request CodeRepositoryRequest, - ) (*CodeRepositoryResponse, error) + // RepoNameAndDevcontainerConfig fetches repository name & devcontainer config file from the given repo and branch. + RepoNameAndDevcontainerConfig( + ctx context.Context, + gitspaceConfig *types.GitspaceConfig, + ) (string, *types.DevcontainerConfig, error) + + // CheckValidCodeRepo checks if the current URL is a valid and accessible code repo, + // input can be connector info, user token etc. + CheckValidCodeRepo(ctx context.Context, request CodeRepositoryRequest) (*CodeRepositoryResponse, error) } type scm struct{} @@ -79,17 +82,23 @@ func NewSCM() SCM { return &scm{} } -func (s scm) DevcontainerConfig( +func (s scm) RepoNameAndDevcontainerConfig( ctx context.Context, gitspaceConfig *types.GitspaceConfig, -) (*types.DevcontainerConfig, error) { +) (string, *types.DevcontainerConfig, error) { + repoURL, err := url.Parse(gitspaceConfig.CodeRepoURL) + if err != nil { + return "", nil, fmt.Errorf("failed to parse repository URL %s: %w", gitspaceConfig.CodeRepoURL, err) + } + repoName := strings.TrimSuffix(path.Base(repoURL.Path), ".git") + gitWorkingDirectory := "/tmp/git/" cloneDir := gitWorkingDirectory + uuid.New().String() - err := os.MkdirAll(cloneDir, os.ModePerm) + err = os.MkdirAll(cloneDir, os.ModePerm) if err != nil { - return nil, fmt.Errorf("error creating directory %s: %w", cloneDir, err) + return "", nil, fmt.Errorf("error creating directory %s: %w", cloneDir, err) } defer func() { @@ -102,7 +111,7 @@ func (s scm) DevcontainerConfig( filePath := ".devcontainer/devcontainer.json" err = validateArgs(gitspaceConfig) if err != nil { - return nil, fmt.Errorf("invalid branch or url: %w", err) + return "", nil, fmt.Errorf("invalid branch or url: %w", err) } log.Info().Msg("Cloning the repository...") @@ -118,7 +127,7 @@ func (s scm) DevcontainerConfig( command.WithDir(cloneDir), ) if err != nil { - return nil, fmt.Errorf("failed to clone repository %s: %w", gitspaceConfig.CodeRepoURL, err) + return "", nil, fmt.Errorf("failed to clone repository %s: %w", gitspaceConfig.CodeRepoURL, err) } var lsTreeOutput bytes.Buffer @@ -132,13 +141,13 @@ func (s scm) DevcontainerConfig( command.WithStdout(&lsTreeOutput), ) if err != nil { - return nil, fmt.Errorf("failed to list files in repository %s: %w", cloneDir, err) + return "", nil, fmt.Errorf("failed to list files in repository %s: %w", cloneDir, err) } if lsTreeOutput.Len() == 0 { log.Info().Msg("File not found, returning empty devcontainerConfig") emptyConfig := &types.DevcontainerConfig{} - return emptyConfig, nil + return repoName, emptyConfig, nil } fields := strings.Fields(lsTreeOutput.String()) @@ -153,7 +162,7 @@ func (s scm) DevcontainerConfig( command.WithStdout(&catFileOutput), ) if err != nil { - return nil, fmt.Errorf("failed to checkout devcontainer file from path %s: %w", filePath, err) + return "", nil, fmt.Errorf("failed to read devcontainer file from path %s: %w", filePath, err) } sanitizedJSON := removeComments(catFileOutput.Bytes()) @@ -161,26 +170,10 @@ func (s scm) DevcontainerConfig( var config types.DevcontainerConfig err = json.Unmarshal(sanitizedJSON, &config) if err != nil { - return nil, fmt.Errorf("failed to parse devcontainer json: %w", err) + return "", nil, fmt.Errorf("failed to parse devcontainer json: %w", err) } - return &config, nil -} - -// TODO: Make RepositoryName compatible with all SCM providers - -func (s scm) RepositoryName(_ context.Context, gitspaceConfig *types.GitspaceConfig) (string, error) { - parsedURL, err := url.Parse(gitspaceConfig.CodeRepoURL) - if err != nil { - return "", fmt.Errorf("failed to parse url: %w", err) - } - pathSegments := strings.Split(parsedURL.Path, "/") - - if len(pathSegments) < 3 || pathSegments[1] == "" || pathSegments[2] == "" { - return "", fmt.Errorf("invalid repository name URL: %s", parsedURL.String()) - } - repoName := pathSegments[2] - return strings.ReplaceAll(repoName, ".git", ""), nil + return repoName, &config, nil } func removeComments(input []byte) []byte { diff --git a/app/services/gitspaceevent/handler.go b/app/services/gitspaceevent/handler.go index 843d1f4f2..82ac00808 100644 --- a/app/services/gitspaceevent/handler.go +++ b/app/services/gitspaceevent/handler.go @@ -17,6 +17,7 @@ package gitspaceevent import ( "context" "fmt" + "time" gitspaceevents "github.com/harness/gitness/app/events/gitspace" "github.com/harness/gitness/events" @@ -32,7 +33,8 @@ func (s *Service) handleGitspaceEvent( EntityID: event.Payload.EntityID, QueryKey: event.Payload.QueryKey, EntityType: event.Payload.EntityType, - Created: event.Payload.Created, + Timestamp: event.Payload.Timestamp, + Created: time.Now().UnixMilli(), } err := s.gitspaceEventStore.Create(ctx, gitspaceEvent) diff --git a/app/store/database/gitspace_event.go b/app/store/database/gitspace_event.go index de59fb1e7..9cd19901c 100644 --- a/app/store/database/gitspace_event.go +++ b/app/store/database/gitspace_event.go @@ -36,8 +36,9 @@ const ( geven_event, geven_created, geven_entity_type, - geven_entity_uid, - geven_entity_id + geven_query_key, + geven_entity_id, + geven_timestamp ` gitspaceEventsColumnsWithID = gitspaceEventIDColumn + `, ` + gitspaceEventsColumns @@ -53,8 +54,9 @@ type gitspaceEvent struct { Event enum.GitspaceEventType `db:"geven_event"` Created int64 `db:"geven_created"` EntityType enum.GitspaceEntityType `db:"geven_entity_type"` - QueryKey string `db:"geven_entity_uid"` // TODO: change to query_key + QueryKey string `db:"geven_query_key"` EntityID int64 `db:"geven_entity_id"` + Timestamp int64 `db:"geven_timestamp"` } func NewGitspaceEventStore(db *sqlx.DB) store.GitspaceEventStore { @@ -73,7 +75,7 @@ func (g gitspaceEventStore) FindLatestByTypeAndGitspaceConfigID( From(gitspaceEventsTable). Where("geven_event = $1", eventType). Where("geven_entity_id = $2", gitspaceConfigID). - OrderBy("geven_created DESC") + OrderBy("geven_timestamp DESC") sql, args, err := stmt.ToSql() if err != nil { return nil, fmt.Errorf("failed to convert squirrel builder to sql: %w", err) @@ -96,6 +98,7 @@ func (g gitspaceEventStore) Create(ctx context.Context, gitspaceEvent *types.Git gitspaceEvent.EntityType, gitspaceEvent.QueryKey, gitspaceEvent.EntityID, + gitspaceEvent.Timestamp, ). Suffix("RETURNING " + gitspaceEventIDColumn) db := dbtx.GetAccessor(ctx, g.db) @@ -161,7 +164,7 @@ func (g gitspaceEventStore) setQueryFilter( filter *types.GitspaceEventFilter, ) squirrel.SelectBuilder { if filter.QueryKey != "" { - stmt = stmt.Where(squirrel.Eq{"geven_entity_uid": filter.QueryKey}) + stmt = stmt.Where(squirrel.Eq{"geven_query_key": filter.QueryKey}) } if filter.EntityType != "" { stmt = stmt.Where(squirrel.Eq{"geven_entity_type": filter.EntityType}) @@ -176,7 +179,7 @@ func (g gitspaceEventStore) setSortFilter( stmt squirrel.SelectBuilder, _ *types.GitspaceEventFilter, ) squirrel.SelectBuilder { - return stmt.OrderBy("geven_created DESC") + return stmt.OrderBy("geven_timestamp DESC") } func (g gitspaceEventStore) setPaginationFilter( @@ -204,5 +207,6 @@ func (g gitspaceEventStore) mapGitspaceEvent(event *gitspaceEvent) *types.Gitspa EntityType: event.EntityType, QueryKey: event.QueryKey, EntityID: event.EntityID, + Timestamp: event.Timestamp, } } diff --git a/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql b/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql new file mode 100644 index 000000000..f1f8b91ed --- /dev/null +++ b/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE gitspace_events RENAME COLUMN geven_query_key to geven_entity_uid; + +ALTER TABLE gitspace_events DROP COLUMN geven_timestamp; \ No newline at end of file diff --git a/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql b/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql new file mode 100644 index 000000000..8c6db80a4 --- /dev/null +++ b/app/store/database/migrate/postgres/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql @@ -0,0 +1,8 @@ +ALTER TABLE gitspace_events RENAME COLUMN geven_entity_uid to geven_query_key; + +ALTER TABLE gitspace_events + ADD COLUMN geven_timestamp BIGINT; +UPDATE gitspace_events +SET geven_timestamp = geven_created * 1000000; +ALTER TABLE gitspace_events + ALTER COLUMN geven_timestamp SET NOT NULL; \ No newline at end of file diff --git a/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql b/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql new file mode 100644 index 000000000..5005fd4a4 --- /dev/null +++ b/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.down.sql @@ -0,0 +1,25 @@ +CREATE TABLE gitspace_events_temp +( + geven_id INTEGER PRIMARY KEY AUTOINCREMENT, + geven_event TEXT NOT NULL, + geven_created BIGINT NOT NULL, + geven_entity_type TEXT NOT NULL, + geven_entity_uid TEXT, + geven_entity_id INTEGER NOT NULL +); + +INSERT INTO gitspace_events_temp (geven_id, geven_event, geven_created, geven_entity_type, geven_entity_uid, + geven_entity_id) +SELECT geven_id, + geven_event, + geven_created, + geven_entity_type, + geven_query_key, + geven_entity_id +FROM gitspace_events; + +DROP TABLE gitspace_events; + +ALTER TABLE gitspace_events_temp RENAME TO gitspace_events; + +CREATE INDEX gitspace_events_entity_id ON gitspace_events (geven_entity_id); \ No newline at end of file diff --git a/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql b/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql new file mode 100644 index 000000000..676ec6fd3 --- /dev/null +++ b/app/store/database/migrate/sqlite/0059_alter_table_gitspace_events_add_timestamp_rename_uid.up.sql @@ -0,0 +1,27 @@ +CREATE TABLE gitspace_events_temp +( + geven_id INTEGER PRIMARY KEY AUTOINCREMENT, + geven_event TEXT NOT NULL, + geven_created BIGINT NOT NULL, + geven_entity_type TEXT NOT NULL, + geven_query_key TEXT, + geven_entity_id INTEGER NOT NULL, + geven_timestamp BIGINT NOT NULL +); + +INSERT INTO gitspace_events_temp (geven_id, geven_event, geven_created, geven_entity_type, geven_query_key, + geven_entity_id, geven_timestamp) +SELECT geven_id, + geven_event, + geven_created, + geven_entity_type, + geven_entity_uid, + geven_entity_id, + geven_created * 1000000 +FROM gitspace_events; + +DROP TABLE gitspace_events; + +ALTER TABLE gitspace_events_temp RENAME TO gitspace_events; + +CREATE INDEX gitspace_events_entity_id ON gitspace_events (geven_entity_id); \ No newline at end of file diff --git a/cli/operations/server/config.go b/cli/operations/server/config.go index 69a604d4b..bb4c93ae3 100644 --- a/cli/operations/server/config.go +++ b/cli/operations/server/config.go @@ -158,6 +158,9 @@ func backfillURLs(config *types.Config) error { } // backfill all external URLs that weren't explicitly overwritten + if config.URL.Base == "" { + config.URL.Base = baseURL.String() + } if config.URL.API == "" { config.URL.API = baseURL.JoinPath("api").String() } @@ -376,13 +379,22 @@ func ProvideJobsConfig(config *types.Config) job.Config { } // ProvideDockerConfig loads config for Docker. -func ProvideDockerConfig(config *types.Config) *infraprovider.DockerConfig { - return &infraprovider.DockerConfig{ - DockerHost: config.Docker.Host, - DockerAPIVersion: config.Docker.APIVersion, - DockerCertPath: config.Docker.CertPath, - DockerTLSVerify: config.Docker.TLSVerify, +func ProvideDockerConfig(config *types.Config) (*infraprovider.DockerConfig, error) { + if config.Docker.MachineHostName == "" { + gitnessBaseURL, err := url.Parse(config.URL.Base) + if err != nil { + return nil, fmt.Errorf("unable to parse Gitness base URL %s: %w", gitnessBaseURL, err) + } + config.Docker.MachineHostName = gitnessBaseURL.Hostname() } + + return &infraprovider.DockerConfig{ + DockerHost: config.Docker.Host, + DockerAPIVersion: config.Docker.APIVersion, + DockerCertPath: config.Docker.CertPath, + DockerTLSVerify: config.Docker.TLSVerify, + DockerMachineHostName: config.Docker.MachineHostName, + }, nil } // ProvideIDEVSCodeWebConfig loads the VSCode Web IDE config from the main config. @@ -394,8 +406,6 @@ func ProvideIDEVSCodeWebConfig(config *types.Config) *container.VSCodeWebConfig // ProvideGitspaceContainerOrchestratorConfig loads the Gitspace container orchestrator config from the main config. func ProvideGitspaceContainerOrchestratorConfig(config *types.Config) (*container.Config, error) { - var bindMountSourceBasePath string - if config.Gitspace.DefaultBindMountSourceBasePath == "" { var homedir string @@ -404,13 +414,18 @@ func ProvideGitspaceContainerOrchestratorConfig(config *types.Config) (*containe return nil, fmt.Errorf("unable to determine home directory: %w", err) } - bindMountSourceBasePath = filepath.Join(homedir, gitnessHomeDir) + config.Gitspace.DefaultBindMountSourceBasePath = filepath.Join(homedir, gitnessHomeDir) + } + + if config.Gitspace.DefaultBindMountSourceBasePathAbsolute == "" { + config.Gitspace.DefaultBindMountSourceBasePathAbsolute = config.Gitspace.DefaultBindMountSourceBasePath } return &container.Config{ - DefaultBaseImage: config.Gitspace.DefaultBaseImage, - DefaultBindMountTargetPath: config.Gitspace.DefaultBindMountTargetPath, - DefaultBindMountSourceBasePath: bindMountSourceBasePath, + DefaultBaseImage: config.Gitspace.DefaultBaseImage, + DefaultBindMountTargetPath: config.Gitspace.DefaultBindMountTargetPath, + DefaultBindMountSourceBasePath: config.Gitspace.DefaultBindMountSourceBasePath, + DefaultBindMountSourceBasePathAbsolute: config.Gitspace.DefaultBindMountSourceBasePathAbsolute, }, nil } diff --git a/cmd/gitness/wire_gen.go b/cmd/gitness/wire_gen.go index 25a0f111e..70e8a3703 100644 --- a/cmd/gitness/wire_gen.go +++ b/cmd/gitness/wire_gen.go @@ -322,9 +322,12 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro keywordsearchController := keywordsearch2.ProvideController(authorizer, searcher, repoController, spaceController) infraProviderResourceStore := database.ProvideInfraProviderResourceStore(db) infraProviderConfigStore := database.ProvideInfraProviderConfigStore(db) - dockerConfig := server.ProvideDockerConfig(config) + dockerConfig, err := server.ProvideDockerConfig(config) + if err != nil { + return nil, err + } dockerClientFactory := infraprovider.ProvideDockerClientFactory(dockerConfig) - dockerProvider := infraprovider.ProvideDockerProvider(dockerClientFactory) + dockerProvider := infraprovider.ProvideDockerProvider(dockerConfig, dockerClientFactory) factory := infraprovider.ProvideFactory(dockerProvider) providerService := infraprovider2.ProvideInfraProvider(infraProviderResourceStore, infraProviderConfigStore, factory, spaceStore, transactor) infraproviderController := infraprovider3.ProvideController(authorizer, spaceStore, providerService) diff --git a/infraprovider/docker_client_factory.go b/infraprovider/docker_client_factory.go index b323464de..f37d5a1dc 100644 --- a/infraprovider/docker_client_factory.go +++ b/infraprovider/docker_client_factory.go @@ -26,13 +26,6 @@ import ( "github.com/docker/go-connections/tlsconfig" ) -type DockerConfig struct { - DockerHost string - DockerAPIVersion string - DockerCertPath string - DockerTLSVerify string -} - type DockerClientFactory struct { config *DockerConfig } diff --git a/infraprovider/docker_config.go b/infraprovider/docker_config.go new file mode 100644 index 000000000..1d127b1da --- /dev/null +++ b/infraprovider/docker_config.go @@ -0,0 +1,23 @@ +// Copyright 2023 Harness, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package infraprovider + +type DockerConfig struct { + DockerHost string + DockerAPIVersion string + DockerCertPath string + DockerTLSVerify string + DockerMachineHostName string +} diff --git a/infraprovider/docker_provider.go b/infraprovider/docker_provider.go index 655e437d6..bce8dc7aa 100644 --- a/infraprovider/docker_provider.go +++ b/infraprovider/docker_provider.go @@ -27,11 +27,13 @@ import ( var _ InfraProvider = (*DockerProvider)(nil) type DockerProvider struct { + config *DockerConfig dockerClientFactory *DockerClientFactory } -func NewDockerProvider(dockerClientFactory *DockerClientFactory) *DockerProvider { +func NewDockerProvider(config *DockerConfig, dockerClientFactory *DockerClientFactory) *DockerProvider { return &DockerProvider{ + config: config, dockerClientFactory: dockerClientFactory, } } @@ -62,6 +64,7 @@ func (d DockerProvider) Provision(ctx context.Context, _ string, params []Parame Identifier: info.ID, ProviderType: enum.InfraProviderTypeDocker, Status: enum.InfraStatusProvisioned, + Host: d.config.DockerMachineHostName, }, nil } diff --git a/infraprovider/wire.go b/infraprovider/wire.go index efc185ce5..a83d0ae9a 100644 --- a/infraprovider/wire.go +++ b/infraprovider/wire.go @@ -25,8 +25,8 @@ var WireSet = wire.NewSet( ProvideDockerClientFactory, ) -func ProvideDockerProvider(dockerClientFactory *DockerClientFactory) *DockerProvider { - return NewDockerProvider(dockerClientFactory) +func ProvideDockerProvider(config *DockerConfig, dockerClientFactory *DockerClientFactory) *DockerProvider { + return NewDockerProvider(config, dockerClientFactory) } func ProvideFactory(dockerProvider *DockerProvider) Factory { diff --git a/types/config.go b/types/config.go index da87d4f80..0e978aeaf 100644 --- a/types/config.go +++ b/types/config.go @@ -385,6 +385,9 @@ type Config struct { CertPath string `envconfig:"GITNESS_DOCKER_CERT_PATH"` // TLSVerify enables or disables TLS verification, off by default. TLSVerify string `envconfig:"GITNESS_DOCKER_TLS_VERIFY"` + // MachineHostName is the public host name of the machine on which the Docker.Host is running. + // If not set, it parses the host from the URL.Base (e.g. localhost from http://localhost:3000). + MachineHostName string `envconfig:"GITNESS_DOCKER_MACHINE_HOST_NAME"` } IDE struct { @@ -406,6 +409,9 @@ type Config struct { // Sub-directories will be created from this eg /gitspace/space1/space2/config1 // If left blank, it will be set to $HOME/.gitness DefaultBindMountSourceBasePath string `envconfig:"GITNESS_GITSPACE_DEFAULT_BIND_MOUNT_SOURCE_BASE_PATH"` + // DefaultBindMountSourceBasePathAbsolute is the source path on which the DefaultBindMountSourceBasePath + // is mounted in Gitness container. If left blank, it will be equal to DefaultBindMountSourceBasePath. + DefaultBindMountSourceBasePathAbsolute string `envconfig:"GITNESS_GITSPACE_DEFAULT_BIND_MOUNT_SOURCE_BASE_PATH_ABSOLUTE"` //nolint:lll Events struct { Concurrency int `envconfig:"GITNESS_GITSPACE_EVENTS_CONCURRENCY" default:"4"` diff --git a/types/gitspace_event.go b/types/gitspace_event.go index 428bf11f0..b8c4fcdbc 100644 --- a/types/gitspace_event.go +++ b/types/gitspace_event.go @@ -22,7 +22,8 @@ type GitspaceEvent struct { EntityID int64 `json:"-"` QueryKey string `json:"query_key,omitempty"` EntityType enum.GitspaceEntityType `json:"entity_type,omitempty"` - Created int64 `json:"timestamp,omitempty"` + Timestamp int64 `json:"timestamp,omitempty"` + Created int64 `json:"created,omitempty"` } type GitspaceEventResponse struct {