Skip to content

Commit ff38e0b

Browse files
committed
fix: linting errors
Signed-off-by: Samuel K <skevetter@pm.me>
1 parent 55424ec commit ff38e0b

File tree

4 files changed

+102
-57
lines changed

4 files changed

+102
-57
lines changed

cmd/agent/workspace/up.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ func contentFolderExists(path string, log log.Logger) (bool, error) {
229229

230230
func createContentFolder(path string, log log.Logger) error {
231231
log.WithFields(logrus.Fields{"path": path}).Debug("create content folder")
232-
if err := os.MkdirAll(path, 0o750); err != nil {
232+
if err := os.MkdirAll(path, 0o755); err != nil {
233233
return fmt.Errorf("make workspace folder: %w", err)
234234
}
235235
return nil
@@ -713,30 +713,49 @@ func tryMergeRootDockerConfig() error {
713713
}
714714

715715
func mergeContainerdSnapshotterConfig(configPath string) error {
716+
existingConfig, err := readExistingConfig(configPath)
717+
if err != nil {
718+
return err
719+
}
720+
721+
features := ensureFeaturesMap(existingConfig)
722+
features["containerd-snapshotter"] = true
723+
724+
return writeConfig(configPath, existingConfig)
725+
}
726+
727+
func readExistingConfig(configPath string) (map[string]any, error) {
716728
existingConfig := make(map[string]any)
729+
// #nosec G304 -- configPath is controlled by the application
717730
data, err := os.ReadFile(configPath)
718731
if err != nil && !errors.Is(err, os.ErrNotExist) {
719-
return fmt.Errorf("read existing config: %w", err)
732+
return nil, fmt.Errorf("read existing config: %w", err)
720733
}
721734

722735
if len(data) > 0 {
723736
if err := json.Unmarshal(data, &existingConfig); err != nil {
724-
return fmt.Errorf("parse existing config: %w", err)
737+
return nil, fmt.Errorf("parse existing config: %w", err)
725738
}
726739
}
740+
return existingConfig, nil
741+
}
727742

728-
features, ok := existingConfig["features"].(map[string]any)
743+
func ensureFeaturesMap(config map[string]any) map[string]any {
744+
features, ok := config["features"].(map[string]any)
729745
if !ok {
730746
features = make(map[string]any)
731-
existingConfig["features"] = features
747+
config["features"] = features
732748
}
733-
features["containerd-snapshotter"] = true
749+
return features
750+
}
734751

735-
mergedData, err := json.MarshalIndent(existingConfig, "", " ")
752+
func writeConfig(configPath string, config map[string]any) error {
753+
mergedData, err := json.MarshalIndent(config, "", " ")
736754
if err != nil {
737755
return fmt.Errorf("marshal config: %w", err)
738756
}
739757

758+
// #nosec G301 -- directory needs to be accessible by docker daemon
740759
if err := os.MkdirAll(filepath.Dir(configPath), 0755); err != nil {
741760
return fmt.Errorf("create config directory: %w", err)
742761
}

e2e/tests/integration/integration.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"os/exec"
8+
"path/filepath"
89

910
"github.com/onsi/ginkgo/v2"
1011
"github.com/skevetter/devpod/e2e/framework"
@@ -27,28 +28,36 @@ var _ = ginkgo.Describe("[integration]: devpod provider ssh test suite", ginkgo.
2728
framework.ExpectNoError(err)
2829
}
2930

30-
_, err := os.Stat(os.Getenv("HOME") + "/.ssh/id_rsa")
31+
homeDir := os.Getenv("HOME")
32+
sshKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa")
33+
sshPubKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa.pub")
34+
35+
_, err := os.Stat(sshKeyPath)
3136
if err != nil {
3237
fmt.Println("generating ssh keys")
33-
cmd := exec.CommandContext(ctx, "ssh-keygen", "-q", "-t", "rsa", "-N", "", "-f", os.Getenv("HOME")+"/.ssh/id_rsa")
38+
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
39+
cmd := exec.CommandContext(ctx, "ssh-keygen", "-q", "-t", "rsa", "-N", "", "-f", sshKeyPath)
3440
err = cmd.Run()
3541
framework.ExpectNoError(err)
3642

37-
cmd = exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", os.Getenv("HOME")+"/.ssh/id_rsa")
43+
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
44+
cmd = exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
3845
output, err := cmd.Output()
3946
framework.ExpectNoError(err)
4047

41-
err = os.WriteFile(os.Getenv("HOME")+"/.ssh/id_rsa.pub", output, 0600)
48+
err = os.WriteFile(sshPubKeyPath, output, 0600)
4249
framework.ExpectNoError(err)
4350
}
4451

45-
cmd := exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", os.Getenv("HOME")+"/.ssh/id_rsa")
52+
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
53+
cmd := exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
4654
publicKey, err := cmd.Output()
4755
framework.ExpectNoError(err)
4856

49-
_, err = os.Stat(os.Getenv("HOME") + "/.ssh/authorized_keys")
57+
authorizedKeysPath := filepath.Join(homeDir, ".ssh", "authorized_keys")
58+
_, err = os.Stat(authorizedKeysPath)
5059
if err != nil {
51-
err = os.WriteFile(os.Getenv("HOME")+"/.ssh/authorized_keys", publicKey, 0600)
60+
err = os.WriteFile(authorizedKeysPath, publicKey, 0600)
5261
framework.ExpectNoError(err)
5362
} else {
5463
f, err := os.OpenFile(os.Getenv("HOME")+"/.ssh/authorized_keys",

pkg/client/clientimplementation/workspace_client.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -521,23 +521,6 @@ func (s *workspaceClient) Command(ctx context.Context, commandOptions client.Com
521521
})
522522
}
523523

524-
func (s *workspaceClient) buildEnvironment(command string) ([]string, error) {
525-
s.m.Lock()
526-
defer s.m.Unlock()
527-
528-
return provider.ToEnvironmentWithBinaries(provider.EnvironmentOptions{
529-
Context: s.workspace.Context,
530-
Workspace: s.workspace,
531-
Machine: s.machine,
532-
Options: s.devPodConfig.ProviderOptions(s.config.Name),
533-
Config: s.config,
534-
ExtraEnv: map[string]string{
535-
provider.CommandEnv: command,
536-
},
537-
Log: s.log,
538-
})
539-
}
540-
541524
func (s *workspaceClient) Status(ctx context.Context, options client.StatusOptions) (client.Status, error) {
542525
s.m.Lock()
543526
defer s.m.Unlock()
@@ -650,6 +633,23 @@ type CommandOptions struct {
650633
Log log.Logger
651634
}
652635

636+
func (s *workspaceClient) buildEnvironment(command string) ([]string, error) {
637+
s.m.Lock()
638+
defer s.m.Unlock()
639+
640+
return provider.ToEnvironmentWithBinaries(provider.EnvironmentOptions{
641+
Context: s.workspace.Context,
642+
Workspace: s.workspace,
643+
Machine: s.machine,
644+
Options: s.devPodConfig.ProviderOptions(s.config.Name),
645+
Config: s.config,
646+
ExtraEnv: map[string]string{
647+
provider.CommandEnv: command,
648+
},
649+
Log: s.log,
650+
})
651+
}
652+
653653
func RunCommandWithBinaries(opts CommandOptions) error {
654654
environ, err := provider.ToEnvironmentWithBinaries(provider.EnvironmentOptions{
655655
Context: opts.Context,

pkg/workspace/provider.go

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,12 @@ func ResolveProvider(providerSource string, log log.Logger) ([]byte, *provider.P
233233
return out, retSource, nil
234234
}
235235

236-
if out, ok, err := resolveURLProvider(providerSource, retSource, log); ok {
237-
if err != nil {
238-
return nil, nil, err
239-
}
240-
return out, retSource, nil
236+
if out, err := tryResolveURLProvider(providerSource, retSource, log); out != nil || err != nil {
237+
return out, retSource, err
241238
}
242239

243-
if out, ok, err := resolveFileProvider(providerSource, retSource); ok {
244-
if err != nil {
245-
return nil, nil, err
246-
}
247-
return out, retSource, nil
240+
if out, err := tryResolveFileProvider(providerSource, retSource); out != nil || err != nil {
241+
return out, retSource, err
248242
}
249243

250244
out, source, err := downloadProviderGithub(providerSource, log)
@@ -258,6 +252,22 @@ func ResolveProvider(providerSource string, log log.Logger) ([]byte, *provider.P
258252
return nil, nil, fmt.Errorf("provider type not recognized: specify a local file, url, or github repository")
259253
}
260254

255+
func tryResolveURLProvider(providerSource string, retSource *provider.ProviderSource, log log.Logger) ([]byte, error) {
256+
out, ok, err := resolveURLProvider(providerSource, retSource, log)
257+
if !ok {
258+
return nil, nil
259+
}
260+
return out, err
261+
}
262+
263+
func tryResolveFileProvider(providerSource string, retSource *provider.ProviderSource) ([]byte, error) {
264+
out, ok, err := resolveFileProvider(providerSource, retSource)
265+
if !ok {
266+
return nil, nil
267+
}
268+
return out, err
269+
}
270+
261271
func downloadProviderGithub(originalPath string, log log.Logger) ([]byte, *provider.ProviderSource, error) {
262272
path := strings.TrimPrefix(originalPath, githubPrefix)
263273

@@ -272,8 +282,10 @@ func downloadProviderGithub(originalPath string, log log.Logger) ([]byte, *provi
272282
if len(splitted) == 1 {
273283
path = providerPrefix + path
274284
} else if len(splitted) != 2 {
275-
// Invalid GitHub path format - expected 'owner/repo' or 'provider-name'
276-
return nil, nil, fmt.Errorf("invalid github path format: expected 'owner/repo' or 'provider-name', got %q", originalPath)
285+
return nil, nil, fmt.Errorf(
286+
"invalid github path format: expected 'owner/repo' or 'provider-name', got %q",
287+
originalPath,
288+
)
277289
}
278290

279291
requestURL := buildGithubURL(path, release)
@@ -403,35 +415,40 @@ func installProvider(
403415
}
404416

405417
func updateProvider(p ProviderParams) (*provider.ProviderConfig, error) {
406-
providerConfig, err := provider.ParseProvider(bytes.NewReader(p.Raw))
418+
providerConfig, err := parseAndValidateProvider(p)
407419
if err != nil {
408420
return nil, err
409421
}
410-
if p.Source == nil {
411-
return nil, fmt.Errorf("provider source is required")
412-
}
413-
414-
providerConfig.Source = *p.Source
415-
if p.ProviderName != "" {
416-
providerConfig.Name = p.ProviderName
417-
}
418-
if providerConfig.Options == nil {
419-
providerConfig.Options = map[string]*types.Option{}
420-
}
421422

422423
cleanupOldOptions(p.DevPodConfig, providerConfig)
423424

424425
if err := config.SaveConfig(p.DevPodConfig); err != nil {
425426
return nil, err
426427
}
427428

428-
if err := downloadProviderBinaries(p, providerConfig); err != nil {
429+
if err := downloadAndSaveProvider(p, providerConfig); err != nil {
429430
return nil, err
430431
}
431432

432-
if err := provider.SaveProviderConfig(p.DevPodConfig.DefaultContext, providerConfig); err != nil {
433+
return providerConfig, nil
434+
}
435+
436+
func parseAndValidateProvider(p ProviderParams) (*provider.ProviderConfig, error) {
437+
providerConfig, err := provider.ParseProvider(bytes.NewReader(p.Raw))
438+
if err != nil {
433439
return nil, err
434440
}
441+
if p.Source == nil {
442+
return nil, fmt.Errorf("provider source is required")
443+
}
444+
445+
providerConfig.Source = *p.Source
446+
if p.ProviderName != "" {
447+
providerConfig.Name = p.ProviderName
448+
}
449+
if providerConfig.Options == nil {
450+
providerConfig.Options = map[string]*types.Option{}
451+
}
435452

436453
return providerConfig, nil
437454
}

0 commit comments

Comments
 (0)