Skip to content

Commit 5ab9b9f

Browse files
author
gentele
committed
resolve #218
1 parent ff3f889 commit 5ab9b9f

3 files changed

Lines changed: 118 additions & 28 deletions

File tree

cmd/init.go

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import (
77
"strconv"
88
"strings"
99

10+
"github.com/covexo/devspace/pkg/devspace/clients/kubectl"
11+
12+
"github.com/covexo/devspace/pkg/devspace/builder/docker"
13+
1014
"github.com/covexo/devspace/pkg/devspace/config/configutil"
1115
"github.com/covexo/devspace/pkg/devspace/generator"
1216
"github.com/covexo/devspace/pkg/util/log"
@@ -397,10 +401,31 @@ func (cmd *InitCmd) configureKubernetes() {
397401
}
398402

399403
func (cmd *InitCmd) configureRegistry() {
404+
dockerUsername := ""
405+
createInternalRegistryDefaultAnswer := "yes"
406+
407+
var imageBuilder *docker.Builder
408+
var dockerBuilderErr error
409+
410+
imageBuilder, dockerBuilderErr = docker.NewBuilder("", "", "", false)
411+
412+
if dockerBuilderErr == nil {
413+
log.StartWait("Checking Docker credentials")
414+
dockerAuthConfig, dockerAuthErr := imageBuilder.Authenticate("", "", true)
415+
log.StopWait()
416+
417+
if dockerAuthErr == nil {
418+
dockerUsername = dockerAuthConfig.Username
419+
420+
if dockerUsername != "" {
421+
createInternalRegistryDefaultAnswer = "no"
422+
}
423+
}
424+
}
400425
internalRegistryConfig := cmd.config.Services.InternalRegistry
401426
createInternalRegistry := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
402427
Question: "Should we create a private registry within your Kubernetes cluster for you? (yes | no)",
403-
DefaultValue: "yes",
428+
DefaultValue: createInternalRegistryDefaultAnswer,
404429
ValidationRegexPattern: "^(yes)|(no)$",
405430
})
406431

@@ -413,22 +438,77 @@ func (cmd *InitCmd) configureRegistry() {
413438

414439
cmd.defaultRegistry.URL = registryURL
415440
internalRegistryConfig = nil
441+
loginWarningServer := ""
442+
443+
if dockerUsername == "" {
444+
if *registryURL != "hub.docker.com" {
445+
loginWarningServer = " " + *registryURL
446+
imageBuilder, dockerBuilderErr = docker.NewBuilder(*registryURL, "", "", false)
447+
}
448+
449+
if dockerBuilderErr == nil {
450+
log.StartWait("Checking Docker credentials")
451+
dockerAuthConfig, dockerAuthErr := imageBuilder.Authenticate("", "", true)
452+
log.StopWait()
453+
454+
if dockerAuthErr == nil {
455+
dockerUsername = dockerAuthConfig.Username
456+
}
457+
}
458+
}
459+
460+
if dockerUsername == "" {
461+
if cmd.defaultImage.Build.Engine.Docker != nil {
462+
log.Fatal("Make sure you login to the registry with: docker login" + loginWarningServer)
463+
} else {
464+
registryMapOverwrite := *cmd.overwriteConfig.Registries
465+
defaultRegistryOverwrite, defaultRegistryOverwriteDefined := registryMapOverwrite["default"]
466+
467+
if !defaultRegistryOverwriteDefined {
468+
defaultRegistryOverwrite = &v1.RegistryConfig{}
469+
registryMapOverwrite["default"] = defaultRegistryOverwrite
470+
}
471+
472+
if defaultRegistryOverwrite.Auth == nil {
473+
defaultRegistryOverwrite.Auth = &v1.RegistryAuth{}
474+
}
475+
476+
if defaultRegistryOverwrite.Auth.Username == nil {
477+
defaultRegistryOverwrite.Auth.Username = configutil.String("")
478+
}
479+
480+
defaultRegistryOverwrite.Auth.Username = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
481+
Question: "Which username do you want to use to push images to " + *registryURL + "?",
482+
DefaultValue: *defaultRegistryOverwrite.Auth.Username,
483+
ValidationRegexPattern: "^[a-zA-Z0-9]{4,30}$",
484+
})
485+
dockerUsername = *defaultRegistryOverwrite.Auth.Username
486+
487+
if defaultRegistryOverwrite.Auth.Password == nil {
488+
defaultRegistryOverwrite.Auth.Password = configutil.String("")
489+
}
490+
491+
defaultRegistryOverwrite.Auth.Username = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
492+
Question: "Which password do you want to use to push images to " + *registryURL + "?",
493+
DefaultValue: *defaultRegistryOverwrite.Auth.Password,
494+
ValidationRegexPattern: "^.*$",
495+
})
496+
}
497+
}
416498

