Skip to content

Commit 14b5533

Browse files
authored
Merge pull request #217 from covexo/fixes
Resolve #204 & fix problem with forced deploy
2 parents 6748c06 + a948011 commit 14b5533

8 files changed

Lines changed: 128 additions & 151 deletions

File tree

cmd/init.go

Lines changed: 98 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -399,148 +399,139 @@ func (cmd *InitCmd) configureKubernetes() {
399399

400400
func (cmd *InitCmd) configureRegistry() {
401401
internalRegistryConfig := cmd.config.Services.InternalRegistry
402-
403-
enableAutomaticBuilds := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
404-
Question: "Do you want to enable automatic Docker image building?",
402+
createInternalRegistry := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
403+
Question: "Should we create a private registry within your Kubernetes cluster for you? (yes | no)",
405404
DefaultValue: "yes",
406405
ValidationRegexPattern: "^(yes)|(no)$",
407406
})
408407

409-
if *enableAutomaticBuilds == "yes" {
410-
internalRegistryKey := "internal registry"
411-
defaultRegistryValue := internalRegistryKey
412-
413-
if cmd.defaultRegistry.URL != nil {
414-
defaultRegistryValue = *cmd.defaultRegistry.URL
415-
}
408+
if *createInternalRegistry == "no" {
416409
registryURL := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
417-
Question: "Which registry do you want to push to? ('internal registry', 'hub.docker.com' or URL)",
418-
DefaultValue: defaultRegistryValue,
410+
Question: "Which registry do you want to push to? ('hub.docker.com' or URL)",
411+
DefaultValue: "hub.docker.com",
419412
ValidationRegexPattern: "^.*$",
420413
})
421414

