Repository: scaleway/scaleway-cli
Pull request #1046 (2020-06-02 12:48:12)

test(init): implement test for init
### Community Note

* Please vote on this pull request by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original pull request comment to help the community and maintainers prioritize this request.
* Please do not leave "+1" or other comments that do not add relevant new information or questions, they generate extra noise for pull request followers and do not help prioritize the request

<!--- Thank you for keeping this note for the community --->

<!--- If your PR fully resolves and should automatically close the linked issue, use Closes. Otherwise, use Relates --->
Relates OR Closes #0000

Release note for [CHANGELOG](https://github.com/scaleway/scaleway-cli/blob/v2/CHANGELOG.md):
<!--
If the change is not user facing, just write "NONE" in the release-note block below.
-->

```release-note

```



Patch:
diff --git a/internal/core/bootstrap.go b/internal/core/bootstrap.go
index 026cdc0d..b4cd3cca 100644
--- a/internal/core/bootstrap.go
+++ b/internal/core/bootstrap.go
@@ -134,13 +134,14 @@ func Bootstrap(config *BootstrapConfig) (exitCode int, result interface{}, err e
 	// Meta store globally available variables like SDK client.
 	// Meta is injected in a context object that will be passed to all commands.
 	meta := &meta{
-		ProfileFlag:  profileName,
-		BinaryName:   config.Args[0],
-		BuildInfo:    config.BuildInfo,
-		Client:       client,
-		Commands:     config.Commands,
-		OverrideEnv:  config.OverrideEnv,
-		OverrideExec: config.OverrideExec,
+		ProfileFlag:    profileName,
+		BinaryName:     config.Args[0],
+		BuildInfo:      config.BuildInfo,
+		Client:         client,
+		Commands:       config.Commands,
+		OverrideEnv:    config.OverrideEnv,
+		OverrideExec:   config.OverrideExec,
+		ConfigPathFlag: configPath,
 
 		stdout:                      config.Stdout,
 		stderr:                      config.Stderr,
@@ -177,7 +178,7 @@ func Bootstrap(config *BootstrapConfig) (exitCode int, result interface{}, err e
 			meta.command == nil ||
 			meta.command.DisableTelemetry ||
 			matomo.IsTelemetryDisabled() {
-			logger.Debugf("skipping telemetry report")
+			logger.Debugf("skipping telemetry report\n")
 			return
 		}
 		matomoErr := matomo.SendCommandTelemetry(&matomo.SendCommandTelemetryRequest{
@@ -186,9 +187,9 @@ func Bootstrap(config *BootstrapConfig) (exitCode int, result interface{}, err e
 			ExecutionTime: time.Since(start),
 		})
 		if matomoErr != nil {
-			logger.Debugf("error during telemetry reporting: %s", matomoErr)
+			logger.Debugf("error during telemetry reporting: %s\n", matomoErr)
 		} else {
-			logger.Debugf("telemetry successfully sent")
+			logger.Debugf("telemetry successfully sent\n")
 		}
 	}()
 
diff --git a/internal/core/context.go b/internal/core/context.go
index 67d637e2..16590e98 100644
--- a/internal/core/context.go
+++ b/internal/core/context.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"io"
 	"os"
+	"path"
 
 	"github.com/scaleway/scaleway-sdk-go/scw"
 )
@@ -105,15 +106,25 @@ func ExtractProfileName(ctx context.Context) string {
 }
 
 func ExtractConfigPath(ctx context.Context) string {
-	if extractMeta(ctx).ConfigPathFlag != "" {
+	meta := extractMeta(ctx)
+	if meta.ConfigPathFlag != "" {
 		return extractMeta(ctx).ConfigPathFlag
 	}
+	// This is only useful for test when we override home environment variable
+	if home := meta.OverrideEnv["HOME"]; home != "" {
+		return path.Join(home, ".config", "scw", "config.yaml")
+	}
 	return scw.GetConfigPath()
 }
 
 func ReloadClient(ctx context.Context) error {
 	var err error
 	meta := extractMeta(ctx)
+	// if client is from bootstrap we are probably running test
+	// if we reload the client we loose the cassette recorder
+	if meta.isClientFromBootstrapConfig {
+		return nil
+	}
 	meta.Client, err = createClient(meta.BuildInfo, "")
 	return err
 }
diff --git a/internal/core/result.go b/internal/core/result.go
index 3759d1a6..ff943778 100644
--- a/internal/core/result.go
+++ b/internal/core/result.go
@@ -6,6 +6,7 @@ import (
 	"strings"
 
 	"github.com/scaleway/scaleway-cli/internal/human"
+	"github.com/scaleway/scaleway-cli/internal/interactive"
 
 	"github.com/fatih/color"
 	"github.com/scaleway/scaleway-cli/internal/terminal"
@@ -41,7 +42,7 @@ func (s *SuccessResult) MarshalHuman() (string, error) {
 	message = "✅ " + terminal.Style(message, color.FgGreen)
 
 	if s.Details != "" {
-		message += s.Details
+		message += "\n" + interactive.Indent(s.Details, 2)
 	}
 
 	return message, nil
diff --git a/internal/interactive/print.go b/internal/interactive/print.go
index fd2742ce..b9bf0eff 100644
--- a/internal/interactive/print.go
+++ b/internal/interactive/print.go
@@ -53,14 +53,12 @@ func Center(str string) string {
 func Indent(str string, indent int) string {
 	padding := makeStr(" ", indent)
 	lines := strings.Split(str, "\n")
-	result := ""
-	for _, line := range lines {
+	for i, line := range lines {
 		if line != "" {
-			line = padding + line
+			lines[i] = padding + line
 		}
-		result += line + "\n"
 	}
-	return result
+	return strings.Join(lines, "\n")
 }
 
 func RemoveIndent(str string) string {
diff --git a/internal/namespaces/account/v2alpha1/custom.go b/internal/namespaces/account/v2alpha1/custom.go
index e1e5d775..56191adb 100644
--- a/internal/namespaces/account/v2alpha1/custom.go
+++ b/internal/namespaces/account/v2alpha1/custom.go
@@ -48,7 +48,7 @@ func InitRun(ctx context.Context, argsI interface{}) (i interface{}, e error) {
 
 	// Early exit if key is not present locally
 	if os.IsNotExist(err) {
-		return nil, sshKeyNotFound(filename, addKeyInstructions)
+		return nil, sshKeyNotFound(shortenedFilename, addKeyInstructions)
 	} else if err != nil {
 		return nil, err
 	}
diff --git a/internal/namespaces/autocomplete/autocomplete.go b/internal/namespaces/autocomplete/autocomplete.go
index 790150bd..da65fac9 100644
--- a/internal/namespaces/autocomplete/autocomplete.go
+++ b/internal/namespaces/autocomplete/autocomplete.go
@@ -34,11 +34,11 @@ type autocompleteScript struct {
 	ShellConfigurationFile map[string]string
 }
 
-var homePath, _ = os.UserHomeDir()
-
 // autocompleteScripts regroups the autocomplete scripts for the different shells
 // The key is the path of the shell.
-func autocompleteScripts(binaryName string) map[string]autocompleteScript {
+func autocompleteScripts(ctx context.Context) map[string]autocompleteScript {
+	binaryName := core.ExtractBinaryName(ctx)
+	homePath := core.ExtractUserHomeDir(ctx)
 	return map[string]autocompleteScript{
 		"bash": {
 			// If `scw` is the first word on the command line,
@@ -143,7 +143,6 @@ func autocompleteInstallCommand() *core.Command {
 func InstallCommandRun(ctx context.Context, argsI interface{}) (i interface{}, e error) {
 	// Warning
 	_, _ = interactive.Println("To enable autocomplete, scw needs to update your shell configuration.")
-	binaryName := core.ExtractBinaryName(ctx)
 
 	// If `shell=` is empty, ask for a value for `shell=`.
 	shellArg := argsI.(*InstallArgs).Shell
@@ -168,7 +167,7 @@ func InstallCommandRun(ctx context.Context, argsI interface{}) (i interface{}, e
 
 	shellName := filepath.Base(shellArg)
 
-	script, exists := autocompleteScripts(binaryName)[shellName]
+	script, exists := autocompleteScripts(ctx)[shellName]
 	if !exists {
 		return nil, unsupportedShellError(shellName)
 	}
@@ -361,9 +360,8 @@ func autocompleteScriptCommand() *core.Command {
 		},
 		ArgsType: reflect.TypeOf(autocompleteShowArgs{}),
 		Run: func(ctx context.Context, argsI interface{}) (i interface{}, e error) {
-			binaryName := core.ExtractBinaryName(ctx)
 			shell := filepath.Base(argsI.(*autocompleteShowArgs).Shell)
-			script, exists := autocompleteScripts(binaryName)[shell]
+			script, exists := autocompleteScripts(ctx)[shell]
 			if !exists {
 				return nil, unsupportedShellError(shell)
 			}
diff --git a/internal/namespaces/feedback/custom.go b/internal/namespaces/feedback/custom.go
index 22ae3fa4..82804a37 100644
--- a/internal/namespaces/feedback/custom.go
+++ b/internal/namespaces/feedback/custom.go
@@ -2,7 +2,6 @@ package feedback
 
 import (
 	"context"
-	"fmt"
 	"reflect"
 
 	"github.com/scaleway/scaleway-cli/internal/core"
@@ -46,7 +45,7 @@ func feedbackBugCommand() *core.Command {
 			}
 			return &core.SuccessResult{
 				Message: "Successfully opened the page",
-				Details: fmt.Sprintf(" (%s)", issue.getURL()),
+				Details: issue.getURL(),
 			}, nil
 		},
 	}
@@ -72,7 +71,7 @@ func feedbackFeatureRequestCommand() *core.Command {
 			}
 			return &core.SuccessResult{
 				Message: "Successfully opened the page",
-				Details: fmt.Sprintf(" (%s)", issue.getURL()),
+				Details: issue.getURL(),
 			}, nil
 		},
 	}
diff --git a/internal/namespaces/init/init.go b/internal/namespaces/init/init.go
index 0fa7eb7e..cbc0ea4b 100644
--- a/internal/namespaces/init/init.go
+++ b/internal/namespaces/init/init.go
@@ -6,6 +6,7 @@ import (
 	"os"
 	"path"
 	"reflect"
+	"strings"
 
 	"github.com/fatih/color"
 	"github.com/scaleway/scaleway-cli/internal/account"
@@ -129,19 +130,18 @@ func initCommand() *core.Command {
 				interactive.Printf("Welcome to the Scaleway Cli\n\n")
 			}
 
-			// Check if a config exists
-			// Actual creation of the new config is done in the Run()
-			config, err := scw.LoadConfig()
+			config, err := scw.LoadConfigFromPath(core.ExtractConfigPath(ctx))
 
 			// If it is not a new config, ask if we want to override the existing config
 			if err == nil && !config.IsEmpty() {
 				_, _ = interactive.PrintlnWithoutIndent(`
-					Current config is located at ` + scw.GetConfigPath() + `
+					Current config is located at ` + core.ExtractConfigPath(ctx) + `
 					` + terminal.Style(fmt.Sprint(config), color.Faint) + `
 				`)
 				overrideConfig, err := interactive.PromptBoolWithConfig(&interactive.PromptBoolConfig{
 					Prompt:       "Do you want to override the current config?",
 					DefaultValue: true,
+					Ctx:          ctx,
 				})
 				if err != nil {
 					return err
@@ -166,6 +166,7 @@ func initCommand() *core.Command {
 			if args.Zone == "" {
 				_, _ = interactive.Println()
 				zone, err := interactive.PromptStringWithConfig(&interactive.PromptStringConfig{
+					Ctx:             ctx,
 					Prompt:          "Select a zone",
 					DefaultValueDoc: "fr-par-1",
 					DefaultValue:    "fr-par-1",
@@ -214,6 +215,7 @@ func initCommand() *core.Command {
 				sendTelemetry, err := interactive.PromptBoolWithConfig(&interactive.PromptBoolConfig{
 					Prompt:       "Do you want to send usage statistics and diagnostics?",
 					DefaultValue: true,
+					Ctx:          ctx,
 				})
 				if err != nil {
 					return err
@@ -230,6 +232,7 @@ func initCommand() *core.Command {
 				`)
 
 				installAutocomplete, err := interactive.PromptBoolWithConfig(&interactive.PromptBoolConfig{
+					Ctx:          ctx,
 					Prompt:       "Do you want to install autocomplete?",
 					DefaultValue: true,
 				})
@@ -242,11 +245,12 @@ func initCommand() *core.Command {
 
 			// Ask whether to remove v1 configuration file if it exists
 			if args.RemoveV1Config == nil {
-				homeDir, err := os.UserHomeDir()
+				homeDir := core.ExtractUserHomeDir(ctx)
 				if err == nil {
 					configPath := path.Join(homeDir, ".scwrc")
 					if _, err := os.Stat(configPath); err == nil {
 						removeV1ConfigFile, err := interactive.PromptBoolWithConfig(&interactive.PromptBoolConfig{
+							Ctx:          ctx,
 							Prompt:       "Do you want to permanently remove old configuration file (" + configPath + ")?",
 							DefaultValue: false,
 						})
@@ -269,7 +273,7 @@ func initCommand() *core.Command {
 			config, err := scw.LoadConfigFromPath(configPath)
 			if err != nil {
 				config = &scw.Config{}
-				interactive.Printf("Creating new config at %v\n", scw.GetConfigPath())
+				interactive.Printf("Creating new config at %s\n", configPath)
 			}
 
 			if args.SendTelemetry != nil {
@@ -306,7 +310,7 @@ func initCommand() *core.Command {
 			}
 
 			// Persist configuration on disk
-			interactive.Printf("Config saved at %s:\n%s\n", scw.GetConfigPath(), terminal.Style(fmt.Sprint(config), color.Faint))
+			interactive.Printf("Config saved at %s:\n%s\n", configPath, terminal.Style(fmt.Sprint(config), color.Faint))
 			err = config.SaveTo(configPath)
 			if err != nil {
 				return nil, err
@@ -317,14 +321,14 @@ func initCommand() *core.Command {
 			if err != nil {
 				return nil, err
 			}
-			successDetails := ""
+			successDetails := []string(nil)
 
 			// Install autocomplete
 			if *args.InstallAutocomplete {
 				_, _ = interactive.Println()
 				_, err := autocomplete.InstallCommandRun(ctx, &autocomplete.InstallArgs{})
 				if err != nil {
-					successDetails += "\n  Except for autocomplete: " + err.Error()
+					successDetails = append(successDetails, "Except for autocomplete: "+err.Error())
 				}
 			}
 
@@ -333,7 +337,7 @@ func initCommand() *core.Command {
 				_, _ = interactive.Println()
 				_, err := accountcommands.InitRun(ctx, nil)
 				if err != nil {
-					successDetails += "\n  Except for SSH key: " + err.Error()
+					successDetails = append(successDetails, "Except for SSH key: "+err.Error())
 				}
 			}
 
@@ -342,7 +346,7 @@ func initCommand() *core.Command {
 				homeDir := core.ExtractUserHomeDir(ctx)
 				err = os.Remove(path.Join(homeDir, ".scwrc"))
 				if err != nil {
-					successDetails += "\n  except for removing old configuration: " + err.Error()
+					successDetails = append(successDetails, "Except for removing old configuration: "+err.Error())
 				}
 			}
 
@@ -350,7 +354,7 @@ func initCommand() *core.Command {
 
 			return &core.SuccessResult{
 				Message: "Initialization completed with success",
-				Details: successDetails,
+				Details: strings.Join(successDetails, "\n"),
 			}, nil
 		},
 	}
@@ -358,6 +362,7 @@ func initCommand() *core.Command {
 
 func promptCredentials(ctx context.Context) (string, error) {
 	UUIDOrEmail, err := interactive.Readline(&interactive.ReadlineConfig{
+		Ctx: ctx,
 		PromptFunc: func(value string) string {
 			secretKey, email := "secret-key", "email"
 			switch {
@@ -440,18 +445,19 @@ func getOrganizationID(ctx context.Context, secretKey string) (string, error) {
 	IDs, err := account.GetOrganizationsIds(ctx, secretKey)
 	if err != nil {
 		logger.Warningf("%v", err)
-		return promptOrganizationID(IDs)
+		return promptOrganizationID(ctx, IDs)
 	}
 	if len(IDs) != 1 {
-		return promptOrganizationID(IDs)
+		return promptOrganizationID(ctx, IDs)
 	}
 	return IDs[0], nil
 }
 
-func promptOrganizationID(IDs []string) (string, error) {
+func promptOrganizationID(ctx context.Context, IDs []string) (string, error) {
 	config := &interactive.PromptStringConfig{
 		Prompt:       "Enter your Organization ID",
 		ValidateFunc: interactive.ValidateOrganizationID(),
+		Ctx:          ctx,
 	}
 	if len(IDs) > 0 {
 		config.DefaultValue = IDs[0]


Test patch:
diff --git a/internal/core/testing.go b/internal/core/testing.go
index 135c4340..4903e64e 100644
--- a/internal/core/testing.go
+++ b/internal/core/testing.go
@@ -131,6 +131,7 @@ type TestConfig struct {
 	BeforeFunc BeforeFunc
 
 	// The command line you want to test
+	// The arguments in this command MUST have only one space between each others to be split successfully
 	// Conflict with Args
 	Cmd string
 
@@ -359,7 +360,7 @@ func Test(config *TestConfig) func(t *testing.T) {
 				Ctx:              ctx,
 				Logger:           log,
 			})
-			require.NoError(t, err, "stdout: %s\nstderr: %s", stdoutBuffer.String(), stderrBuffer.String())
+			require.NoError(t, err, "error executing cmd (%s)\nstdout: %s\nstderr: %s", args, stdoutBuffer.String(), stderrBuffer.String())
 
 			return result
 		}
@@ -441,9 +442,6 @@ func cmdToArgs(meta TestMeta, s string) []string {
 // BeforeFuncCombine combines multiple before functions into one.
 func BeforeFuncCombine(beforeFuncs ...BeforeFunc) BeforeFunc {
 	return func(ctx *BeforeFuncCtx) error {
-		if len(beforeFuncs) < 2 {
-			panic(fmt.Errorf("BeforeFuncCombine must be used to combine more than one BeforeFunc"))
-		}
 		for _, beforeFunc := range beforeFuncs {
 			err := beforeFunc(ctx)
 			if err != nil {
@@ -466,9 +464,6 @@ func BeforeFuncWhenUpdatingCassette(beforeFunc BeforeFunc) BeforeFunc {
 // AfterFuncCombine combines multiple after functions into one.
 func AfterFuncCombine(afterFuncs ...AfterFunc) AfterFunc {
 	return func(ctx *AfterFuncCtx) error {
-		if len(afterFuncs) < 2 {
-			panic(fmt.Errorf("AfterFuncCombine must be used to combine more than one AfterFunc"))
-		}
 		for _, afterFunc := range afterFuncs {
 			err := afterFunc(ctx)
 			if err != nil {
@@ -603,6 +598,7 @@ func getHTTPRecoder(t *testing.T, update bool) (client *http.Client, cleanup fun
 		delete(i.Request.Headers, "x-auth-token")
 		delete(i.Request.Headers, "X-Auth-Token")
 		i.Request.URL = regexp.MustCompile("organization_id=[0-9a-f-]{36}").ReplaceAllString(i.Request.URL, "organization_id=11111111-1111-1111-1111-111111111111")
+		i.Request.URL = regexp.MustCompile(`account\.scaleway\.com/tokens/[0-9a-f-]{36}`).ReplaceAllString(i.Request.URL, "account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111")
 		return nil
 	})
 
diff --git a/internal/namespaces/feedback/testdata/test-feedback-bug-simple.golden b/internal/namespaces/feedback/testdata/test-feedback-bug-simple.golden
index 6c013340..18417b84 100644
--- a/internal/namespaces/feedback/testdata/test-feedback-bug-simple.golden
+++ b/internal/namespaces/feedback/testdata/test-feedback-bug-simple.golden
@@ -1,8 +1,9 @@
 🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
 🟩🟩🟩 STDOUT️ 🟩🟩🟩️
-✅ Successfully opened the page. (https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%3A%0A%0A%23%23+How+to+reproduce%3A%0A%0A%23%23%23+Command+attempted%0A%0A%23%23%23+Expected+Behavior%0A%0A%23%23%23+Actual+Behavior%0A%0A%23%23+More+info%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A&issueTemplate=bug_report.md&labels=bug)
+✅ Successfully opened the page.
+  https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%3A%0A%0A%23%23+How+to+reproduce%3A%0A%0A%23%23%23+Command+attempted%0A%0A%23%23%23+Expected+Behavior%0A%0A%23%23%23+Actual+Behavior%0A%0A%23%23+More+info%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A&issueTemplate=bug_report.md&labels=bug
 🟩🟩🟩 JSON STDOUT 🟩🟩🟩
 {
   "message": "Successfully opened the page",
-  "details": " (https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%3A%0A%0A%23%23+How+to+reproduce%3A%0A%0A%23%23%23+Command+attempted%0A%0A%23%23%23+Expected+Behavior%0A%0A%23%23%23+Actual+Behavior%0A%0A%23%23+More+info%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A\u0026issueTemplate=bug_report.md\u0026labels=bug)"
+  "details": "https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%3A%0A%0A%23%23+How+to+reproduce%3A%0A%0A%23%23%23+Command+attempted%0A%0A%23%23%23+Expected+Behavior%0A%0A%23%23%23+Actual+Behavior%0A%0A%23%23+More+info%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A\u0026issueTemplate=bug_report.md\u0026labels=bug"
 }
diff --git a/internal/namespaces/feedback/testdata/test-feedback-feature-simple.golden b/internal/namespaces/feedback/testdata/test-feedback-feature-simple.golden
index 5c3bc91b..0b61f29f 100644
--- a/internal/namespaces/feedback/testdata/test-feedback-feature-simple.golden
+++ b/internal/namespaces/feedback/testdata/test-feedback-feature-simple.golden
@@ -1,8 +1,9 @@
 🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
 🟩🟩🟩 STDOUT️ 🟩🟩🟩️
-✅ Successfully opened the page. (https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%0A%0A%23%23+How+this+functionality+would+be+exposed%0A%0A%23%23+References%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A&issueTemplate=feature_request.md&labels=enhancement)
+✅ Successfully opened the page.
+  https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%0A%0A%23%23+How+this+functionality+would+be+exposed%0A%0A%23%23+References%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A&issueTemplate=feature_request.md&labels=enhancement
 🟩🟩🟩 JSON STDOUT 🟩🟩🟩
 {
   "message": "Successfully opened the page",
-  "details": " (https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%0A%0A%23%23+How+this+functionality+would+be+exposed%0A%0A%23%23+References%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A\u0026issueTemplate=feature_request.md\u0026labels=enhancement)"
+  "details": "https://github.com/scaleway/scaleway-cli/issues/new?body=%0A%23%23+Description%0A%0A%23%23+How+this+functionality+would+be+exposed%0A%0A%23%23+References%0A%0A%23%23+Version%0A%0Aversion+++++0.0.0%0Abuild-date++unknown%0Ago-version++runtime.Version%28%29%0Agit-branch++unknown%0Agit-commit++unknown%0Ago-arch+++++runtime.GOARCH%0Ago-os+++++++runtime.GOOS%0A\u0026issueTemplate=feature_request.md\u0026labels=enhancement"
 }
diff --git a/internal/namespaces/init/custom_init_autocomplete_test.go b/internal/namespaces/init/custom_init_autocomplete_test.go
new file mode 100644
index 00000000..5439bcad
--- /dev/null
+++ b/internal/namespaces/init/custom_init_autocomplete_test.go
@@ -0,0 +1,198 @@
+package init
+
+import (
+	"io/ioutil"
+	"os"
+	"path"
+	"path/filepath"
+	"runtime"
+	"testing"
+
+	"github.com/scaleway/scaleway-cli/internal/core"
+	"github.com/stretchr/testify/require"
+)
+
+func baseBeforeFunc() core.BeforeFunc {
+	return func(ctx *core.BeforeFuncCtx) error {
+		ctx.Meta["SecretKey"], _ = ctx.Client.GetSecretKey()
+		ctx.Meta["OrganizationID"], _ = ctx.Client.GetDefaultOrganizationID()
+		return nil
+	}
+}
+
+const (
+	linux   = "linux"
+	darwin  = "darwin"
+	windows = "windows"
+)
+
+func Test_InitAutocomplete(t *testing.T) {
+	defaultSettings := map[string]string{
+		"secret-key":       "{{ .SecretKey }}",
+		"organization-id":  "{{ .OrganizationID }}",
+		"send-telemetry":   "false",
+		"remove-v1-config": "false",
+		"with-ssh-key":     "false",
+	}
+
+	runAllShells := func(t *testing.T) {
+		t.Run("Without", core.Test(&core.TestConfig{
+			Commands:   GetCommands(),
+			BeforeFunc: baseBeforeFunc(),
+			Cmd:        appendArgs("scw init install-autocomplete=false", defaultSettings),
+			Check:      core.TestCheckGolden(),
+			TmpHomeDir: true,
+		}))
+
+		t.Run("Zsh", func(t *testing.T) {
+			evalLine := `
+# Scaleway CLI autocomplete initialization.
+eval "$(scw autocomplete script shell=zsh)"
+`
+			core.Test(&core.TestConfig{
+				Commands:   GetCommands(),
+				BeforeFunc: baseBeforeFunc(),
+				Cmd:        appendArgs("scw init install-autocomplete=true", defaultSettings),
+				Check: core.TestCheckCombine(
+					core.TestCheckGolden(),
+					func(t *testing.T, ctx *core.CheckFuncCtx) {
+						if runtime.GOOS == windows {
+							// autocomplete installation is not yet supported on windows
+							return
+						}
+						homeDir := ctx.OverrideEnv["HOME"]
+						filePath := path.Join(homeDir, ".zshrc")
+						fileContent, err := ioutil.ReadFile(filePath)
+						require.NoError(t, err)
+						require.Equal(t, evalLine, string(fileContent))
+					},
+				),
+				TmpHomeDir: true,
+				OverrideEnv: map[string]string{
+					"SHELL": "/usr/local/bin/zsh",
+				},
+				PromptResponseMocks: []string{
+					// What type of shell are you using
+					"zsh",
+					// Do you want to proceed with these changes? (Y/n):
+					"yes",
+				},
+			})(t)
+		})
+
+		t.Run("fish", func(t *testing.T) {
+			evalLine := `
+# Scaleway CLI autocomplete initialization.
+eval (scw autocomplete script shell=fish)
+`
+			core.Test(&core.TestConfig{
+				Commands: GetCommands(),
+				BeforeFunc: core.BeforeFuncCombine(
+					func(ctx *core.BeforeFuncCtx) error {
+						homeDir := ctx.OverrideEnv["HOME"]
+						configPath := path.Join(homeDir, ".config", "fish", "config.fish")
+
+						// Ensure the subfolders for the configuration files are all created
+						err := os.MkdirAll(filepath.Dir(configPath), 0755)
+						if err != nil {
+							return err
+						}
+						return nil
+					},
+					baseBeforeFunc(),
+				),
+				Cmd: appendArgs("scw init install-autocomplete=true", defaultSettings),
+				Check: core.TestCheckCombine(
+					core.TestCheckGolden(),
+					func(t *testing.T, ctx *core.CheckFuncCtx) {
+						if runtime.GOOS == windows {
+							// autocomplete installation is not yet supported on windows
+							return
+						}
+						homeDir := ctx.OverrideEnv["HOME"]
+						filePath := path.Join(homeDir, ".config", "fish", "config.fish")
+						fileContent, err := ioutil.ReadFile(filePath)
+						require.NoError(t, err)
+						require.Equal(t, evalLine, string(fileContent))
+					},
+				),
+				TmpHomeDir: true,
+				OverrideEnv: map[string]string{
+					"SHELL": "/usr/local/bin/fish",
+				},
+				PromptResponseMocks: []string{
+					// What type of shell are you using
+					"fish",
+					// Do you want to proceed with these changes? (Y/n):
+					"yes",
+				},
+			})(t)
+		})
+
+		t.Run("bash", func(t *testing.T) {
+			evalLine := `
+# Scaleway CLI autocomplete initialization.
+eval "$(scw autocomplete script shell=bash)"
+`
+			core.Test(&core.TestConfig{
+				Commands:   GetCommands(),
+				BeforeFunc: baseBeforeFunc(),
+				Cmd:        appendArgs("scw init install-autocomplete=true", defaultSettings),
+				Check: core.TestCheckCombine(
+					core.TestCheckGolden(),
+					func(t *testing.T, ctx *core.CheckFuncCtx) {
+						homeDir := ctx.OverrideEnv["HOME"]
+						filePath := ""
+						switch runtime.GOOS {
+						case linux:
+							filePath = path.Join(homeDir, ".bashrc")
+						case darwin:
+							filePath = path.Join(homeDir, ".bash_profile")
+						case windows:
+							// autocomplete installation is not yet supported on windows
+							return
+						default:
+							t.Fatalf("unsupported OS")
+						}
+						fileContent, err := ioutil.ReadFile(filePath)
+						if err != nil {
+							require.NoError(t, err)
+						}
+						require.Equal(t, evalLine, string(fileContent))
+					},
+				),
+				TmpHomeDir: true,
+				OverrideEnv: map[string]string{
+					"SHELL": "/usr/local/bin/bash",
+				},
+				PromptResponseMocks: []string{
+					// What type of shell are you using
+					"bash",
+					// Do you want to proceed with these changes? (Y/n):
+					"yes",
+				},
+			})(t)
+		})
+	}
+
+	t.Run(darwin, func(t *testing.T) {
+		if runtime.GOOS != darwin {
+			t.SkipNow()
+		}
+		runAllShells(t)
+	})
+
+	t.Run(linux, func(t *testing.T) {
+		if runtime.GOOS != linux {
+			t.SkipNow()
+		}
+		runAllShells(t)
+	})
+
+	t.Run(windows, func(t *testing.T) {
+		if runtime.GOOS != windows {
+			t.SkipNow()
+		}
+		runAllShells(t)
+	})
+}
diff --git a/internal/namespaces/init/custom_init_ssh_test.go b/internal/namespaces/init/custom_init_ssh_test.go
new file mode 100644
index 00000000..53a31bd0
--- /dev/null
+++ b/internal/namespaces/init/custom_init_ssh_test.go
@@ -0,0 +1,121 @@
+package init
+
+import (
+	"io/ioutil"
+	"os"
+	"path"
+	"path/filepath"
+	"testing"
+
+	"github.com/scaleway/scaleway-cli/internal/core"
+	account "github.com/scaleway/scaleway-cli/internal/namespaces/account/v2alpha1"
+	accountsdk "github.com/scaleway/scaleway-sdk-go/api/account/v2alpha1"
+	"github.com/scaleway/scaleway-sdk-go/scw"
+)
+
+func setUpSSHKeyLocally(key string) core.BeforeFunc {
+	return func(ctx *core.BeforeFuncCtx) error {
+		homeDir := ctx.OverrideEnv["HOME"]
+		// TODO we persist the key as ~/.ssh/id_rsa.pub regardless of the type of key it is (rsa, ed25519)
+		keyPath := path.Join(homeDir, ".ssh", "id_rsa.pub")
+		ctx.Logger.Info("public key path set to: ", keyPath)
+
+		// Ensure the subfolders for the configuration files are all created
+		err := os.MkdirAll(filepath.Dir(keyPath), 0755)
+		if err != nil {
+			return err
+		}
+
+		// Write the configuration file
+		err = ioutil.WriteFile(keyPath, []byte(key), 0600)
+		if err != nil {
+			return err
+		}
+		return nil
+	}
+}
+
+func removeSSHKeyFromAccount(publicSSHKey string) core.AfterFunc {
+	return func(ctx *core.AfterFuncCtx) error {
+		api := accountsdk.NewAPI(ctx.Client)
+		resp, err := api.ListSSHKeys(&accountsdk.ListSSHKeysRequest{},
+			scw.WithAllPages())
+		if err != nil {
+			return err
+		}
+		id := ""
+		for _, v := range resp.SSHKeys {
+			if v.PublicKey == publicSSHKey {
+				id = v.ID
+			}
+		}
+		if id != "" {
+			err = api.DeleteSSHKey(&accountsdk.DeleteSSHKeyRequest{SSHKeyID: id})
+		}
+		return err
+	}
+}
+
+// add an ssh key with a given meta key
+func addSSHKeyToAccount(metaKey string, name string, key string) core.BeforeFunc {
+	return func(ctx *core.BeforeFuncCtx) error {
+		cmd := []string{
+			"scw", "account", "ssh-key", "add", "public-key=" + key, "name=" + name,
+		}
+		ctx.Meta[metaKey] = ctx.ExecuteCmd(cmd)
+		return nil
+	}
+}
+
+func Test_InitSSH(t *testing.T) {
+	defaultSettings := map[string]string{
+		"secret-key":           "{{ .SecretKey }}",
+		"organization-id":      "{{ .OrganizationID }}",
+		"send-telemetry":       "false",
+		"remove-v1-config":     "false",
+		"install-autocomplete": "false",
+	}
+	cmds := GetCommands()
+	cmds.Merge(account.GetCommands())
+
+	// We create a key in each tests to be able to run those tests in parallel
+
+	t.Run("KeyRegistered", func(t *testing.T) {
+		dummySSHKey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICd8ZxAm9mXQsRHhQ5iADEJuO+Ai8EbXMI7TIlsh9jbE foobar@foobar"
+		core.Test(&core.TestConfig{
+			Commands: cmds,
+			BeforeFunc: core.BeforeFuncCombine(
+				baseBeforeFunc(),
+				setUpSSHKeyLocally(dummySSHKey),
+				addSSHKeyToAccount("key", "test-cli-KeyRegistered", dummySSHKey),
+			),
+			Cmd:        appendArgs("scw init with-ssh-key=true", defaultSettings),
+			Check:      core.TestCheckGolden(),
+			AfterFunc:  removeSSHKeyFromAccount(dummySSHKey),
+			TmpHomeDir: true,
+		})(t)
+	})
+
+	t.Run("KeyUnregistered", func(t *testing.T) {
+		dummySSHKey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIQE67HxSRicWd4ol7ntM2jdeD/qEehPJxK/3thmMiZg foobar@foobar"
+		core.Test(&core.TestConfig{
+			Commands: cmds,
+			BeforeFunc: core.BeforeFuncCombine(
+				baseBeforeFunc(),
+				setUpSSHKeyLocally(dummySSHKey),
+			),
+			Cmd:        appendArgs("scw init with-ssh-key=true", defaultSettings),
+			Check:      core.TestCheckGolden(),
+			TmpHomeDir: true,
+			AfterFunc:  removeSSHKeyFromAccount(dummySSHKey),
+		})(t)
+	})
+
+	t.Run("NoLocalKey", core.Test(&core.TestConfig{
+		Commands:   cmds,
+		BeforeFunc: baseBeforeFunc(),
+		Cmd:        appendArgs("scw init with-ssh-key=true", defaultSettings),
+		Check:      core.TestCheckGolden(),
+		TmpHomeDir: true,
+	}))
+}
diff --git a/internal/namespaces/init/init_test.go b/internal/namespaces/init/init_test.go
index d78b17e4..a314d251 100644
--- a/internal/namespaces/init/init_test.go
+++ b/internal/namespaces/init/init_test.go
@@ -1,38 +1,157 @@
 package init
 
-//func TestInit(t *testing.T) {
-//	t.Run("Simple", func(t *testing.T) {
-//		ctx := context.Background()
-//		// httpClient, cleanup := createHttpRecoder(t, cassetName)
-//		// defer cleanup()
-//		// ctx = accont.InjectHttpClient(httpClient)
-//
-//		//ctx = interactive.InjectMockResponseToContext(ctx, []string{
-//		//	"yes",
-//		//	"no",
-//		//})
-//
-//		core.Test(&core.TestConfig{
-//			Ctx: ctx,
-//			PromptResponseMocks: []string{
-//				"yes",
-//				"no",
-//			},
-//			TmpHomeDir: true,
-//			Cmd:        "scw -c {{ .TmpHomeDir }}/config.yml init",
-//			BeforeFunc: func(ctx *core.BeforeFuncCtx) error {
-//				//homeDir := ctx.Meta["TmpHomeDir"].(string)
-//				// Write fake config file
-//				return nil
-//			},
-//			Check: core.TestCheckCombine(
-//				core.TestCheckExitCode(0),
-//				core.TestCheckGolden(),
-//				func(t *testing.T, ctx *core.CheckFuncCtx) {
-//					//homeDir := ctx.Meta["TmpHomeDir"].(string)
-//					// Check config file is correct
-//				}),
-//		})(t)
-//
-//	})
-//}
+import (
+	"fmt"
+	"path"
+	"testing"
+
+	"github.com/alecthomas/assert"
+	"github.com/scaleway/scaleway-cli/internal/core"
+	"github.com/scaleway/scaleway-sdk-go/scw"
+	"github.com/stretchr/testify/require"
+)
+
+func checkConfig(check func(t *testing.T, ctx *core.CheckFuncCtx, config *scw.Config)) core.TestCheck {
+	return func(t *testing.T, ctx *core.CheckFuncCtx) {
+		homeDir := ctx.OverrideEnv["HOME"]
+		config, err := scw.LoadConfigFromPath(path.Join(homeDir, ".config", "scw", "config.yaml"))
+		require.NoError(t, err)
+		check(t, ctx, config)
+	}
+}
+
+func appendArgs(prefix string, args map[string]string) string {
+	cmd := prefix
+	for k, v := range args {
+		cmd += fmt.Sprintf(" %s=%s", k, v)
+	}
+	return cmd
+}
+
+func beforeFuncSaveConfig(config *scw.Config) core.BeforeFunc {
+	return func(ctx *core.BeforeFuncCtx) error {
+		// Persist the dummy Config in the temp directory
+		return config.SaveTo(path.Join(ctx.OverrideEnv["HOME"], ".config", "scw", "config.yaml"))
+	}
+}
+
+func TestInit(t *testing.T) {
+	defaultArgs := map[string]string{
+		"secret-key":           "{{ .SecretKey }}",
+		"organization-id":      "{{ .OrganizationID }}",
+		"send-telemetry":       "true",
+		"install-autocomplete": "false",
+		"remove-v1-config":     "false",
+		"with-ssh-key":         "false",
+	}
+
+	t.Run("Simple", core.Test(&core.TestConfig{
+		Commands:   GetCommands(),
+		BeforeFunc: baseBeforeFunc(),
+		TmpHomeDir: true,
+		Cmd:        appendArgs("scw init", defaultArgs),
+		Check: core.TestCheckCombine(
+			core.TestCheckGolden(),
+			checkConfig(func(t *testing.T, ctx *core.CheckFuncCtx, config *scw.Config) {
+				secretKey, _ := ctx.Client.GetSecretKey()
+				assert.Equal(t, secretKey, *config.SecretKey)
+			}),
+		),
+	}))
+
+	t.Run("Configuration Path", core.Test(&core.TestConfig{
+		Commands: GetCommands(),
+		BeforeFunc: core.BeforeFuncCombine(
+			baseBeforeFunc(),
+			func(ctx *core.BeforeFuncCtx) error {
+				ctx.Meta["CONFIG_PATH"] = path.Join(ctx.Meta["HOME"].(string), "new_config_path.yml")
+				return nil
+			},
+		),
+		TmpHomeDir: true,
+		Cmd:        appendArgs("scw -c {{ .CONFIG_PATH }} init", defaultArgs),
+		Check: core.TestCheckCombine(
+			core.TestCheckGolden(),
+			func(t *testing.T, ctx *core.CheckFuncCtx) {
+				config, err := scw.LoadConfigFromPath(ctx.Meta["CONFIG_PATH"].(string))
+				require.NoError(t, err)
+				secretKey, _ := ctx.Client.GetSecretKey()
+				assert.Equal(t, secretKey, *config.SecretKey)
+			},
+		),
+	}))
+
+	t.Run("Profile", core.Test(&core.TestConfig{
+		Commands:   GetCommands(),
+		BeforeFunc: baseBeforeFunc(),
+		Cmd:        appendArgs("scw -p foobar init", defaultArgs),
+		Check: core.TestCheckCombine(
+			core.TestCheckGolden(),
+			checkConfig(func(t *testing.T, ctx *core.CheckFuncCtx, config *scw.Config) {
+				secretKey, _ := ctx.Client.GetSecretKey()
+				assert.Equal(t, secretKey, *config.Profiles["foobar"].SecretKey)
+			}),
+		),
+		TmpHomeDir: true,
+	}))
+
+	t.Run("CLIv2Config", func(t *testing.T) {
+		dummySecretKey := "22222222-2222-2222-2222-222222222222"
+		dummyAccessKey := "SCW22222222222222222"
+		dummyConfig := &scw.Config{
+			Profile: scw.Profile{
+				AccessKey: &dummyAccessKey,
+				SecretKey: &dummySecretKey,
+			},
+			Profiles: map[string]*scw.Profile{
+				"test": {
+					AccessKey: &dummyAccessKey,
+					SecretKey: &dummySecretKey,
+				},
+			},
+		}
+
+		t.Run("NoOverwrite", core.Test(&core.TestConfig{
+			Commands: GetCommands(),
+			BeforeFunc: core.BeforeFuncCombine(
+				baseBeforeFunc(),
+				beforeFuncSaveConfig(dummyConfig),
+			),
+			Cmd: appendArgs("scw init", defaultArgs),
+			Check: core.TestCheckCombine(
+				core.TestCheckGolden(),
+				checkConfig(func(t *testing.T, ctx *core.CheckFuncCtx, config *scw.Config) {
+					assert.Equal(t, dummyConfig.String(), config.String())
+				}),
+			),
+			TmpHomeDir: true,
+			PromptResponseMocks: []string{
+				// Do you want to override the current config?
+				"no",
+			},
+		}))
+
+		t.Run("Overwrite", core.Test(&core.TestConfig{
+			Commands: GetCommands(),
+			BeforeFunc: core.BeforeFuncCombine(
+				baseBeforeFunc(),
+				beforeFuncSaveConfig(dummyConfig),
+			),
+			Cmd: appendArgs("scw init", defaultArgs),
+			Check: core.TestCheckCombine(
+				core.TestCheckGolden(),
+				checkConfig(func(t *testing.T, ctx *core.CheckFuncCtx, config *scw.Config) {
+					secretKey, _ := ctx.Client.GetSecretKey()
+					organizationID, _ := ctx.Client.GetDefaultOrganizationID()
+					assert.Equal(t, secretKey, *config.SecretKey)
+					assert.Equal(t, organizationID, *config.DefaultOrganizationID)
+				}),
+			),
+			TmpHomeDir: true,
+			PromptResponseMocks: []string{
+				// Do you want to override the current config?
+				"yes",
+			},
+		}))
+	})
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.cassette.yaml
new file mode 100644
index 00000000..b53e3d5f
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:46:15 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.golden b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-bash.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.cassette.yaml
new file mode 100644
index 00000000..b53e3d5f
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:46:15 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.golden b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-fish.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.cassette.yaml
new file mode 100644
index 00000000..b53e3d5f
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:46:15 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.golden b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-without.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.cassette.yaml
new file mode 100644
index 00000000..b53e3d5f
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:46:15 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.golden b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-darwin-zsh.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.cassette.yaml
new file mode 100644
index 00000000..a4809c5d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:08:49 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.golden b/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-bash.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.cassette.yaml
new file mode 100644
index 00000000..a4809c5d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:08:49 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.golden b/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-fish.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.cassette.yaml
new file mode 100644
index 00000000..a4809c5d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:08:49 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.golden b/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-without.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.cassette.yaml
new file mode 100644
index 00000000..a4809c5d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:08:49 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.golden b/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-linux-zsh.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.cassette.yaml
new file mode 100644
index 00000000..2a339c7d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:19:31 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.golden b/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.golden
new file mode 100644
index 00000000..a44dbf42
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-bash.golden
@@ -0,0 +1,9 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+  Except for autocomplete: unsupported OS 'windows'
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": "Except for autocomplete: unsupported OS 'windows'"
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.cassette.yaml
new file mode 100644
index 00000000..2a339c7d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:19:31 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.golden b/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.golden
new file mode 100644
index 00000000..a44dbf42
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-fish.golden
@@ -0,0 +1,9 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+  Except for autocomplete: unsupported OS 'windows'
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": "Except for autocomplete: unsupported OS 'windows'"
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.cassette.yaml
new file mode 100644
index 00000000..2a339c7d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:19:31 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.golden b/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-without.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.cassette.yaml b/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.cassette.yaml
new file mode 100644
index 00000000..2a339c7d
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 15:19:31 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.golden b/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.golden
new file mode 100644
index 00000000..a44dbf42
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-autocomplete-windows-zsh.golden
@@ -0,0 +1,9 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+  Except for autocomplete: unsupported OS 'windows'
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": "Except for autocomplete: unsupported OS 'windows'"
+}
diff --git a/internal/namespaces/init/testdata/test-init-cl-iv2-config-no-overwrite.golden b/internal/namespaces/init/testdata/test-init-cl-iv2-config-no-overwrite.golden
new file mode 100644
index 00000000..f5a59a55
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-cl-iv2-config-no-overwrite.golden
@@ -0,0 +1,7 @@
+🎲🎲🎲 EXIT CODE: 1 🎲🎲🎲
+🟥🟥🟥 STDERR️️ 🟥🟥🟥️
+Initialization canceled
+🟥🟥🟥 JSON STDERR 🟥🟥🟥
+{
+  "error": "initialization canceled"
+}
diff --git a/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.cassette.yaml b/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.cassette.yaml
new file mode 100644
index 00000000..a5416b77
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCWV1KBG4XV8BM4Y5T2T", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T08:21:54.096455+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:04:18 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.golden b/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-cl-iv2-config-overwrite.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-configuration-path.cassette.yaml b/internal/namespaces/init/testdata/test-init-configuration-path.cassette.yaml
new file mode 100644
index 00000000..a5416b77
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-configuration-path.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCWV1KBG4XV8BM4Y5T2T", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T08:21:54.096455+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:04:18 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-configuration-path.golden b/internal/namespaces/init/testdata/test-init-configuration-path.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-configuration-path.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-profile.cassette.yaml b/internal/namespaces/init/testdata/test-init-profile.cassette.yaml
new file mode 100644
index 00000000..a5416b77
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-profile.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCWV1KBG4XV8BM4Y5T2T", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T08:21:54.096455+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:04:18 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-profile.golden b/internal/namespaces/init/testdata/test-init-profile.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-profile.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-simple.cassette.yaml b/internal/namespaces/init/testdata/test-init-simple.cassette.yaml
new file mode 100644
index 00000000..a5416b77
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-simple.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCWV1KBG4XV8BM4Y5T2T", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T08:21:54.096455+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:04:18 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-simple.golden b/internal/namespaces/init/testdata/test-init-simple.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-simple.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-ssh-key-registered.cassette.yaml b/internal/namespaces/init/testdata/test-init-ssh-key-registered.cassette.yaml
new file mode 100644
index 00000000..42bf6317
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-key-registered.cassette.yaml
@@ -0,0 +1,190 @@
+---
+version: 1
+interactions:
+- request:
+    body: '{"name":"test-cli-KeyRegistered","public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICd8ZxAm9mXQsRHhQ5iADEJuO+Ai8EbXMI7TIlsh9jbE
+      foobar@foobar","organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}'
+    form: {}
+    headers:
+      Content-Type:
+      - application/json
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys
+    method: POST
+  response:
+    body: '{"id":"33ece97d-d6b7-4d4b-b213-15d4a8ee2eb9","name":"test-cli-KeyRegistered","public_key":"ssh-ed25519
+      AAAAC3NzaC1lZDI1NTE5AAAAICd8ZxAm9mXQsRHhQ5iADEJuO+Ai8EbXMI7TIlsh9jbE foobar@foobar","fingerprint":"256
+      MD5:2e:c9:d3:87:1c:04:5f:c8:86:0c:08:4d:34:3f:ff:4c foobar@foobar (ssh-ed25519)","created_at":"2020-06-10T13:57:05.192946Z","updated_at":"2020-06-23T16:10:02.923550Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}'
+    headers:
+      Content-Length:
+      - "495"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 16:10:02 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 193db62a-b30d-4be9-ae59-6ada1deddff6
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 16:10:03 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys?order_by=created_at_asc&page=1
+    method: GET
+  response:
+    body: '{"ssh_keys":[{"id":"9bf6c340-687c-4f31-8aad-6a525761d8cd","name":"sieben-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAACAQDZrUk+hFs8hYZVu6PVzXIZH83glJfiqZU7gzxw9zSkinCNHZnJ0KViZmol/XUEvGPu0toWOnM5t9MUVRq3xMldo6TKOZ7tvqBDoYD/hMHSBZb+b5f12l7i43wV7dunypy+nKtlb+rv9YJdMdbVaXy29K5EPaQujYTZTvXFEB9b8P0NXt0jA+qsUEf6/TK7dONdh2PFrUFiLXtNxkw21n/q6JGfR78etQ3mIaDKffjoVYHKgMv2edGWpjAkZeM5eBg6U6kb7CMMstpxPfOPADkXu4hbWhMGG5TC4tuizfq8YAeE8t2nyfB+xq8MtQe5jTPLK1/B+NVuKvp+3WLDSrai6dbsMpFsZDXJL34BkoY7XsRf8FeaPiy5Z3ScD6YLTl986rztAPyLCKJrfPSSc2tAOgne9cGFVUPS+tehqtW+VPeD4qu00h7H9hX/x+hefqYL5cfS3h/qgpcUFw+69rVK6r1zcBwJyJAI9gUQ08628iirYku3KkUQ0VdlavrYYfB9wyStQ4VBUYpXKMhKgk5gCRRkEuJ2gETffj+nLZAqL13yFPm8lCOgRztp06S+K9Xq/cYVvAnDh8R2IsBGbs4KmpKMM7PA7mYf3XMI1KzAWXqc6RCv1a+PUwMK/AIKqnk040n2Q0yxuJSOufcVE6mWxVywHag9Ucww1FuSR54i7w==
+      rleone@scaleway.com","fingerprint":"4096 MD5:43:ba:7c:ec:66:6b:cc:fe:02:91:04:29:32:19:30:bf
+      rleone@scaleway.com (ssh-rsa)","created_at":"2019-05-02T08:26:01.304954Z","updated_at":"2020-05-13T22:32:46.471097Z","creation_info":{"address":"195.154.228.158","user_agent":"ansible
+      2.7.0.dev0 Python 2.7.16","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"cffa1bb1-57f0-4ad8-be20-f335df743b27","name":"juliencastets-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiV5DEMsYihbdS3kCJwzSBLgGO7L2j5z2/9+HVbJbzDvAz0HcUQ+sKOlvzEUzDgtNKNP+zs7C9sMcDKKUPsVzx2jpZgGN0hP9taDzWuMX+A4B4CBftTQHtZBV8dg+EVeI5Xv6HmY/WtAWC1Xfb8mvz5z+a/8D0u9IVURqiZy/n8moQwhjpK9+m634GorgMwduMZX1pPskSVL1m2ocaP8NFq8oV9L6zf9kSi7/Jwgci1TTsGYGsRSbpc665nP7MgyxZqpP0oQK8f6VW1ndFjsSgE1fT83/1WH8ro2Ou0Esh/FTs0Wxt2A5vIShYJIO+o680rNjbIhoWHLg5tU9+ip1
+      macbook","fingerprint":"2048 MD5:00:43:dc:7f:26:64:70:a2:b9:cd:06:77:35:f2:f6:f6
+      macbook (ssh-rsa)","created_at":"2020-02-26T12:46:58.241993Z","updated_at":"2020-02-26T12:46:58.241993Z","creation_info":{"address":"195.154.229.35","user_agent":"Mozilla/5.0
+      (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130
+      Safari/537.36","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"d4eb532f-b59a-4f9d-b079-e6082bc46016","name":"oss_exporter","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABgQDHuJH34xHb/1LtKgMlCXN2x6SYc8TQKkevOTGItFfrOf+MCck9Y7Visl7uBD9uQO6e2JBkpG9LWg9HVd5TDMiTxai81CiuuQh9dHq0/UP7VQQMyDS3zWx2gaWX6uuvPuLbza4+yfahFN9LAM8mw/uGplJBDljJbvK1TEgP9M2/1hpWUn+qAWLFiNg943ahlVJBPyNIi3EbXJ8cy9GYAhA4GR/8vtH2CdFWokL7AUTF63G+DKC/5DfCqzEsF5PpraIUObZHJ/K7m0otCu3K7kJG0rltyAdxew3FOPAvVZyKyi0ES2avsBCrPtSU89GzqVvdSL09h0W0TzX8agraHwB0Fp21pQW7+o+TWmJ0RToAQA+s4xFH4OFvyc0S3iMB1/A1219ep6CM7EggIhLDn0KJfO92Vhtkl0Z8Uw5qqRVoIsrhriReD5csK6kwUA0fmJAANudjIJgTOCE27462OCeUZK/p0CNgqnkieHdCeFOnIkn5yiGOhV9AkjPHmmLlujs=
+      oss-exporter","fingerprint":"3072 MD5:d8:53:fc:ef:8e:ee:dd:65:3b:fc:e3:a7:96:05:f0:ac
+      oss-exporter (ssh-rsa)","created_at":"2020-05-18T14:06:54.887451Z","updated_at":"2020-05-18T14:12:35.090751Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"32f707c5-df07-43c7-8b57-6e09b687dd03"},{"id":"33ece97d-d6b7-4d4b-b213-15d4a8ee2eb9","name":"test-cli-KeyRegistered","public_key":"ssh-ed25519
+      AAAAC3NzaC1lZDI1NTE5AAAAICd8ZxAm9mXQsRHhQ5iADEJuO+Ai8EbXMI7TIlsh9jbE foobar@foobar","fingerprint":"256
+      MD5:2e:c9:d3:87:1c:04:5f:c8:86:0c:08:4d:34:3f:ff:4c foobar@foobar (ssh-ed25519)","created_at":"2020-06-10T13:57:05.192946Z","updated_at":"2020-06-23T16:10:02.923550Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}],"total_count":4}'
+    headers:
+      Content-Length:
+      - "3586"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 16:10:03 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 1372e1b8-2954-4e58-9dc5-e590a26fa1f5
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys?order_by=created_at_asc&page=1
+    method: GET
+  response:
+    body: '{"ssh_keys":[{"id":"9bf6c340-687c-4f31-8aad-6a525761d8cd","name":"sieben-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAACAQDZrUk+hFs8hYZVu6PVzXIZH83glJfiqZU7gzxw9zSkinCNHZnJ0KViZmol/XUEvGPu0toWOnM5t9MUVRq3xMldo6TKOZ7tvqBDoYD/hMHSBZb+b5f12l7i43wV7dunypy+nKtlb+rv9YJdMdbVaXy29K5EPaQujYTZTvXFEB9b8P0NXt0jA+qsUEf6/TK7dONdh2PFrUFiLXtNxkw21n/q6JGfR78etQ3mIaDKffjoVYHKgMv2edGWpjAkZeM5eBg6U6kb7CMMstpxPfOPADkXu4hbWhMGG5TC4tuizfq8YAeE8t2nyfB+xq8MtQe5jTPLK1/B+NVuKvp+3WLDSrai6dbsMpFsZDXJL34BkoY7XsRf8FeaPiy5Z3ScD6YLTl986rztAPyLCKJrfPSSc2tAOgne9cGFVUPS+tehqtW+VPeD4qu00h7H9hX/x+hefqYL5cfS3h/qgpcUFw+69rVK6r1zcBwJyJAI9gUQ08628iirYku3KkUQ0VdlavrYYfB9wyStQ4VBUYpXKMhKgk5gCRRkEuJ2gETffj+nLZAqL13yFPm8lCOgRztp06S+K9Xq/cYVvAnDh8R2IsBGbs4KmpKMM7PA7mYf3XMI1KzAWXqc6RCv1a+PUwMK/AIKqnk040n2Q0yxuJSOufcVE6mWxVywHag9Ucww1FuSR54i7w==
+      rleone@scaleway.com","fingerprint":"4096 MD5:43:ba:7c:ec:66:6b:cc:fe:02:91:04:29:32:19:30:bf
+      rleone@scaleway.com (ssh-rsa)","created_at":"2019-05-02T08:26:01.304954Z","updated_at":"2020-05-13T22:32:46.471097Z","creation_info":{"address":"195.154.228.158","user_agent":"ansible
+      2.7.0.dev0 Python 2.7.16","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"cffa1bb1-57f0-4ad8-be20-f335df743b27","name":"juliencastets-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiV5DEMsYihbdS3kCJwzSBLgGO7L2j5z2/9+HVbJbzDvAz0HcUQ+sKOlvzEUzDgtNKNP+zs7C9sMcDKKUPsVzx2jpZgGN0hP9taDzWuMX+A4B4CBftTQHtZBV8dg+EVeI5Xv6HmY/WtAWC1Xfb8mvz5z+a/8D0u9IVURqiZy/n8moQwhjpK9+m634GorgMwduMZX1pPskSVL1m2ocaP8NFq8oV9L6zf9kSi7/Jwgci1TTsGYGsRSbpc665nP7MgyxZqpP0oQK8f6VW1ndFjsSgE1fT83/1WH8ro2Ou0Esh/FTs0Wxt2A5vIShYJIO+o680rNjbIhoWHLg5tU9+ip1
+      macbook","fingerprint":"2048 MD5:00:43:dc:7f:26:64:70:a2:b9:cd:06:77:35:f2:f6:f6
+      macbook (ssh-rsa)","created_at":"2020-02-26T12:46:58.241993Z","updated_at":"2020-02-26T12:46:58.241993Z","creation_info":{"address":"195.154.229.35","user_agent":"Mozilla/5.0
+      (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130
+      Safari/537.36","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"d4eb532f-b59a-4f9d-b079-e6082bc46016","name":"oss_exporter","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABgQDHuJH34xHb/1LtKgMlCXN2x6SYc8TQKkevOTGItFfrOf+MCck9Y7Visl7uBD9uQO6e2JBkpG9LWg9HVd5TDMiTxai81CiuuQh9dHq0/UP7VQQMyDS3zWx2gaWX6uuvPuLbza4+yfahFN9LAM8mw/uGplJBDljJbvK1TEgP9M2/1hpWUn+qAWLFiNg943ahlVJBPyNIi3EbXJ8cy9GYAhA4GR/8vtH2CdFWokL7AUTF63G+DKC/5DfCqzEsF5PpraIUObZHJ/K7m0otCu3K7kJG0rltyAdxew3FOPAvVZyKyi0ES2avsBCrPtSU89GzqVvdSL09h0W0TzX8agraHwB0Fp21pQW7+o+TWmJ0RToAQA+s4xFH4OFvyc0S3iMB1/A1219ep6CM7EggIhLDn0KJfO92Vhtkl0Z8Uw5qqRVoIsrhriReD5csK6kwUA0fmJAANudjIJgTOCE27462OCeUZK/p0CNgqnkieHdCeFOnIkn5yiGOhV9AkjPHmmLlujs=
+      oss-exporter","fingerprint":"3072 MD5:d8:53:fc:ef:8e:ee:dd:65:3b:fc:e3:a7:96:05:f0:ac
+      oss-exporter (ssh-rsa)","created_at":"2020-05-18T14:06:54.887451Z","updated_at":"2020-05-18T14:12:35.090751Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"32f707c5-df07-43c7-8b57-6e09b687dd03"},{"id":"33ece97d-d6b7-4d4b-b213-15d4a8ee2eb9","name":"test-cli-KeyRegistered","public_key":"ssh-ed25519
+      AAAAC3NzaC1lZDI1NTE5AAAAICd8ZxAm9mXQsRHhQ5iADEJuO+Ai8EbXMI7TIlsh9jbE foobar@foobar","fingerprint":"256
+      MD5:2e:c9:d3:87:1c:04:5f:c8:86:0c:08:4d:34:3f:ff:4c foobar@foobar (ssh-ed25519)","created_at":"2020-06-10T13:57:05.192946Z","updated_at":"2020-06-23T16:10:02.923550Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}],"total_count":4}'
+    headers:
+      Content-Length:
+      - "3586"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 16:10:03 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 1abb81c2-9176-4032-8332-1f47109788c3
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-key/33ece97d-d6b7-4d4b-b213-15d4a8ee2eb9
+    method: DELETE
+  response:
+    body: ""
+    headers:
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 16:10:03 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 23ac901d-04cc-4c55-9294-dd80186eadbc
+    status: 204 No Content
+    code: 204
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-ssh-key-registered.golden b/internal/namespaces/init/testdata/test-init-ssh-key-registered.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-key-registered.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.cassette.yaml b/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.cassette.yaml
new file mode 100644
index 00000000..82f3aa14
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.cassette.yaml
@@ -0,0 +1,188 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCW8XT5JRAV4B0WQSHPE", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T14:06:56.763352+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:33:35 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys?order_by=created_at_asc&page=1
+    method: GET
+  response:
+    body: '{"ssh_keys":[{"id":"9bf6c340-687c-4f31-8aad-6a525761d8cd","name":"sieben-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAACAQDZrUk+hFs8hYZVu6PVzXIZH83glJfiqZU7gzxw9zSkinCNHZnJ0KViZmol/XUEvGPu0toWOnM5t9MUVRq3xMldo6TKOZ7tvqBDoYD/hMHSBZb+b5f12l7i43wV7dunypy+nKtlb+rv9YJdMdbVaXy29K5EPaQujYTZTvXFEB9b8P0NXt0jA+qsUEf6/TK7dONdh2PFrUFiLXtNxkw21n/q6JGfR78etQ3mIaDKffjoVYHKgMv2edGWpjAkZeM5eBg6U6kb7CMMstpxPfOPADkXu4hbWhMGG5TC4tuizfq8YAeE8t2nyfB+xq8MtQe5jTPLK1/B+NVuKvp+3WLDSrai6dbsMpFsZDXJL34BkoY7XsRf8FeaPiy5Z3ScD6YLTl986rztAPyLCKJrfPSSc2tAOgne9cGFVUPS+tehqtW+VPeD4qu00h7H9hX/x+hefqYL5cfS3h/qgpcUFw+69rVK6r1zcBwJyJAI9gUQ08628iirYku3KkUQ0VdlavrYYfB9wyStQ4VBUYpXKMhKgk5gCRRkEuJ2gETffj+nLZAqL13yFPm8lCOgRztp06S+K9Xq/cYVvAnDh8R2IsBGbs4KmpKMM7PA7mYf3XMI1KzAWXqc6RCv1a+PUwMK/AIKqnk040n2Q0yxuJSOufcVE6mWxVywHag9Ucww1FuSR54i7w==
+      rleone@scaleway.com","fingerprint":"4096 MD5:43:ba:7c:ec:66:6b:cc:fe:02:91:04:29:32:19:30:bf
+      rleone@scaleway.com (ssh-rsa)","created_at":"2019-05-02T08:26:01.304954Z","updated_at":"2020-05-13T22:32:46.471097Z","creation_info":{"address":"195.154.228.158","user_agent":"ansible
+      2.7.0.dev0 Python 2.7.16","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"cffa1bb1-57f0-4ad8-be20-f335df743b27","name":"juliencastets-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiV5DEMsYihbdS3kCJwzSBLgGO7L2j5z2/9+HVbJbzDvAz0HcUQ+sKOlvzEUzDgtNKNP+zs7C9sMcDKKUPsVzx2jpZgGN0hP9taDzWuMX+A4B4CBftTQHtZBV8dg+EVeI5Xv6HmY/WtAWC1Xfb8mvz5z+a/8D0u9IVURqiZy/n8moQwhjpK9+m634GorgMwduMZX1pPskSVL1m2ocaP8NFq8oV9L6zf9kSi7/Jwgci1TTsGYGsRSbpc665nP7MgyxZqpP0oQK8f6VW1ndFjsSgE1fT83/1WH8ro2Ou0Esh/FTs0Wxt2A5vIShYJIO+o680rNjbIhoWHLg5tU9+ip1
+      macbook","fingerprint":"2048 MD5:00:43:dc:7f:26:64:70:a2:b9:cd:06:77:35:f2:f6:f6
+      macbook (ssh-rsa)","created_at":"2020-02-26T12:46:58.241993Z","updated_at":"2020-02-26T12:46:58.241993Z","creation_info":{"address":"195.154.229.35","user_agent":"Mozilla/5.0
+      (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130
+      Safari/537.36","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"d4eb532f-b59a-4f9d-b079-e6082bc46016","name":"oss_exporter","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABgQDHuJH34xHb/1LtKgMlCXN2x6SYc8TQKkevOTGItFfrOf+MCck9Y7Visl7uBD9uQO6e2JBkpG9LWg9HVd5TDMiTxai81CiuuQh9dHq0/UP7VQQMyDS3zWx2gaWX6uuvPuLbza4+yfahFN9LAM8mw/uGplJBDljJbvK1TEgP9M2/1hpWUn+qAWLFiNg943ahlVJBPyNIi3EbXJ8cy9GYAhA4GR/8vtH2CdFWokL7AUTF63G+DKC/5DfCqzEsF5PpraIUObZHJ/K7m0otCu3K7kJG0rltyAdxew3FOPAvVZyKyi0ES2avsBCrPtSU89GzqVvdSL09h0W0TzX8agraHwB0Fp21pQW7+o+TWmJ0RToAQA+s4xFH4OFvyc0S3iMB1/A1219ep6CM7EggIhLDn0KJfO92Vhtkl0Z8Uw5qqRVoIsrhriReD5csK6kwUA0fmJAANudjIJgTOCE27462OCeUZK/p0CNgqnkieHdCeFOnIkn5yiGOhV9AkjPHmmLlujs=
+      oss-exporter","fingerprint":"3072 MD5:d8:53:fc:ef:8e:ee:dd:65:3b:fc:e3:a7:96:05:f0:ac
+      oss-exporter (ssh-rsa)","created_at":"2020-05-18T14:06:54.887451Z","updated_at":"2020-05-18T14:12:35.090751Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"32f707c5-df07-43c7-8b57-6e09b687dd03"}],"total_count":3}'
+    headers:
+      Content-Length:
+      - "3090"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:33:35 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 86c1516c-6356-45ca-95d2-f49b32e3cf74
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: '{"name":"","public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIQE67HxSRicWd4ol7ntM2jdeD/qEehPJxK/3thmMiZg
+      foobar@foobar","organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}'
+    form: {}
+    headers:
+      Content-Type:
+      - application/json
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys
+    method: POST
+  response:
+    body: '{"id":"255abc8e-4628-4d53-a497-e1bd23c06757","name":"","public_key":"ssh-ed25519
+      AAAAC3NzaC1lZDI1NTE5AAAAIIQE67HxSRicWd4ol7ntM2jdeD/qEehPJxK/3thmMiZg foobar@foobar","fingerprint":"256
+      MD5:ea:c1:a1:82:4b:41:2b:65:26:9c:18:27:da:0d:bd:91 foobar@foobar (ssh-ed25519)","created_at":"2020-06-10T13:03:44.732785Z","updated_at":"2020-06-23T14:33:35.687332Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}'
+    headers:
+      Content-Length:
+      - "473"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:33:35 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - ceba1f28-d81c-424b-beb6-18c4fd4060f6
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-keys?order_by=created_at_asc&page=1
+    method: GET
+  response:
+    body: '{"ssh_keys":[{"id":"9bf6c340-687c-4f31-8aad-6a525761d8cd","name":"sieben-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAACAQDZrUk+hFs8hYZVu6PVzXIZH83glJfiqZU7gzxw9zSkinCNHZnJ0KViZmol/XUEvGPu0toWOnM5t9MUVRq3xMldo6TKOZ7tvqBDoYD/hMHSBZb+b5f12l7i43wV7dunypy+nKtlb+rv9YJdMdbVaXy29K5EPaQujYTZTvXFEB9b8P0NXt0jA+qsUEf6/TK7dONdh2PFrUFiLXtNxkw21n/q6JGfR78etQ3mIaDKffjoVYHKgMv2edGWpjAkZeM5eBg6U6kb7CMMstpxPfOPADkXu4hbWhMGG5TC4tuizfq8YAeE8t2nyfB+xq8MtQe5jTPLK1/B+NVuKvp+3WLDSrai6dbsMpFsZDXJL34BkoY7XsRf8FeaPiy5Z3ScD6YLTl986rztAPyLCKJrfPSSc2tAOgne9cGFVUPS+tehqtW+VPeD4qu00h7H9hX/x+hefqYL5cfS3h/qgpcUFw+69rVK6r1zcBwJyJAI9gUQ08628iirYku3KkUQ0VdlavrYYfB9wyStQ4VBUYpXKMhKgk5gCRRkEuJ2gETffj+nLZAqL13yFPm8lCOgRztp06S+K9Xq/cYVvAnDh8R2IsBGbs4KmpKMM7PA7mYf3XMI1KzAWXqc6RCv1a+PUwMK/AIKqnk040n2Q0yxuJSOufcVE6mWxVywHag9Ucww1FuSR54i7w==
+      rleone@scaleway.com","fingerprint":"4096 MD5:43:ba:7c:ec:66:6b:cc:fe:02:91:04:29:32:19:30:bf
+      rleone@scaleway.com (ssh-rsa)","created_at":"2019-05-02T08:26:01.304954Z","updated_at":"2020-05-13T22:32:46.471097Z","creation_info":{"address":"195.154.228.158","user_agent":"ansible
+      2.7.0.dev0 Python 2.7.16","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"cffa1bb1-57f0-4ad8-be20-f335df743b27","name":"juliencastets-macbook","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiV5DEMsYihbdS3kCJwzSBLgGO7L2j5z2/9+HVbJbzDvAz0HcUQ+sKOlvzEUzDgtNKNP+zs7C9sMcDKKUPsVzx2jpZgGN0hP9taDzWuMX+A4B4CBftTQHtZBV8dg+EVeI5Xv6HmY/WtAWC1Xfb8mvz5z+a/8D0u9IVURqiZy/n8moQwhjpK9+m634GorgMwduMZX1pPskSVL1m2ocaP8NFq8oV9L6zf9kSi7/Jwgci1TTsGYGsRSbpc665nP7MgyxZqpP0oQK8f6VW1ndFjsSgE1fT83/1WH8ro2Ou0Esh/FTs0Wxt2A5vIShYJIO+o680rNjbIhoWHLg5tU9+ip1
+      macbook","fingerprint":"2048 MD5:00:43:dc:7f:26:64:70:a2:b9:cd:06:77:35:f2:f6:f6
+      macbook (ssh-rsa)","created_at":"2020-02-26T12:46:58.241993Z","updated_at":"2020-02-26T12:46:58.241993Z","creation_info":{"address":"195.154.229.35","user_agent":"Mozilla/5.0
+      (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130
+      Safari/537.36","country_code":"FR"},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"},{"id":"d4eb532f-b59a-4f9d-b079-e6082bc46016","name":"oss_exporter","public_key":"ssh-rsa
+      AAAAB3NzaC1yc2EAAAADAQABAAABgQDHuJH34xHb/1LtKgMlCXN2x6SYc8TQKkevOTGItFfrOf+MCck9Y7Visl7uBD9uQO6e2JBkpG9LWg9HVd5TDMiTxai81CiuuQh9dHq0/UP7VQQMyDS3zWx2gaWX6uuvPuLbza4+yfahFN9LAM8mw/uGplJBDljJbvK1TEgP9M2/1hpWUn+qAWLFiNg943ahlVJBPyNIi3EbXJ8cy9GYAhA4GR/8vtH2CdFWokL7AUTF63G+DKC/5DfCqzEsF5PpraIUObZHJ/K7m0otCu3K7kJG0rltyAdxew3FOPAvVZyKyi0ES2avsBCrPtSU89GzqVvdSL09h0W0TzX8agraHwB0Fp21pQW7+o+TWmJ0RToAQA+s4xFH4OFvyc0S3iMB1/A1219ep6CM7EggIhLDn0KJfO92Vhtkl0Z8Uw5qqRVoIsrhriReD5csK6kwUA0fmJAANudjIJgTOCE27462OCeUZK/p0CNgqnkieHdCeFOnIkn5yiGOhV9AkjPHmmLlujs=
+      oss-exporter","fingerprint":"3072 MD5:d8:53:fc:ef:8e:ee:dd:65:3b:fc:e3:a7:96:05:f0:ac
+      oss-exporter (ssh-rsa)","created_at":"2020-05-18T14:06:54.887451Z","updated_at":"2020-05-18T14:12:35.090751Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"32f707c5-df07-43c7-8b57-6e09b687dd03"},{"id":"255abc8e-4628-4d53-a497-e1bd23c06757","name":"","public_key":"ssh-ed25519
+      AAAAC3NzaC1lZDI1NTE5AAAAIIQE67HxSRicWd4ol7ntM2jdeD/qEehPJxK/3thmMiZg foobar@foobar","fingerprint":"256
+      MD5:ea:c1:a1:82:4b:41:2b:65:26:9c:18:27:da:0d:bd:91 foobar@foobar (ssh-ed25519)","created_at":"2020-06-10T13:03:44.732785Z","updated_at":"2020-06-23T14:33:35.687332Z","creation_info":{"address":"","user_agent":"","country_code":""},"organization_id":"951df375-e094-4d26-97c1-ba548eeb9c42"}],"total_count":4}'
+    headers:
+      Content-Length:
+      - "3564"
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:33:35 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 000ed79a-4d23-491b-832c-0097c472c46f
+    status: 200 OK
+    code: 200
+    duration: ""
+- request:
+    body: ""
+    form: {}
+    headers:
+      User-Agent:
+      - scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) cli-e2e-test
+    url: https://api.scaleway.com/account/v2alpha1/ssh-key/255abc8e-4628-4d53-a497-e1bd23c06757
+    method: DELETE
+  response:
+    body: ""
+    headers:
+      Content-Security-Policy:
+      - default-src 'none'; frame-ancestors 'none'
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:33:35 GMT
+      Server:
+      - agw_listener_public_vip
+      Strict-Transport-Security:
+      - max-age=63072000
+      X-Content-Type-Options:
+      - nosniff
+      X-Frame-Options:
+      - DENY
+      X-Request-Id:
+      - 9f1fc349-7996-4343-a432-5bdb34cfeed3
+    status: 204 No Content
+    code: 204
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.golden b/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.golden
new file mode 100644
index 00000000..0b450349
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-key-unregistered.golden
@@ -0,0 +1,8 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": ""
+}
diff --git a/internal/namespaces/init/testdata/test-init-ssh-no-local-key.cassette.yaml b/internal/namespaces/init/testdata/test-init-ssh-no-local-key.cassette.yaml
new file mode 100644
index 00000000..b0742ea1
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-no-local-key.cassette.yaml
@@ -0,0 +1,31 @@
+---
+version: 1
+interactions:
+- request:
+    body: ""
+    form: {}
+    headers: {}
+    url: https://account.scaleway.com/tokens/11111111-1111-1111-1111-111111111111
+    method: GET
+  response:
+    body: '{"token": {"access_key": "SCWV1KBG4XV8BM4Y5T2T", "user_id": "721f2fde-1a01-4854-822b-fcca5638d73e",
+      "expires": null, "creation_date": "2020-06-23T08:21:54.096455+00:00", "creation_ip":
+      "195.154.229.35", "category": "user_created", "deletion_date": null, "inherits_user_perms":
+      true, "roles": {"role": null, "organization": null}, "description": "sieben-macbook",
+      "organization_id": "951df375-e094-4d26-97c1-ba548eeb9c42", "use_role_key": false}}'
+    headers:
+      Connection:
+      - keep-alive
+      Content-Length:
+      - "445"
+      Content-Type:
+      - application/json
+      Date:
+      - Tue, 23 Jun 2020 14:04:17 GMT
+      Server:
+      - nginx
+      Strict-Transport-Security:
+      - max-age=15552000
+    status: 200 OK
+    code: 200
+    duration: ""
diff --git a/internal/namespaces/init/testdata/test-init-ssh-no-local-key.golden b/internal/namespaces/init/testdata/test-init-ssh-no-local-key.golden
new file mode 100644
index 00000000..d71726df
--- /dev/null
+++ b/internal/namespaces/init/testdata/test-init-ssh-no-local-key.golden
@@ -0,0 +1,9 @@
+🎲🎲🎲 EXIT CODE: 0 🎲🎲🎲
+🟩🟩🟩 STDOUT️ 🟩🟩🟩️
+✅ Initialization completed with success.
+  Except for SSH key: could not find an SSH key at ~/.ssh/id_rsa.pub
+🟩🟩🟩 JSON STDOUT 🟩🟩🟩
+{
+  "message": "Initialization completed with success",
+  "details": "Except for SSH key: could not find an SSH key at ~/.ssh/id_rsa.pub"
+}