417499
if *registryURL == "hub.docker.com" {
418500
defaultImageName := *cmd.defaultImage.Name
419501
defaultImageNameParts := strings.Split(defaultImageName, "/")
420-
existingDockerUsername := ""
421502

422-
if len(defaultImageNameParts) > 1 {
423-
existingDockerUsername = defaultImageNameParts[0]
503+
if len(defaultImageNameParts) < 2 {
504+
defaultImageName = dockerUsername + "/" + strings.TrimPrefix(defaultImageName, dockerUsername)
424505
}
425506

426-
dockerUsername := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
427-
Question: "What is your Docker username?",
428-
DefaultValue: existingDockerUsername,
507+
cmd.defaultImage.Name = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
508+
Question: "Which image name do you want to use on Docker Hub?",
509+
DefaultValue: defaultImageName,
429510
ValidationRegexPattern: "^[a-zA-Z0-9]{4,30}$",
430511
})
431-
cmd.defaultImage.Name = configutil.String(*dockerUsername + "/" + strings.TrimPrefix(defaultImageName, *dockerUsername))
432512
}
433513
} else {
434514
imageMap := *cmd.config.Images
@@ -513,6 +593,8 @@ func (cmd *InitCmd) configureRegistry() {
513593
},
514594
},
515595
}
596+
} else if kubectl.IsMinikube() == false {
597+
log.Warn("Your Kubernetes cluster will not be able to pull images from a registry without a registry domain!\n")
516598
}
517599
}
518600
secrets, registryHasSecrets := registryReleaseValues["secrets"]

pkg/devspace/builder/docker/client.go

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ package docker
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/http"
78
"os/exec"
89
"path/filepath"
910
"strings"
1011

12+
"github.com/covexo/devspace/pkg/devspace/clients/kubectl"
13+
1114
"github.com/docker/docker/api"
1215
"github.com/docker/docker/client"
1316
"github.com/docker/go-connections/tlsconfig"
14-
"k8s.io/client-go/tools/clientcmd"
1517
)
1618

17-
var isMinikubeVar *bool
18-
1919
func newDockerClientFromEnvironment() (client.CommonAPIClient, error) {
2020
cli, err := client.NewClientWithOpts(client.FromEnv)
2121
if err != nil {
@@ -27,6 +27,10 @@ func newDockerClientFromEnvironment() (client.CommonAPIClient, error) {
2727
}
2828

2929
func newDockerClientFromMinikube() (client.CommonAPIClient, error) {
30+
if kubectl.IsMinikube() == false {
31+
return nil, errors.New("Cluster is not a minikube cluster.")
32+
}
33+
3034
env, err := getMinikubeEnvironment()
3135
if err != nil {
3236
return nil, err
@@ -65,23 +69,6 @@ func newDockerClientFromMinikube() (client.CommonAPIClient, error) {
6569
return client.NewClient(host, version, httpclient, nil)
6670
}
6771

68-
func isMinikube() bool {
69-
if isMinikubeVar == nil {
70-
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
71-
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
72-
cfg, err := kubeConfig.RawConfig()
73-
74-
if err != nil {
75-
return false
76-
}
77-
78-
isMinikube := cfg.CurrentContext == "minikube"
79-
isMinikubeVar = &isMinikube
80-
}
81-
82-
return *isMinikubeVar
83-
}
84-
8572
func getMinikubeEnvironment() (map[string]string, error) {
8673
cmd := exec.Command("minikube", "docker-env", "--shell", "none")
8774
out, err := cmd.Output()

pkg/devspace/clients/kubectl/client.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1717
"k8s.io/client-go/kubernetes"
1818
"k8s.io/client-go/rest"
19+
"k8s.io/client-go/tools/clientcmd"
1920
"k8s.io/client-go/tools/portforward"
2021
"k8s.io/client-go/tools/remotecommand"
2122
"k8s.io/client-go/transport/spdy"
@@ -28,6 +29,8 @@ import (
2829
"k8s.io/kubernetes/pkg/util/node"
2930
)
3031

32+
var isMinikubeVar *bool
33+
3134
//NewClient creates a new kubernetes client
3235
func NewClient() (*kubernetes.Clientset, error) {
3336
config, err := GetClientConfig()
@@ -39,6 +42,24 @@ func NewClient() (*kubernetes.Clientset, error) {
3942
return kubernetes.NewForConfig(config)
4043
}
4144

45+
// IsMinikube returns true if the Kubernetes cluster is a minikube
46+
func IsMinikube() bool {
47+
if isMinikubeVar == nil {
48+
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
49+
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
50+
cfg, err := kubeConfig.RawConfig()
51+
52+
if err != nil {
53+
return false
54+
}
55+
56+
isMinikube := cfg.CurrentContext == "minikube"
57+
isMinikubeVar = &isMinikube
58+
}
59+
60+
return *isMinikubeVar
61+
}
62+
4263
// GetFirstRunningPod retrieves the first pod that is found that has the status "Running" using the label selector string
4364
func GetFirstRunningPod(kubectl *kubernetes.Clientset, labelSelector, namespace string) (*k8sv1.Pod, error) {
4465
podList, err := kubectl.Core().Pods(namespace).List(metav1.ListOptions{

0 commit comments

Comments
 (0)