422-
if *registryURL != internalRegistryKey {
423-
cmd.defaultRegistry.URL = registryURL
424-
internalRegistryConfig = nil
415+
cmd.defaultRegistry.URL = registryURL
416+
internalRegistryConfig = nil
425417

426-
if *registryURL == "hub.docker.com" {
427-
defaultImageName := *cmd.defaultImage.Name
428-
defaultImageNameParts := strings.Split(defaultImageName, "/")
429-
existingDockerUsername := ""
430-
431-
if len(defaultImageNameParts) > 1 {
432-
existingDockerUsername = defaultImageNameParts[0]
433-
}
418+
if *registryURL == "hub.docker.com" {
419+
defaultImageName := *cmd.defaultImage.Name
420+
defaultImageNameParts := strings.Split(defaultImageName, "/")
421+
existingDockerUsername := ""
434422

435-
dockerUsername := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
436-
Question: "What is your Docker username?",
437-
DefaultValue: existingDockerUsername,
438-
ValidationRegexPattern: "^[a-zA-Z0-9]{4,30}$",
439-
})
440-
cmd.defaultImage.Name = configutil.String(*dockerUsername + "/" + strings.TrimPrefix(defaultImageName, *dockerUsername))
423+
if len(defaultImageNameParts) > 1 {
424+
existingDockerUsername = defaultImageNameParts[0]
441425
}
442-
} else {
443-
imageMap := *cmd.config.Images
444-
defaultImageConf, defaultImageExists := imageMap["default"]
445426

446-
if defaultImageExists {
447-
defaultImageConf.Registry = configutil.String("internal")
448-
}
427+
dockerUsername := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
428+
Question: "What is your Docker username?",
429+
DefaultValue: existingDockerUsername,
430+
ValidationRegexPattern: "^[a-zA-Z0-9]{4,30}$",
431+
})
432+
cmd.defaultImage.Name = configutil.String(*dockerUsername + "/" + strings.TrimPrefix(defaultImageName, *dockerUsername))
433+
}
434+
} else {
435+
imageMap := *cmd.config.Images
436+
defaultImageConf, defaultImageExists := imageMap["default"]
449437

450-
if internalRegistryConfig == nil {
451-
internalRegistryConfig = &v1.InternalRegistry{
452-
Release: &v1.Release{},
453-
}
454-
cmd.config.Services.InternalRegistry = internalRegistryConfig
455-
}
438+
if defaultImageExists {
439+
defaultImageConf.Registry = configutil.String("internal")
440+
}
456441

457-
if internalRegistryConfig.Release.Name == nil {
458-
internalRegistryConfig.Release.Name = configutil.String("devspace-registry")
442+
if internalRegistryConfig == nil {
443+
internalRegistryConfig = &v1.InternalRegistry{
444+
Release: &v1.Release{},
459445
}
446+
cmd.config.Services.InternalRegistry = internalRegistryConfig
447+
}
460448

461-
if internalRegistryConfig.Release.Namespace == nil {
462-
internalRegistryConfig.Release.Namespace = cmd.config.DevSpace.Release.Namespace
463-
}
464-
overwriteRegistryMap := *cmd.overwriteConfig.Registries
449+
if internalRegistryConfig.Release.Name == nil {
450+
internalRegistryConfig.Release.Name = configutil.String("devspace-registry")
451+
}
465452

466-
overwriteRegistryConfig, overwriteRegistryConfigFound := overwriteRegistryMap["internal"]
453+
if internalRegistryConfig.Release.Namespace == nil {
454+
internalRegistryConfig.Release.Namespace = cmd.config.DevSpace.Release.Namespace
455+
}
456+
overwriteRegistryMap := *cmd.overwriteConfig.Registries
467457

468-
if !overwriteRegistryConfigFound {
469-
overwriteRegistryConfig = &v1.RegistryConfig{
470-
Auth: &v1.RegistryAuth{},
471-
}
472-
overwriteRegistryMap["internal"] = overwriteRegistryConfig
458+
overwriteRegistryConfig, overwriteRegistryConfigFound := overwriteRegistryMap["internal"]
459+
460+
if !overwriteRegistryConfigFound {
461+
overwriteRegistryConfig = &v1.RegistryConfig{
462+
Auth: &v1.RegistryAuth{},
473463
}
474-
registryAuth := overwriteRegistryConfig.Auth
464+
overwriteRegistryMap["internal"] = overwriteRegistryConfig
465+
}
466+
registryAuth := overwriteRegistryConfig.Auth
475467

476-
if registryAuth.Username == nil {
477-
randomUserSuffix, err := randutil.GenerateRandomString(5)
468+
if registryAuth.Username == nil {
469+
randomUserSuffix, err := randutil.GenerateRandomString(5)
478470

479-
if err != nil {
480-
log.Fatalf("Error creating random username: %s", err.Error())
481-
}
482-
registryAuth.Username = configutil.String("user-" + randomUserSuffix)
471+
if err != nil {
472+
log.Fatalf("Error creating random username: %s", err.Error())
483473
}
474+
registryAuth.Username = configutil.String("user-" + randomUserSuffix)
475+
}
484476

485-
if registryAuth.Password == nil {
486-
randomPassword, err := randutil.GenerateRandomString(12)
477+
if registryAuth.Password == nil {
478+
randomPassword, err := randutil.GenerateRandomString(12)
487479

488-
if err != nil {
489-
log.Fatalf("Error creating random password: %s", err.Error())
490-
}
491-
registryAuth.Password = &randomPassword
480+
if err != nil {
481+
log.Fatalf("Error creating random password: %s", err.Error())
492482
}
493-
var registryReleaseValues map[interface{}]interface{}
494-
495-
if internalRegistryConfig.Release.Values != nil {
496-
registryReleaseValues = *internalRegistryConfig.Release.Values
497-
} else {
498-
registryReleaseValues = map[interface{}]interface{}{}
499-
500-
registryDomain := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
501-
Question: "Which domain should your container registry be using? (optional, requires an ingress controller)",
502-
ValidationRegexPattern: "^(([a-z0-9]([a-z0-9-]{0,120}[a-z0-9])?\\.)+[a-z0-9]{2,})?$",
503-
})
504-
505-
if *registryDomain != "" {
506-
registryReleaseValues = map[interface{}]interface{}{
507-
"Ingress": map[string]interface{}{
508-
"Enabled": true,
509-
"Hosts": []string{
510-
*registryDomain,
511-
},
512-
"Annotations": map[string]string{
513-
"Kubernetes.io/tls-acme": "true",
514-
},
515-
"Tls": []map[string]interface{}{
516-
map[string]interface{}{
517-
"SecretName": "tls-devspace-registry",
518-
"Hosts": []string{
519-
*registryDomain,
520-
},
483+
registryAuth.Password = &randomPassword
484+
}
485+
var registryReleaseValues map[interface{}]interface{}
486+
487+
if internalRegistryConfig.Release.Values != nil {
488+
registryReleaseValues = *internalRegistryConfig.Release.Values
489+
} else {
490+
registryReleaseValues = map[interface{}]interface{}{}
491+
492+
registryDomain := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
493+
Question: "Which domain should your container registry be using? (optional, requires an ingress controller)",
494+
ValidationRegexPattern: "^(([a-z0-9]([a-z0-9-]{0,120}[a-z0-9])?\\.)+[a-z0-9]{2,})?$",
495+
})
496+
497+
if *registryDomain != "" {
498+
registryReleaseValues = map[interface{}]interface{}{
499+
"Ingress": map[string]interface{}{
500+
"Enabled": true,
501+
"Hosts": []string{
502+
*registryDomain,
503+
},
504+
"Annotations": map[string]string{
505+
"Kubernetes.io/tls-acme": "true",
506+
},
507+
"Tls": []map[string]interface{}{
508+
map[string]interface{}{
509+
"SecretName": "tls-devspace-registry",
510+
"Hosts": []string{
511+
*registryDomain,
521512
},
522513
},
523514
},
524-
}
515+
},
525516
}
526517
}
527-
secrets, registryHasSecrets := registryReleaseValues["secrets"]
518+
}
519+
secrets, registryHasSecrets := registryReleaseValues["secrets"]
528520

529-
if !registryHasSecrets {
530-
secrets = map[interface{}]interface{}{}
531-
registryReleaseValues["secrets"] = secrets
532-
}
533-
secretMap, secretsIsMap := secrets.(map[interface{}]interface{})
521+
if !registryHasSecrets {
522+
secrets = map[interface{}]interface{}{}
523+
registryReleaseValues["secrets"] = secrets
524+
}
525+
secretMap, secretsIsMap := secrets.(map[interface{}]interface{})
534526

535-
if secretsIsMap {
536-
_, registryHasSecretHtpasswd := secretMap["htpasswd"]
527+
if secretsIsMap {
528+
_, registryHasSecretHtpasswd := secretMap["htpasswd"]
537529

538-
if !registryHasSecretHtpasswd {
539-
secretMap["htpasswd"] = ""
540-
}
530+
if !registryHasSecretHtpasswd {
531+
secretMap["htpasswd"] = ""
541532
}
542-
internalRegistryConfig.Release.Values = &registryReleaseValues
543533
}
534+
internalRegistryConfig.Release.Values = &registryReleaseValues
544535
}
545536
}
546537

cmd/up.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (cmd *UpCmd) Run(cobraCmd *cobra.Command, args []string) {
141141
if cmd.flags.initRegistries {
142142
cmd.initRegistries()
143143
}
144-
mustRedeploy := cmd.flags.deploy
144+
mustRedeploy := false
145145

146146
if cmd.flags.build {
147147
mustRedeploy = cmd.buildImages(cobraCmd.Flags().Changed("build"))
@@ -150,7 +150,7 @@ func (cmd *UpCmd) Run(cobraCmd *cobra.Command, args []string) {
150150
// Check if we find a running release pod
151151
pod, err := getRunningDevSpacePod(cmd.helm, cmd.kubectl)
152152

153-
if err != nil || mustRedeploy {
153+
if err != nil || mustRedeploy || cmd.flags.deploy {
154154
cmd.deployChart()
155155
} else {
156156
cmd.pod = pod

pkg/devspace/sync/evaluater.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ func shouldUpload(relativePath string, stat os.FileInfo, s *SyncConfig, isInitia
7575

7676
if isInitial {
7777
// File is older locally than remote so don't update remote
78-
if ceilMtime(stat.ModTime()) <= s.fileIndex.fileMap[relativePath].Mtime+1 {
78+
if roundMtime(stat.ModTime()) <= s.fileIndex.fileMap[relativePath].Mtime {
7979
return false
8080
}
8181
} else {
8282
// File did not change or was changed by downstream
83-
if ceilMtime(stat.ModTime()) == s.fileIndex.fileMap[relativePath].Mtime && stat.Size() == s.fileIndex.fileMap[relativePath].Size {
83+
if roundMtime(stat.ModTime()) == s.fileIndex.fileMap[relativePath].Mtime && stat.Size() == s.fileIndex.fileMap[relativePath].Size {
8484
return false
8585
}
8686
}
@@ -140,35 +140,47 @@ func shouldDownload(fileInformation *fileInformation, s *SyncConfig) bool {
140140
// - The file is present on the filesystem and did not change in terms of size and mtime on the filesystem
141141
func shouldRemoveLocal(absFilepath string, fileInformation *fileInformation, s *SyncConfig) bool {
142142
if fileInformation == nil {
143+
s.Logf("Skip %s because fileInformation is nil", absFilepath)
143144
return false
144145
}
145146

147+
// We don't need to check s.ignoreMatcher, because if a path is ignored it will never be added to the fileMap, because shouldDownload
148+
// and shouldUpload are always false, and hence it never appears in the fileMap and is not copied to the remove fileMap clone
149+
// in the beginning of the downstream mainLoop
150+
146151
// Exclude files on the exclude list
147152
if s.downloadIgnoreMatcher != nil {
148153
if s.downloadIgnoreMatcher.MatchesPath(fileInformation.Name) {
154+
s.Logf("Skip %s because downloadIgnoreMatcher matched", absFilepath)
149155
return false
150156
}
151157
}
152158

153159
// Only delete if mtime and size did not change
154160
stat, err := os.Stat(absFilepath)
155161
if err != nil {
162+
s.Logf("Skip %s because stat returned %v", absFilepath, stat)
156163
return false
157164
}
158165

159166
// We don't delete the file if we haven't tracked it
160167
if stat != nil && s.fileIndex.fileMap[fileInformation.Name] != nil {
161168
if stat.IsDir() != s.fileIndex.fileMap[fileInformation.Name].IsDirectory || stat.IsDir() != fileInformation.IsDirectory {
169+
s.Logf("Skip %s because stat returned unequal isdir with fileMap", absFilepath)
162170
return false
163171
}
164172

165173
if fileInformation.IsDirectory == false {
166174
// We don't delete the file if it has changed in the map since we collected changes
167175
if fileInformation.Mtime == s.fileIndex.fileMap[fileInformation.Name].Mtime && fileInformation.Size == s.fileIndex.fileMap[fileInformation.Name].Size {
168176
// We don't delete the file if it has changed on the filesystem meanwhile
169-
if ceilMtime(stat.ModTime()) <= fileInformation.Mtime {
177+
if roundMtime(stat.ModTime()) <= fileInformation.Mtime {
170178
return true
171179
}
180+
181+
s.Logf("Skip %s because stat.ModTime() %d is greater than fileInformation.Mtime %d", absFilepath, roundMtime(stat.ModTime()), fileInformation.Mtime)
182+
} else {
183+
s.Logf("Skip %s because Mtime (%d and %d) or Size (%d and %d) is unequal between fileInformation and fileMap", absFilepath, fileInformation.Mtime, s.fileIndex.fileMap[fileInformation.Name].Mtime, fileInformation.Size, s.fileIndex.fileMap[fileInformation.Name].Size)
172184
}
173185
} else {
174186
return true

pkg/devspace/sync/sync_config.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,11 +308,11 @@ func (s *SyncConfig) diffServerClient(filepath string, sendChanges *[]*fileInfor
308308
if s.uploadIgnoreMatcher.MatchesPath(relativePath) {
309309
s.fileIndex.fileMapMutex.Lock()
310310
// Add to file map and prevent download if local file is newer than the remote one
311-
if s.fileIndex.fileMap[relativePath] != nil && s.fileIndex.fileMap[relativePath].Mtime < ceilMtime(stat.ModTime()) {
311+
if s.fileIndex.fileMap[relativePath] != nil && s.fileIndex.fileMap[relativePath].Mtime < roundMtime(stat.ModTime()) {
312312
// Add it to the fileMap
313313
s.fileIndex.fileMap[relativePath] = &fileInformation{
314314
Name: relativePath,
315-
Mtime: ceilMtime(stat.ModTime()),
315+
Mtime: roundMtime(stat.ModTime()),
316316
Size: stat.Size(),
317317
IsDirectory: stat.IsDir(),
318318
}
@@ -338,7 +338,7 @@ func (s *SyncConfig) diffServerClient(filepath string, sendChanges *[]*fileInfor
338338
// Add file to upload
339339
*sendChanges = append(*sendChanges, &fileInformation{
340340
Name: relativePath,
341-
Mtime: ceilMtime(stat.ModTime()),
341+
Mtime: roundMtime(stat.ModTime()),
342342
Size: stat.Size(),
343343
IsDirectory: false,
344344
})
@@ -358,7 +358,7 @@ func (s *SyncConfig) diffDir(filepath string, stat os.FileInfo, sendChanges *[]*
358358
if len(files) == 0 && relativePath != "" {
359359
*sendChanges = append(*sendChanges, &fileInformation{
360360
Name: relativePath,
361-
Mtime: ceilMtime(stat.ModTime()),
361+
Mtime: roundMtime(stat.ModTime()),
362362
Size: stat.Size(),
363363
IsDirectory: true,
364364
})

pkg/devspace/sync/sync_config_test.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -611,21 +611,3 @@ func TestRemoveDirInFileMap(t *testing.T) {
611611
t.Fail()
612612
}
613613
}
614-
615-
func TestCeilMtime(t *testing.T) {
616-
ceiledNumberNano := time.Unix(1533647574, 0)
617-
ceiledNumberSeconds := time.Unix(1533647574, 0)
618-
619-
unceiledNumberNano := time.Unix(1533647574, 1)
620-
unceiledNumberSeconds := time.Unix(1533647575, 0)
621-
622-
if ceilMtime(ceiledNumberNano) != ceiledNumberSeconds.Unix() {
623-
t.Error("ceilMtime failed ceiledNumberNano != ceiledNumberSeconds")
624-
t.Fail()
625-
}
626-
627-
if ceilMtime(unceiledNumberNano) != unceiledNumberSeconds.Unix() {
628-
t.Error("ceilMtime failed unceiledNumberNano != unceiledNumberSeconds")
629-
t.Fail()
630-
}
631-
}

0 commit comments

Comments
 (0)