Skip to content

Commit f4434ef

Browse files
committed
Refactor config
1 parent 39d9b88 commit f4434ef

8 files changed

Lines changed: 476 additions & 459 deletions

File tree

cmd/init.go

Lines changed: 16 additions & 261 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,21 @@ package cmd
33
import (
44
"io/ioutil"
55
"os"
6-
"os/exec"
76
"path/filepath"
8-
"regexp"
97
"strings"
108

119
"github.com/covexo/devspace/pkg/util/kubeconfig"
1210

1311
"k8s.io/client-go/tools/clientcmd"
1412

1513
"github.com/covexo/devspace/pkg/devspace/cloud"
16-
"github.com/covexo/devspace/pkg/devspace/kubectl"
14+
"github.com/covexo/devspace/pkg/devspace/configure"
1715

1816
"github.com/covexo/devspace/pkg/devspace/builder/docker"
1917

2018
"github.com/covexo/devspace/pkg/devspace/config/configutil"
2119
"github.com/covexo/devspace/pkg/devspace/generator"
2220
"github.com/covexo/devspace/pkg/util/log"
23-
"github.com/covexo/devspace/pkg/util/randutil"
2421

2522
"github.com/covexo/devspace/pkg/devspace/config/v1"
2623
"github.com/covexo/devspace/pkg/util/stdinutil"
@@ -29,11 +26,10 @@ import (
2926

3027
// InitCmd is a struct that defines a command call for "init"
3128
type InitCmd struct {
32-
flags *InitCmdFlags
33-
workdir string
34-
chartGenerator *generator.ChartGenerator
35-
defaultImage *v1.ImageConfig
36-
defaultRegistry *v1.RegistryConfig
29+
flags *InitCmdFlags
30+
workdir string
31+
chartGenerator *generator.ChartGenerator
32+
defaultImage *v1.ImageConfig
3733
}
3834

3935
// InitCmdFlags are the flags available for the init-command
@@ -134,14 +130,6 @@ func (cmd *InitCmd) Run(cobraCmd *cobra.Command, args []string) {
134130
Images: &map[string]*v1.ImageConfig{
135131
"default": &v1.ImageConfig{
136132
Name: configutil.String("devspace"),
137-
Build: &v1.BuildConfig{
138-
Engine: &v1.BuildEngine{
139-
Docker: &v1.DockerBuildEngine{
140-
Enabled: configutil.Bool(true),
141-
},
142-
},
143-
},
144-
Registry: configutil.String("default"),
145133
},
146134
},
147135
Registries: &map[string]*v1.RegistryConfig{
@@ -155,10 +143,7 @@ func (cmd *InitCmd) Run(cobraCmd *cobra.Command, args []string) {
155143
})
156144

157145
imageMap := *config.Images
158-
cmd.defaultImage, _ = imageMap["default"]
159-
160-
registryMap := *config.Registries
161-
cmd.defaultRegistry, _ = registryMap["default"]
146+
cmd.defaultImage = imageMap["default"]
162147

163148
cmd.initChartGenerator()
164149

@@ -444,244 +429,39 @@ func (cmd *InitCmd) configureKubernetes() {
444429
}
445430

446431
func (cmd *InitCmd) configureRegistry() {
447-
config := configutil.GetConfig()
448-
overwriteConfig := configutil.GetOverwriteConfig()
449-
450432
dockerUsername := ""
451433
createInternalRegistryDefaultAnswer := "yes"
452434

453-
var imageBuilder *docker.Builder
454-
var dockerBuilderErr error
455-
456-
imageBuilder, dockerBuilderErr = docker.NewBuilder("", "", "", false)
457-
458-
if dockerBuilderErr == nil {
435+
imageBuilder, err := docker.NewBuilder("", "", "", false)
436+
if err == nil {
459437
log.StartWait("Checking Docker credentials")
460-
dockerAuthConfig, dockerAuthErr := imageBuilder.Authenticate("", "", true)
438+
dockerAuthConfig, err := imageBuilder.Authenticate("", "", true)
461439
log.StopWait()
462440

463-
if dockerAuthErr == nil {
441+
if err == nil {
464442
dockerUsername = dockerAuthConfig.Username
465-
466443
if dockerUsername != "" {
467444
createInternalRegistryDefaultAnswer = "no"
468445
}
469446
}
470447
}
471448

472-
internalRegistryConfig := config.Services.InternalRegistry
473449
createInternalRegistry := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
474450
Question: "Should we create a private registry within your Kubernetes cluster for you? (yes | no)",
475451
DefaultValue: createInternalRegistryDefaultAnswer,
476452
ValidationRegexPattern: "^(yes)|(no)$",
477453
})
478454

479455
if *createInternalRegistry == "no" {
480-
registryURL := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
481-
Question: "Which registry do you want to push to? ('hub.docker.com' or URL)",
482-
DefaultValue: "hub.docker.com",
483-
ValidationRegexPattern: "^.*$",
484-
})
485-
486-
cmd.defaultRegistry.URL = registryURL
487-
internalRegistryConfig = nil
488-
loginWarningServer := ""
489-
490-
if dockerUsername == "" {
491-
if *registryURL != "hub.docker.com" {
492-
loginWarningServer = " " + *registryURL
493-
imageBuilder, dockerBuilderErr = docker.NewBuilder(*registryURL, "", "", false)
494-
}
495-
496-
if dockerBuilderErr == nil {
497-
log.StartWait("Checking Docker credentials")
498-
dockerAuthConfig, dockerAuthErr := imageBuilder.Authenticate("", "", true)
499-
log.StopWait()
500-
501-
if dockerAuthErr == nil {
502-
dockerUsername = dockerAuthConfig.Username
503-
}
504-
}
505-
}
506-
507-
googleRegistryRegex := regexp.MustCompile("^(.+\\.)?gcr.io$")
508-
isGoogleRegistry := googleRegistryRegex.Match([]byte(*registryURL))
509-
isDockerHub := *registryURL == "hub.docker.com"
510-
511-
if dockerUsername == "" {
512-
if cmd.defaultImage.Build.Engine.Docker != nil {
513-
log.Fatal("Make sure you login to the registry with: docker login" + loginWarningServer)
514-
} else {
515-
registryMapOverwrite := *overwriteConfig.Registries
516-
defaultRegistryOverwrite, defaultRegistryOverwriteDefined := registryMapOverwrite["default"]
517-
518-
if !defaultRegistryOverwriteDefined {
519-
defaultRegistryOverwrite = &v1.RegistryConfig{}
520-
registryMapOverwrite["default"] = defaultRegistryOverwrite
521-
}
522-
523-
if defaultRegistryOverwrite.Auth == nil {
524-
defaultRegistryOverwrite.Auth = &v1.RegistryAuth{}
525-
}
526-
527-
if defaultRegistryOverwrite.Auth.Username == nil {
528-
defaultRegistryOverwrite.Auth.Username = configutil.String("")
529-
}
530-
531-
defaultRegistryOverwrite.Auth.Username = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
532-
Question: "Which username do you want to use to push images to " + *registryURL + "?",
533-
DefaultValue: *defaultRegistryOverwrite.Auth.Username,
534-
ValidationRegexPattern: "^[a-zA-Z0-9]{4,30}$",
535-
})
536-
dockerUsername = *defaultRegistryOverwrite.Auth.Username
537-
538-
if defaultRegistryOverwrite.Auth.Password == nil {
539-
defaultRegistryOverwrite.Auth.Password = configutil.String("")
540-
}
541-
542-
defaultRegistryOverwrite.Auth.Username = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
543-
Question: "Which password do you want to use to push images to " + *registryURL + "?",
544-
DefaultValue: *defaultRegistryOverwrite.Auth.Password,
545-
ValidationRegexPattern: "^.*$",
546-
})
547-
}
548-
}
549-
defaultImageName := *cmd.defaultImage.Name
550-
defaultImageNameParts := strings.Split(defaultImageName, "/")
551-
552-
if isDockerHub {
553-
if len(defaultImageNameParts) < 2 {
554-
defaultImageName = dockerUsername + "/" + strings.TrimPrefix(defaultImageName, dockerUsername)
555-
}
556-
557-
cmd.defaultImage.Name = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
558-
Question: "Which image name do you want to use on Docker Hub?",
559-
DefaultValue: defaultImageName,
560-
ValidationRegexPattern: "^[a-zA-Z0-9/]{4,30}$",
561-
})
562-
}
563-
564-
if isGoogleRegistry {
565-
if len(defaultImageNameParts) < 2 {
566-
project, err := exec.Command("gcloud", "config", "get-value", "project").Output()
567-
gcloudProject := ""
568-
569-
if err == nil {
570-
gcloudProject = strings.TrimSpace(string(project))
571-
}
572-
573-
gcloudProjectName := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
574-
Question: "What Google Cloud Project should be used?",
575-
DefaultValue: gcloudProject,
576-
ValidationRegexPattern: "^.*$",
577-
})
578-
579-
cmd.defaultImage.Name = configutil.String(*gcloudProjectName + "/" + strings.TrimPrefix(defaultImageName, *gcloudProjectName))
580-
}
456+
err := configure.ImageName(dockerUsername)
457+
if err != nil {
458+
log.Fatal(err)
581459
}
582460
} else {
583-
imageMap := *config.Images
584-
defaultImageConf, defaultImageExists := imageMap["default"]
585-
586-
if defaultImageExists {
587-
defaultImageConf.Registry = configutil.String("internal")
588-
}
589-
590-
if internalRegistryConfig == nil {
591-
internalRegistryConfig = &v1.InternalRegistry{
592-
Release: &v1.Release{},
593-
}
594-
config.Services.InternalRegistry = internalRegistryConfig
595-
}
596-
597-
if internalRegistryConfig.Release.Name == nil {
598-
internalRegistryConfig.Release.Name = configutil.String("devspace-registry")
599-
}
600-
if internalRegistryConfig.Release.Namespace == nil {
601-
internalRegistryConfig.Release.Namespace = config.DevSpace.Release.Namespace
602-
}
603-
604-
overwriteRegistryMap := *overwriteConfig.Registries
605-
overwriteRegistryConfig, overwriteRegistryConfigFound := overwriteRegistryMap["internal"]
606-
607-
if !overwriteRegistryConfigFound {
608-
overwriteRegistryConfig = &v1.RegistryConfig{
609-
Auth: &v1.RegistryAuth{},
610-
}
611-
overwriteRegistryMap["internal"] = overwriteRegistryConfig
612-
}
613-
614-
registryAuth := overwriteRegistryConfig.Auth
615-
if registryAuth.Username == nil {
616-
randomUserSuffix, err := randutil.GenerateRandomString(5)
617-
618-
if err != nil {
619-
log.Fatalf("Error creating random username: %s", err.Error())
620-
}
621-
registryAuth.Username = configutil.String("user-" + randomUserSuffix)
622-
}
623-
624-
if registryAuth.Password == nil {
625-
randomPassword, err := randutil.GenerateRandomString(12)
626-
627-
if err != nil {
628-
log.Fatalf("Error creating random password: %s", err.Error())
629-
}
630-
registryAuth.Password = &randomPassword
631-
}
632-
633-
var registryReleaseValues map[interface{}]interface{}
634-
if internalRegistryConfig.Release.Values != nil {
635-
registryReleaseValues = *internalRegistryConfig.Release.Values
636-
} else {
637-
registryReleaseValues = map[interface{}]interface{}{}
638-
639-
registryDomain := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
640-
Question: "Which domain should your container registry be using? (optional, requires an ingress controller)",
641-
ValidationRegexPattern: "^(([a-z0-9]([a-z0-9-]{0,120}[a-z0-9])?\\.)+[a-z0-9]{2,})?$",
642-
})
643-
644-
if *registryDomain != "" {
645-
registryReleaseValues = map[interface{}]interface{}{
646-
"Ingress": map[string]interface{}{
647-
"Enabled": true,
648-
"Hosts": []string{
649-
*registryDomain,
650-
},
651-
"Annotations": map[string]string{
652-
"Kubernetes.io/tls-acme": "true",
653-
},
654-
"Tls": []map[string]interface{}{
655-
map[string]interface{}{
656-
"SecretName": "tls-devspace-registry",
657-
"Hosts": []string{
658-
*registryDomain,
659-
},
660-
},
661-
},
662-
},
663-
}
664-
} else if kubectl.IsMinikube() == false {
665-
log.Warn("Your Kubernetes cluster will not be able to pull images from a registry without a registry domain!\n")
666-
}
667-
}
668-
669-
secrets, registryHasSecrets := registryReleaseValues["secrets"]
670-
if !registryHasSecrets {
671-
secrets = map[interface{}]interface{}{}
672-
registryReleaseValues["secrets"] = secrets
673-
}
674-
675-
secretMap, secretsIsMap := secrets.(map[interface{}]interface{})
676-
if secretsIsMap {
677-
_, registryHasSecretHtpasswd := secretMap["htpasswd"]
678-
679-
if !registryHasSecretHtpasswd {
680-
secretMap["htpasswd"] = ""
681-
}
461+
err := configure.InternalRegistry()
462+
if err != nil {
463+
log.Fatal(err)
682464
}
683-
684-
internalRegistryConfig.Release.Values = &registryReleaseValues
685465
}
686466
}
687467

