diff --git a/app/gitspace/orchestrator/container/devcontainer_config_utils.go b/app/gitspace/orchestrator/container/devcontainer_config_utils.go index dd88cdf18..5cf2424a7 100644 --- a/app/gitspace/orchestrator/container/devcontainer_config_utils.go +++ b/app/gitspace/orchestrator/container/devcontainer_config_utils.go @@ -195,7 +195,7 @@ func ExtractLifecycleCommands(actionType PostAction, devcontainerConfig types.De } } -func ExtractIDECustomizations( +func AddIDECustomizationsArg( ideService ide.IDE, devcontainerConfig types.DevcontainerConfig, args map[gitspaceTypes.IDEArg]interface{}, @@ -208,7 +208,7 @@ func ExtractIDECustomizations( return args } -func ExtractIDEDownloadURL( +func AddIDEDownloadURLArg( ideService ide.IDE, args map[gitspaceTypes.IDEArg]interface{}, ) map[gitspaceTypes.IDEArg]interface{} { @@ -222,7 +222,7 @@ func ExtractIDEDownloadURL( return args } -func ExtractIDEDirName( +func AddIDEDirNameArg( ideService ide.IDE, args map[gitspaceTypes.IDEArg]interface{}, ) map[gitspaceTypes.IDEArg]interface{} { diff --git a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go index c45ad92e0..8fca3abac 100644 --- a/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go +++ b/app/gitspace/orchestrator/container/embedded_docker_container_orchestrator.go @@ -561,10 +561,10 @@ func (e *EmbeddedDockerOrchestrator) buildSetupSteps( ) error { // Run IDE setup args := make(map[gitspaceTypes.IDEArg]interface{}) - args = ExtractIDECustomizations(ideService, resolvedRepoDetails.DevcontainerConfig, args) + args = AddIDECustomizationsArg(ideService, resolvedRepoDetails.DevcontainerConfig, args) args[gitspaceTypes.IDERepoNameArg] = resolvedRepoDetails.RepoName - args = ExtractIDEDownloadURL(ideService, args) - args = ExtractIDEDirName(ideService, args) + args = AddIDEDownloadURLArg(ideService, args) + args = AddIDEDirNameArg(ideService, args) return ideService.Setup(ctx, exec, args, gitspaceLogger) }, @@ -579,7 +579,7 @@ func (e *EmbeddedDockerOrchestrator) buildSetupSteps( ) error { args := make(map[gitspaceTypes.IDEArg]interface{}) args[gitspaceTypes.IDERepoNameArg] = resolvedRepoDetails.RepoName - args = ExtractIDEDirName(ideService, args) + args = AddIDEDirNameArg(ideService, args) return ideService.Run(ctx, exec, args, gitspaceLogger) }, StopOnFailure: true, diff --git a/app/gitspace/orchestrator/ide/ide.go b/app/gitspace/orchestrator/ide/ide.go index 02ff39bef..4765d0d2c 100644 --- a/app/gitspace/orchestrator/ide/ide.go +++ b/app/gitspace/orchestrator/ide/ide.go @@ -16,6 +16,7 @@ package ide import ( "context" + "strings" "github.com/harness/gitness/app/gitspace/orchestrator/devcontainer" gitspaceTypes "github.com/harness/gitness/app/gitspace/types" @@ -51,4 +52,12 @@ type IDE interface { // Type provides the IDE type to which the service belongs. Type() enum.IDEType + + // GenerateURL returns the url to redirect user to ide from gitspace + GenerateURL(absoluteRepoPath, host, port, user string) string +} + +func getHomePath(absoluteRepoPath string) string { + pathList := strings.Split(absoluteRepoPath, "/") + return strings.Join(pathList[:len(pathList)-1], "/") } diff --git a/app/gitspace/orchestrator/ide/intellij.go b/app/gitspace/orchestrator/ide/intellij.go index 7713affed..eb70cf1f0 100644 --- a/app/gitspace/orchestrator/ide/intellij.go +++ b/app/gitspace/orchestrator/ide/intellij.go @@ -17,6 +17,8 @@ package ide import ( "context" "fmt" + "net/url" + "path" "strconv" "github.com/harness/gitness/app/gitspace/orchestrator/devcontainer" @@ -31,6 +33,8 @@ var _ IDE = (*Intellij)(nil) const ( templateSetupIntellij string = "setup_intellij.sh" templateRunRemoteIDEIntellij string = "run_intellij.sh" + + intellijURLScheme string = "jetbrains-gateway" ) type IntellijConfig struct { @@ -234,6 +238,28 @@ func (ij *Intellij) Port() *types.GitspacePort { } } +// GenerateURL returns the url to redirect user to ide(here to jetbrains gateway application). +func (ij *Intellij) GenerateURL(absoluteRepoPath, host, port, user string) string { + homePath := getHomePath(absoluteRepoPath) + idePath := path.Join(homePath, ".cache", "JetBrains", "RemoteDev", "dist", "intellij") + ideURL := url.URL{ + Scheme: intellijURLScheme, + Host: "", // Empty since we include the host and port in the path + Path: "connect", + Fragment: fmt.Sprintf("idePath=%s&projectPath=%s&host=%s&port=%s&user=%s&type=%s&deploy=%s", + idePath, + absoluteRepoPath, + host, + port, + user, + "ssh", + "false", + ), + } + + return ideURL.String() +} + func (ij *Intellij) Type() enum.IDEType { return enum.IDETypeIntellij } diff --git a/app/gitspace/orchestrator/ide/vscode.go b/app/gitspace/orchestrator/ide/vscode.go index 57a0669ea..e7d475068 100644 --- a/app/gitspace/orchestrator/ide/vscode.go +++ b/app/gitspace/orchestrator/ide/vscode.go @@ -18,7 +18,10 @@ import ( "context" "encoding/json" "fmt" + "net/url" + "path/filepath" "strconv" + "strings" "github.com/harness/gitness/app/gitspace/orchestrator/devcontainer" "github.com/harness/gitness/app/gitspace/orchestrator/utils" @@ -33,6 +36,8 @@ var _ IDE = (*VSCode)(nil) const ( templateSetupVSCodeExtensions string = "setup_vscode_extensions.sh" + + vSCodeURLScheme string = "vscode-remote" ) type VSCodeConfig struct { @@ -223,3 +228,20 @@ func (v *VSCode) handleVSCodeCustomization( return nil } + +// GenerateURL returns the url to redirect user to ide(here to vscode application). +func (v *VSCode) GenerateURL(absoluteRepoPath, host, port, user string) string { + relativeRepoPath := strings.TrimPrefix(absoluteRepoPath, "/") + ideURL := url.URL{ + Scheme: vSCodeURLScheme, + Host: "", // Empty since we include the host and port in the path + Path: fmt.Sprintf( + "ssh-remote+%s@%s:%s", + user, + host, + filepath.Join(port, relativeRepoPath), + ), + } + + return ideURL.String() +} diff --git a/app/gitspace/orchestrator/ide/vscodeweb.go b/app/gitspace/orchestrator/ide/vscodeweb.go index 689d3466c..c3ecd7ea7 100644 --- a/app/gitspace/orchestrator/ide/vscodeweb.go +++ b/app/gitspace/orchestrator/ide/vscodeweb.go @@ -21,6 +21,7 @@ import ( "embed" "fmt" "io" + "net/url" "path/filepath" "strconv" "strings" @@ -52,11 +53,15 @@ type VSCodeWebConfig struct { } type VSCodeWeb struct { - config *VSCodeWebConfig + urlScheme string + config *VSCodeWebConfig } -func NewVsCodeWebService(config *VSCodeWebConfig) *VSCodeWeb { - return &VSCodeWeb{config: config} +func NewVsCodeWebService(config *VSCodeWebConfig, urlScheme string) *VSCodeWeb { + return &VSCodeWeb{ + urlScheme: urlScheme, + config: config, + } } // Setup runs the installScript which downloads the required version of the code-server binary. @@ -267,3 +272,15 @@ func embedToTar(tarWriter *tar.Writer, baseDir, prefix string) error { return nil } + +// GenerateURL returns the url to redirect user to ide(here to another ta). +func (v *VSCodeWeb) GenerateURL(absoluteRepoPath, host, port, _ string) string { + relativeRepoPath := strings.TrimPrefix(absoluteRepoPath, "/") + ideURL := url.URL{ + Scheme: v.urlScheme, + Host: host + ":" + port, + RawQuery: filepath.Join("folder=", relativeRepoPath), + } + + return ideURL.String() +} diff --git a/app/gitspace/orchestrator/ide/wire.go b/app/gitspace/orchestrator/ide/wire.go index f14a27472..5e19e48d5 100644 --- a/app/gitspace/orchestrator/ide/wire.go +++ b/app/gitspace/orchestrator/ide/wire.go @@ -26,7 +26,7 @@ var WireSet = wire.NewSet( ) func ProvideVSCodeWebService(config *VSCodeWebConfig) *VSCodeWeb { - return NewVsCodeWebService(config) + return NewVsCodeWebService(config, "http") } func ProvideVSCodeService(config *VSCodeConfig) *VSCode { diff --git a/app/gitspace/orchestrator/orchestrator_resume.go b/app/gitspace/orchestrator/orchestrator_resume.go index cbc02cc97..5a3474a0c 100644 --- a/app/gitspace/orchestrator/orchestrator_resume.go +++ b/app/gitspace/orchestrator/orchestrator_resume.go @@ -17,17 +17,13 @@ package orchestrator import ( "context" "fmt" - "net/url" - "path" - "path/filepath" "strconv" - "strings" "time" "github.com/harness/gitness/app/gitspace/orchestrator/container" + "github.com/harness/gitness/app/gitspace/orchestrator/ide" "github.com/harness/gitness/app/gitspace/secret" secretenum "github.com/harness/gitness/app/gitspace/secret/enum" - gitspaceTypes "github.com/harness/gitness/app/gitspace/types" "github.com/harness/gitness/app/paths" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" @@ -85,8 +81,6 @@ func (o Orchestrator) ResumeStartGitspace( } } - idePort := ideSvc.Port() - err = o.infraProvisioner.PostInfraEventComplete(ctx, gitspaceConfig, provisionedInfra, enum.InfraEventProvision) if err != nil { o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeInfraProvisioningFailed) @@ -172,7 +166,7 @@ func (o Orchestrator) ResumeStartGitspace( o.emitGitspaceEvent(ctx, gitspaceConfig, enum.GitspaceEventTypeAgentGitspaceCreationCompleted) - ideURLString := generateIDEURL(provisionedInfra, idePort, startResponse, gitspaceConfig) + ideURLString := generateIDEURL(provisionedInfra, ideSvc, startResponse) gitspaceInstance.URL = &ideURLString now := time.Now().UnixMilli() @@ -188,12 +182,10 @@ func (o Orchestrator) ResumeStartGitspace( func generateIDEURL( provisionedInfra types.Infrastructure, - idePort *types.GitspacePort, + ideSvc ide.IDE, startResponse *container.StartResponse, - gitspaceConfig types.GitspaceConfig, ) string { - var ideURL url.URL - + idePort := ideSvc.Port() var forwardedPort string if provisionedInfra.GitspacePortMappings[idePort.Port].PublishedPort == 0 { @@ -202,59 +194,12 @@ func generateIDEURL( forwardedPort = strconv.Itoa(provisionedInfra.GitspacePortMappings[idePort.Port].ForwardedPort) } - scheme := provisionedInfra.GitspaceScheme host := provisionedInfra.GitspaceHost if provisionedInfra.ProxyGitspaceHost != "" { host = provisionedInfra.ProxyGitspaceHost } - relativeRepoPath := strings.TrimPrefix(startResponse.AbsoluteRepoPath, "/") - - switch gitspaceConfig.IDE { - case enum.IDETypeVSCodeWeb: - ideURL = url.URL{ - Scheme: scheme, - Host: host + ":" + forwardedPort, - RawQuery: filepath.Join("folder=", relativeRepoPath), - } - case enum.IDETypeVSCode: - // TODO: the following userID is hard coded and should be changed. - ideURL = url.URL{ - Scheme: gitspaceTypes.VSCodeURLScheme, - Host: "", // Empty since we include the host and port in the path - Path: fmt.Sprintf( - "ssh-remote+%s@%s:%s", - startResponse.RemoteUser, - host, - filepath.Join(forwardedPort, relativeRepoPath), - ), - } - case enum.IDETypeIntellij: - homePath := getHomePath(startResponse.AbsoluteRepoPath) - idePath := path.Join(homePath, ".cache", "JetBrains", "RemoteDev", "dist", "intellij") - ideURL = url.URL{ - Scheme: gitspaceTypes.IntellijURLScheme, - Host: "", // Empty since we include the host and port in the path - Path: "connect", - Fragment: fmt.Sprintf("idePath=%s&projectPath=%s&host=%s&port=%s&user=%s&type=%s&deploy=%s", - idePath, - startResponse.AbsoluteRepoPath, - host, - forwardedPort, - startResponse.RemoteUser, - "ssh", - "false", - ), - } - } - - ideURLString := ideURL.String() - return ideURLString -} - -func getHomePath(absoluteRepoPath string) string { - pathList := strings.Split(absoluteRepoPath, "/") - return strings.Join(pathList[:len(pathList)-1], "/") + return ideSvc.GenerateURL(startResponse.AbsoluteRepoPath, host, forwardedPort, startResponse.RemoteUser) } func (o Orchestrator) getSecretResolver(accessType enum.GitspaceAccessType) (secret.Resolver, error) { diff --git a/app/gitspace/types/types.go b/app/gitspace/types/types.go index 93ee53c51..af387a748 100644 --- a/app/gitspace/types/types.go +++ b/app/gitspace/types/types.go @@ -28,9 +28,6 @@ const ( IDERepoNameArg IDEArg = "IDE_REPO_NAME" IDEDownloadURLArg IDEArg = "IDE_DOWNLOAD_URL" IDEDIRNameArg IDEArg = "IDE_DIR_NAME" - - VSCodeURLScheme string = "vscode-remote" - IntellijURLScheme string = "jetbrains-gateway" ) type GitspaceLogger interface {