@@ -3,24 +3,21 @@ package cmd
33import (
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"
3128type 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
446431func (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