@@ -725,29 +505,4 @@ func (cmd *InitCmd) createChart() {
725505
if err != nil {
726506
log.Fatalf("Error while creating Helm chart and Dockerfile: %s", err.Error())
727507
}
728-
729-
/*TODO
730-
createdChartYaml := map[interface{}]interface{}{}
731-
createdChartValuesYaml := map[interface{}]interface{}{}
732-
733-
yamlutil.ReadYamlFromFile(cmd.chartGenerator.Path+"/chart/Chart.yaml", &createdChartYaml)
734-
yamlutil.ReadYamlFromFile(cmd.chartGenerator.Path+"/chart/values.yaml", &createdChartValuesYaml)
735-
736-
containerValues, chartHasContainerValues := createdChartValuesYaml["container"].(map[interface{}]interface{})
737-
738-
if !chartHasContainerValues && containerValues != nil {
739-
containerValues["port"] = cmd.appConfig.Container.Ports
740-
741-
createdChartValuesYaml["container"] = containerValues
742-
}
743-
744-
externalValues, chartHasExternalValues := createdChartValuesYaml["external"].(map[interface{}]interface{})
745-
746-
if !chartHasExternalValues && externalValues != nil {
747-
externalValues["domain"] = cmd.appConfig.External.Domain
748-
createdChartValuesYaml["external"] = externalValues
749-
}
750-
yamlutil.WriteYamlToFile(createdChartYaml, cmd.chartGenerator.Path+"/chart/Chart.yaml")
751-
yamlutil.WriteYamlToFile(createdChartValuesYaml, cmd.chartGenerator.Path+"/chart/values.yaml")
752-
*/
753508
}

0 commit comments

Comments
 (0)