Skip to content

Commit fed4bf4

Browse files
authored
Merge pull request #254 from covexo/offline-development
Fix issues to enable offline development with minikube and local regi…
2 parents 2965985 + ecc8c00 commit fed4bf4

4 files changed

Lines changed: 109 additions & 102 deletions

File tree

cmd/init.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -668,20 +668,19 @@ func (cmd *InitCmd) determineLanguage() {
668668
if len(cmd.chartGenerator.Language) == 0 {
669669
log.StartWait("Detecting programming language")
670670

671+
detectedLang := ""
671672
supportedLanguages, err := cmd.chartGenerator.GetSupportedLanguages()
672-
673-
if err != nil {
674-
log.Fatalf("Unable to get supported languages: %s", err.Error())
675-
}
676-
detectedLang, langDetectionErr := cmd.chartGenerator.GetLanguage()
677-
678-
if langDetectionErr != nil {
679-
//log.Error(langDetectionErr)
673+
if err == nil {
674+
detectedLang, _ = cmd.chartGenerator.GetLanguage()
680675
}
681676

682677
if detectedLang == "" {
683678
detectedLang = "none"
684679
}
680+
if len(supportedLanguages) == 0 {
681+
supportedLanguages = []string{"none"}
682+
}
683+
685684
log.StopWait()
686685

687686
cmd.chartGenerator.Language = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{

pkg/devspace/clients/helm/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ func (helmClientWrapper *HelmClientWrapper) InstallChartByName(releaseName strin
628628
if len(chartVersion) == 0 {
629629
chartVersion = ">0.0.0-0"
630630
}
631+
631632
getter := getter.All(*helmClientWrapper.Settings)
632633
chartDownloader := downloader.ChartDownloader{
633634
HelmHome: helmClientWrapper.Settings.Home,

pkg/devspace/generator/generator.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,30 +82,30 @@ func (cg *ChartGenerator) GetSupportedLanguages() ([]string, error) {
8282
// CreateChart creates a chart of a project that works with Helm
8383
func (cg *ChartGenerator) CreateChart() error {
8484
chartUpdateError := cg.getChartTemplates()
85-
8685
if chartUpdateError != nil {
8786
return chartUpdateError
8887
}
89-
language, langError := cg.GetLanguage()
9088

89+
language, langError := cg.GetLanguage()
9190
if langError != nil {
9291
return langError
9392
}
94-
_, languageTemplateNotFound := os.Stat(cg.TemplateRepo.LocalPath + "/" + language)
9593

94+
_, languageTemplateNotFound := os.Stat(cg.TemplateRepo.LocalPath + "/" + language)
9695
if languageTemplateNotFound != nil {
9796
return errors.New("Language Template not found")
9897
}
99-
copyBaseError := fsutil.Copy(cg.TemplateRepo.LocalPath+"/_base", cg.Path, false)
10098

99+
copyBaseError := fsutil.Copy(cg.TemplateRepo.LocalPath+"/_base", cg.Path, false)
101100
if copyBaseError != nil {
102101
return copyBaseError
103102
}
104-
copyError := fsutil.Copy(cg.TemplateRepo.LocalPath+"/"+cg.Language, cg.Path, false)
105103

104+
copyError := fsutil.Copy(cg.TemplateRepo.LocalPath+"/"+cg.Language, cg.Path, false)
106105
if copyError != nil {
107106
return copyError
108107
}
108+
109109
return nil
110110
}
111111

pkg/devspace/registry/registry.go

Lines changed: 96 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -83,126 +83,133 @@ func GetRegistryAuthSecretName(registryURL string) string {
8383
// InitInternalRegistry deploys and starts a new docker registry if necessary
8484
func InitInternalRegistry(kubectl *kubernetes.Clientset, helm *helm.HelmClientWrapper, internalRegistry *v1.InternalRegistry, registryConfig *v1.RegistryConfig) error {
8585
registryReleaseName := *internalRegistry.Release.Name
86+
registryReleaseDeploymentName := registryReleaseName + "-docker-registry"
8687
registryReleaseNamespace := *internalRegistry.Release.Namespace
8788
registryReleaseValues := internalRegistry.Release.Values
8889

89-
// Check if registry namespace exists
90-
_, err := kubectl.CoreV1().Namespaces().Get(registryReleaseNamespace, metav1.GetOptions{})
90+
// Check if registry already exists
91+
registryDeployment, err := kubectl.ExtensionsV1beta1().Deployments(registryReleaseNamespace).Get(registryReleaseDeploymentName, metav1.GetOptions{})
9192
if err != nil {
92-
// Create registry namespace
93-
_, err = kubectl.CoreV1().Namespaces().Create(&k8sv1.Namespace{
94-
ObjectMeta: metav1.ObjectMeta{
95-
Name: registryReleaseNamespace,
96-
},
97-
})
98-
93+
// Check if registry namespace exists
94+
_, err := kubectl.CoreV1().Namespaces().Get(registryReleaseNamespace, metav1.GetOptions{})
9995
if err != nil {
100-
return err
101-
}
102-
}
103-
104-
_, err = helm.InstallChartByName(registryReleaseName, registryReleaseNamespace, "stable/docker-registry", "", registryReleaseValues)
105-
if err != nil {
106-
return fmt.Errorf("Unable to initialize docker registry: %s", err.Error())
107-
}
96+
// Create registry namespace
97+
_, err = kubectl.CoreV1().Namespaces().Create(&k8sv1.Namespace{
98+
ObjectMeta: metav1.ObjectMeta{
99+
Name: registryReleaseNamespace,
100+
},
101+
})
108102

109-
if registryConfig != nil && registryConfig.Auth != nil {
110-
registryAuth := registryConfig.Auth
111-
htpasswdSecretName := registryReleaseName + "-docker-registry-secret"
112-
htpasswdSecret, err := kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
103+
if err != nil {
104+
return err
105+
}
106+
}
113107

108+
_, err = helm.InstallChartByName(registryReleaseName, registryReleaseNamespace, "stable/docker-registry", "", registryReleaseValues)
114109
if err != nil {
115-
return fmt.Errorf("Unable to retrieve secret for docker registry: %s", err.Error())
110+
return fmt.Errorf("Unable to initialize docker registry: %s", err.Error())
116111
}
117112

118-
if htpasswdSecret == nil || htpasswdSecret.Data == nil {
119-
htpasswdSecret = &k8sv1.Secret{
120-
ObjectMeta: metav1.ObjectMeta{
121-
Name: htpasswdSecretName,
122-
},
123-
Data: map[string][]byte{},
113+
if registryConfig != nil && registryConfig.Auth != nil {
114+
registryAuth := registryConfig.Auth
115+
htpasswdSecretName := registryReleaseName + "-docker-registry-secret"
116+
htpasswdSecret, err := kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
117+
if err != nil {
118+
return fmt.Errorf("Unable to retrieve secret for docker registry: %s", err.Error())
124119
}
125-
}
126120

127-
oldHtpasswdData := htpasswdSecret.Data["htpasswd"]
128-
newHtpasswdData := htpasswd.HashedPasswords{}
121+
if htpasswdSecret == nil || htpasswdSecret.Data == nil {
122+
htpasswdSecret = &k8sv1.Secret{
123+
ObjectMeta: metav1.ObjectMeta{
124+
Name: htpasswdSecretName,
125+
},
126+
Data: map[string][]byte{},
127+
}
128+
}
129129

130-
if len(oldHtpasswdData) != 0 {
131-
oldHtpasswdDataBytes := []byte(oldHtpasswdData)
132-
newHtpasswdData, _ = htpasswd.ParseHtpasswd(oldHtpasswdDataBytes)
133-
}
130+
oldHtpasswdData := htpasswdSecret.Data["htpasswd"]
131+
newHtpasswdData := htpasswd.HashedPasswords{}
134132

135-
err = newHtpasswdData.SetPassword(*registryAuth.Username, *registryAuth.Password, htpasswd.HashBCrypt)
136-
if err != nil {
137-
return fmt.Errorf("Unable to set password in htpasswd: %s", err.Error())
138-
}
133+
if len(oldHtpasswdData) != 0 {
134+
oldHtpasswdDataBytes := []byte(oldHtpasswdData)
135+
newHtpasswdData, _ = htpasswd.ParseHtpasswd(oldHtpasswdDataBytes)
136+
}
139137

140-
newHtpasswdDataBytes := newHtpasswdData.Bytes()
138+
err = newHtpasswdData.SetPassword(*registryAuth.Username, *registryAuth.Password, htpasswd.HashBCrypt)
139+
if err != nil {
140+
return fmt.Errorf("Unable to set password in htpasswd: %s", err.Error())
141+
}
141142

142-
htpasswdSecret.Data["htpasswd"] = newHtpasswdDataBytes
143+
newHtpasswdDataBytes := newHtpasswdData.Bytes()
143144

144-
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
145-
if err != nil {
146-
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Create(htpasswdSecret)
147-
} else {
148-
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Update(htpasswdSecret)
149-
}
150-
}
151-
152-
if err != nil {
153-
return fmt.Errorf("Unable to update htpasswd secret: %s", err.Error())
154-
}
145+
htpasswdSecret.Data["htpasswd"] = newHtpasswdDataBytes
155146

156-
registryServiceName := registryReleaseName + "-docker-registry"
157-
serviceHostname := ""
158-
maxServiceWaiting := 60 * time.Second
159-
serviceWaitingInterval := 3 * time.Second
147+
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
148+
if err != nil {
149+
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Create(htpasswdSecret)
150+
} else {
151+
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Update(htpasswdSecret)
152+
}
153+
}
160154

161-
for true {
162-
registryService, err := kubectl.Core().Services(registryReleaseNamespace).Get(registryServiceName, metav1.GetOptions{})
163155
if err != nil {
164-
return err
156+
return fmt.Errorf("Unable to update htpasswd secret: %s", err.Error())
165157
}
166158

167-
if len(registryService.Spec.ClusterIP) > 0 {
168-
serviceHostname = registryService.Spec.ClusterIP + ":" + strconv.Itoa(registryPort)
169-
break
170-
}
159+
registryServiceName := registryReleaseName + "-docker-registry"
160+
serviceHostname := ""
161+
maxServiceWaiting := 60 * time.Second
162+
serviceWaitingInterval := 3 * time.Second
163+
164+
for true {
165+
registryService, err := kubectl.Core().Services(registryReleaseNamespace).Get(registryServiceName, metav1.GetOptions{})
166+
if err != nil {
167+
return err
168+
}
169+
170+
if len(registryService.Spec.ClusterIP) > 0 {
171+
serviceHostname = registryService.Spec.ClusterIP + ":" + strconv.Itoa(registryPort)
172+
break
173+
}
171174

172-
time.Sleep(serviceWaitingInterval)
173-
maxServiceWaiting = maxServiceWaiting - serviceWaitingInterval
175+
time.Sleep(serviceWaitingInterval)
176+
maxServiceWaiting = maxServiceWaiting - serviceWaitingInterval
174177

175-
if maxServiceWaiting <= 0 {
176-
return errors.New("Timeout waiting for registry service to start")
178+
if maxServiceWaiting <= 0 {
179+
return errors.New("Timeout waiting for registry service to start")
180+
}
177181
}
178-
}
179182

180-
ingressHostname := ""
181-
if registryReleaseValues != nil {
182-
registryValues := yamlq.NewQuery(*registryReleaseValues)
183-
isIngressEnabled, _ := registryValues.Bool("ingress", "enabled")
183+
ingressHostname := ""
184+
if registryReleaseValues != nil {
185+
registryValues := yamlq.NewQuery(*registryReleaseValues)
186+
isIngressEnabled, _ := registryValues.Bool("ingress", "enabled")
184187

185-
if isIngressEnabled {
186-
firstIngressHostname, _ := registryValues.String("ingress", "hosts", "0")
188+
if isIngressEnabled {
189+
firstIngressHostname, _ := registryValues.String("ingress", "hosts", "0")
187190

188-
if len(firstIngressHostname) > 0 {
189-
ingressHostname = firstIngressHostname
191+
if len(firstIngressHostname) > 0 {
192+
ingressHostname = firstIngressHostname
193+
}
190194
}
191195
}
192-
}
193196

194-
if len(ingressHostname) == 0 {
195-
registryConfig.URL = configutil.String(serviceHostname)
196-
registryConfig.Insecure = configutil.Bool(true)
197-
} else {
198-
registryConfig.URL = configutil.String(ingressHostname)
199-
registryConfig.Insecure = configutil.Bool(false)
197+
if len(ingressHostname) == 0 {
198+
registryConfig.URL = configutil.String(serviceHostname)
199+
registryConfig.Insecure = configutil.Bool(true)
200+
} else {
201+
registryConfig.URL = configutil.String(ingressHostname)
202+
registryConfig.Insecure = configutil.Bool(false)
203+
}
200204
}
201205

202-
// Wait till registry is started
203-
err = waitForRegistry(registryReleaseNamespace, registryServiceName, kubectl)
204-
if err != nil {
205-
return err
206+
// Wait for registry if it is not ready yet
207+
if registryDeployment == nil || registryDeployment.Status.Replicas == 0 || registryDeployment.Status.ReadyReplicas != registryDeployment.Status.Replicas {
208+
// Wait till registry is started
209+
err = waitForRegistry(registryReleaseNamespace, registryReleaseDeploymentName, kubectl)
210+
if err != nil {
211+
return err
212+
}
206213
}
207214

208215
return nil
@@ -216,11 +223,11 @@ func waitForRegistry(registryNamespace, registryReleaseDeploymentName string, cl
216223
defer log.StopWait()
217224

218225
for registryWaitingTime > 0 {
219-
registryDeloyment, err := client.ExtensionsV1beta1().Deployments(registryNamespace).Get(registryReleaseDeploymentName, metav1.GetOptions{})
226+
registryDeployment, err := client.ExtensionsV1beta1().Deployments(registryNamespace).Get(registryReleaseDeploymentName, metav1.GetOptions{})
220227
if err != nil {
221228
continue
222229
}
223-
if registryDeloyment.Status.ReadyReplicas == registryDeloyment.Status.Replicas {
230+
if registryDeployment.Status.ReadyReplicas == registryDeployment.Status.Replicas {
224231
return nil
225232
}
226233

0 commit comments

Comments
 (0)