feat: [CDE-472]: make IDE service args typed (#3092)

* feat: [CDE-472]: reduce verbosity of internal installation steps
* feat: [CDE-472]: reduce verbosity of internal installation steps
* feat: [CDE-472]: make IDE service args typed
pull/3597/head
Ansuman Satapathy 2024-12-02 12:04:47 +00:00 committed by Harness
parent 02d3453ddd
commit 04b4dab207
10 changed files with 44 additions and 32 deletions

View File

@ -17,6 +17,7 @@ package common
import (
"context"
"fmt"
"strings"
"github.com/harness/gitness/app/gitspace/orchestrator/devcontainer"
"github.com/harness/gitness/app/gitspace/orchestrator/template"
@ -46,7 +47,7 @@ func ValidateSupportedOS(
templateSupportedOSDistribution, err)
}
gitspaceLogger.Info("Validate supported OSes...")
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
if err != nil {
return fmt.Errorf("error while detecting os distribution: %w", err)
}
@ -93,7 +94,7 @@ func InstallToolsForVsCodeWeb(
gitspaceLogger.Info("Installing tools for vs code web inside container")
gitspaceLogger.Info("Tools installation output...")
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
if err != nil {
return fmt.Errorf("failed to install tools for vs code web: %w", err)
}
@ -117,7 +118,7 @@ func InstallToolsForVsCode(
}
gitspaceLogger.Info("Installing tools for vs code in container")
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
if err != nil {
return fmt.Errorf("failed to install tools for vs code: %w", err)
}
@ -140,7 +141,7 @@ func SetEnv(
templateSetEnv, err)
}
gitspaceLogger.Info("Setting env...")
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, true)
if err != nil {
return fmt.Errorf("error while setting env vars: %w", err)
}
@ -153,13 +154,17 @@ func ExecuteCommandInHomeDirAndLog(
script string,
root bool,
gitspaceLogger types.GitspaceLogger,
verbose bool,
) error {
outputCh := make(chan []byte)
err := exec.ExecuteCommandInHomeDirectory(ctx, script, root, false, outputCh)
for output := range outputCh {
msg := string(output)
// Log output from the command as a string
if len(output) > 0 {
gitspaceLogger.Info(string(output))
if verbose || strings.HasPrefix(msg, devcontainer.LoggerErrorPrefix) {
gitspaceLogger.Info(msg)
}
}
}
return err

View File

@ -197,8 +197,8 @@ func ExtractLifecycleCommands(actionType PostAction, devcontainerConfig types.De
func ExtractIDECustomizations(
ideService ide.IDE,
devcontainerConfig types.DevcontainerConfig,
) map[string]interface{} {
var args = make(map[string]interface{})
) map[gitspaceTypes.IDEArg]interface{} {
var args = make(map[gitspaceTypes.IDEArg]interface{})
if ideService.Type() == enum.IDETypeVSCodeWeb || ideService.Type() == enum.IDETypeVSCode {
if devcontainerConfig.Customizations.ExtractVSCodeSpec() != nil {
args[gitspaceTypes.VSCodeCustomizationArg] = *devcontainerConfig.Customizations.ExtractVSCodeSpec()

View File

@ -146,7 +146,7 @@ func SetupIDE(
ctx context.Context,
exec *devcontainer.Exec,
ideService ide.IDE,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
gitspaceLogger.Info("Setting up IDE inside container: " + string(ideService.Type()))
@ -161,7 +161,7 @@ func RunIDEWithArgs(
ctx context.Context,
exec *devcontainer.Exec,
ideService ide.IDE,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
gitspaceLogger.Info("Running the IDE inside container: " + string(ideService.Type()))

View File

@ -32,6 +32,7 @@ import (
const RootUser = "root"
const ErrMsgTCP = "unable to upgrade to tcp, received 200"
const LoggerErrorPrefix = "ERR>> "
type Exec struct {
ContainerName string
@ -185,7 +186,7 @@ func (e *Exec) streamStdErr(stderr io.Reader, outputCh chan []byte, wg *sync.Wai
defer wg.Done()
stderrReader := bufio.NewScanner(stderr)
for stderrReader.Scan() {
outputCh <- []byte("ERR> " + stderrReader.Text())
outputCh <- []byte(LoggerErrorPrefix + stderrReader.Text())
}
if err := stderrReader.Err(); err != nil {
log.Println("Error reading stderr:", err)

View File

@ -54,7 +54,7 @@ func (g *ServiceImpl) Install(
}
gitspaceLogger.Info("Install git output...")
gitspaceLogger.Info("Setting up git inside container")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, false)
if err != nil {
return fmt.Errorf("failed to setup git: %w", err)
}
@ -79,7 +79,7 @@ func (g *ServiceImpl) SetupCredentials(
}
gitspaceLogger.Info("Setting up git credentials output...")
gitspaceLogger.Info("Setting up git credentials inside container")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger, true)
if err != nil {
return fmt.Errorf("failed to setup git credentials: %w", err)
}
@ -117,7 +117,7 @@ func (g *ServiceImpl) CloneCode(
"failed to generate scipt to clone code from template %s: %w", templateCloneCode, err)
}
gitspaceLogger.Info("Cloning code inside container")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, false, gitspaceLogger, true)
if err != nil {
return fmt.Errorf("failed to clone code: %w", err)
}

View File

@ -29,7 +29,7 @@ type IDE interface {
Setup(
ctx context.Context,
exec *devcontainer.Exec,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error
@ -37,7 +37,7 @@ type IDE interface {
Run(
ctx context.Context,
exec *devcontainer.Exec,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error

View File

@ -51,7 +51,7 @@ func NewVsCodeService(config *VSCodeConfig) *VSCode {
func (v *VSCode) Setup(
ctx context.Context,
exec *devcontainer.Exec,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
osInfoScript := common.GetOSInfoScript()
@ -72,7 +72,7 @@ func (v *VSCode) Setup(
gitspaceLogger.Info("Installing ssh-server inside container")
gitspaceLogger.Info("IDE setup output...")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, sshServerScript, true, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, sshServerScript, true, gitspaceLogger, false)
if err != nil {
return fmt.Errorf("failed to setup SSH serverr: %w", err)
}
@ -85,7 +85,7 @@ func (v *VSCode) Setup(
func (v *VSCode) Run(
ctx context.Context,
exec *devcontainer.Exec,
_ map[string]interface{},
_ map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
payload := template.RunSSHServerPayload{
@ -98,7 +98,7 @@ func (v *VSCode) Run(
"failed to generate scipt to run ssh server from template %s: %w", templateRunSSHServer, err)
}
gitspaceLogger.Info("SSH server run output...")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, runSSHScript, true, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, runSSHScript, true, gitspaceLogger, true)
if err != nil {
return fmt.Errorf("failed to run SSH server: %w", err)
}
@ -120,7 +120,7 @@ func (v *VSCode) Type() enum.IDEType {
}
func (v *VSCode) updateVSCodeSetupPayload(
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
payload *template.SetupSSHServerPayload,
) error {
@ -139,7 +139,7 @@ func (v *VSCode) updateVSCodeSetupPayload(
}
func (v *VSCode) handleVSCodeCustomization(
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
payload *template.SetupSSHServerPayload,
) error {
@ -155,7 +155,8 @@ func (v *VSCode) handleVSCodeCustomization(
}
// Log customization details
gitspaceLogger.Info(fmt.Sprintf("VSCode Customizations %v", vsCodeCustomizationSpecs))
gitspaceLogger.Info(fmt.Sprintf(
"VSCode Customizations : Extensions %v", vsCodeCustomizationSpecs.Extensions))
// Marshal extensions and set payload
jsonData, err := json.Marshal(vsCodeCustomizationSpecs.Extensions)
@ -169,7 +170,7 @@ func (v *VSCode) handleVSCodeCustomization(
}
func (v *VSCode) handleRepoName(
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
payload *template.SetupSSHServerPayload,
) error {
repoName, exists := args[gitspaceTypes.IDERepoNameArg]

View File

@ -63,7 +63,7 @@ func NewVsCodeWebService(config *VSCodeWebConfig) *VSCodeWeb {
func (v *VSCodeWeb) Setup(
ctx context.Context,
exec *devcontainer.Exec,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
gitspaceLogger.Info("Installing VSCode Web inside container...")
@ -131,7 +131,7 @@ func (v *VSCodeWeb) updateMediaContent(ctx context.Context, exec *devcontainer.E
func (v *VSCodeWeb) Run(
ctx context.Context,
exec *devcontainer.Exec,
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
payload := &template.RunVSCodeWebPayload{
@ -164,7 +164,7 @@ func (v *VSCodeWeb) Run(
}
func updateRunPayloadFromArgs(
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
payload *template.RunVSCodeWebPayload,
_ gitspaceTypes.GitspaceLogger,
) error {
@ -180,7 +180,7 @@ func updateRunPayloadFromArgs(
}
func updateSetupPayloadFromArgs(
args map[string]interface{},
args map[gitspaceTypes.IDEArg]interface{},
payload *template.SetupVSCodeWebPayload,
gitspaceLogger gitspaceTypes.GitspaceLogger,
) error {
@ -191,7 +191,8 @@ func updateSetupPayloadFromArgs(
return fmt.Errorf("customization is not of type VSCodeCustomizationSpecs")
}
payload.Extensions = vsCodeCustomizationSpecs.Extensions
gitspaceLogger.Info(fmt.Sprintf("VSCode Customizations %v", vsCodeCustomizationSpecs))
gitspaceLogger.Info(fmt.Sprintf(
"VSCode Customizations: Extensions %v", vsCodeCustomizationSpecs.Extensions))
}
return nil
}

View File

@ -53,7 +53,7 @@ func (u *ServiceImpl) Manage(
}
gitspaceLogger.Info("Configuring user directory and credentials inside container")
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger)
err = common.ExecuteCommandInHomeDirAndLog(ctx, exec, script, true, gitspaceLogger, true)
if err != nil {
return fmt.Errorf("failed to setup user: %w", err)
}

View File

@ -23,9 +23,13 @@ import (
"github.com/rs/zerolog"
)
const VSCodeCustomizationArg = "vscode_customization"
const VSCodeProxyURIArg = "VSCODE_PROXY_URI"
const IDERepoNameArg = "IDE_REPO_NAME"
type IDEArg string
const (
VSCodeCustomizationArg IDEArg = "VSCODE_CUSTOMIZATION"
VSCodeProxyURIArg IDEArg = "VSCODE_PROXY_URI"
IDERepoNameArg IDEArg = "IDE_REPO_NAME"
)
type GitspaceLogger interface {
Info(msg string)