Skip to content

Commit 8fa39dc

Browse files
committed
fix: return error when a field is both in DevPod and DevContainer
Signed-off-by: Luca Di Maio <luca.dimaio1@gmail.com>
1 parent 361607c commit 8fa39dc

3 files changed

Lines changed: 79 additions & 5 deletions

File tree

pkg/devspace/config/versions/validate.go

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package versions
22

33
import (
44
"fmt"
5+
"reflect"
56
"strings"
7+
"unicode"
68

79
jsonyaml "github.com/ghodss/yaml"
810
"github.com/pkg/errors"
@@ -365,13 +367,13 @@ func validateDev(config *latest.Config) error {
365367
return errors.Errorf("dev.%s: image selector and label selector cannot be used together", devPodName)
366368
}
367369

368-
err := validateDevContainer(fmt.Sprintf("dev.%s", devPodName), &devPod.DevContainer, false)
370+
err := validateDevContainer(fmt.Sprintf("dev.%s", devPodName), &devPod.DevContainer, devPod, false)
369371
if err != nil {
370372
return err
371373
}
372374
if len(devPod.Containers) > 0 {
373375
for i, c := range devPod.Containers {
374-
err := validateDevContainer(fmt.Sprintf("dev.%s.containers[%s]", devPodName, i), c, true)
376+
err := validateDevContainer(fmt.Sprintf("dev.%s.containers[%s]", devPodName, i), c, devPod, true)
375377
if err != nil {
376378
return err
377379
}
@@ -382,14 +384,21 @@ func validateDev(config *latest.Config) error {
382384
return nil
383385
}
384386

385-
func validateDevContainer(path string, devContainer *latest.DevContainer, nameRequired bool) error {
387+
func validateDevContainer(path string, devContainer *latest.DevContainer, devPod *latest.DevPod, nameRequired bool) error {
386388
if nameRequired && devContainer.Container == "" {
387389
return errors.Errorf("%s.container is required", path)
388390
}
389391

390392
if !ValidContainerArch(devContainer.Arch) {
391393
return errors.Errorf("%s.arch is not valid '%s'", path, devContainer.Arch)
392394
}
395+
396+
// check if there are values from devContainers that are overwriting values from devPod
397+
err := validatePodContainerDuplicates(path, devContainer, devPod)
398+
if err != nil {
399+
return err
400+
}
401+
393402
for index, sync := range devContainer.Sync {
394403
// Validate initial sync strategy
395404
if !ValidInitialSyncStrategy(sync.InitialSync) {
@@ -431,3 +440,36 @@ func validateDevContainer(path string, devContainer *latest.DevContainer, nameRe
431440

432441
return nil
433442
}
443+
444+
func validatePodContainerDuplicates(path string, devContainer *latest.DevContainer, devPod *latest.DevPod) error {
445+
if devContainer.Container == "" {
446+
return nil
447+
}
448+
449+
// Extract list of fields from DevContainer struct
450+
fields := reflect.VisibleFields(reflect.TypeOf(struct{ latest.DevContainer }{}))
451+
452+
// Make possible to retrieve fields from struct programmatically
453+
devContainerField := reflect.ValueOf(*devContainer)
454+
devPodField := reflect.ValueOf(*devPod)
455+
456+
// iterate trough fields, if a devContainer field is set in devPod,
457+
// then report error about overwriting
458+
for _, field := range fields {
459+
// skip the DevContainer field, check then if a field is valid and set
460+
if field.Name != "DevContainer" && field.Name != "Container" &&
461+
devPodField.FieldByName(field.Name).IsValid() && !devPodField.FieldByName(field.Name).IsZero() &&
462+
!reflect.DeepEqual(devPodField.FieldByName(field.Name).Interface(), devContainerField.FieldByName(field.Name).Interface()) {
463+
464+
// get DevPod path
465+
fieldName := string(unicode.ToLower(rune(field.Name[0]))) + field.Name[1:]
466+
pathFields := strings.Split(path, ".")
467+
pathFields = pathFields[:len(pathFields)-1]
468+
sourcepath := strings.Join(pathFields, ".")
469+
470+
return errors.Errorf("%s.%s will be overwritten by %s, please specify %s.%s instead", sourcepath, fieldName, path, path, fieldName)
471+
}
472+
}
473+
474+
return nil
475+
}

pkg/devspace/config/versions/validate_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,36 @@ func TestValidateDev(t *testing.T) {
140140

141141
err = validateDev(config)
142142
assert.Error(t, err, "dev.test: image selector and label selector are nil")
143+
144+
// test devpod overwritten by devcontainer
145+
config = &latest.Config{
146+
Dev: map[string]*latest.DevPod{
147+
"somename": {
148+
Name: "somename",
149+
LabelSelector: map[string]string{
150+
"app": "MeApp",
151+
},
152+
DevContainer: latest.DevContainer{
153+
ReversePorts: []*latest.PortMapping{
154+
{
155+
Port: fmt.Sprintf("%v:%v", 8080, 8080),
156+
},
157+
},
158+
},
159+
Containers: map[string]*latest.DevContainer{
160+
"test": {
161+
Container: "test",
162+
ReversePorts: []*latest.PortMapping{
163+
{
164+
Port: fmt.Sprintf("%v:%v", 8081, 8081),
165+
},
166+
},
167+
},
168+
},
169+
},
170+
},
171+
}
172+
173+
err = validateDev(config)
174+
assert.Error(t, err, "dev.somename.reversePorts will be overwritten by dev.somename.containers[test], please specify dev.somename.containers[test].reversePorts instead")
143175
}

pkg/util/progressreader/progressreader.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func (r *ProgressReader) Read(p []byte) (int, error) {
3434
if r.transferStep.IsZero() || time.Now().Second() >= (r.transferStep.Second()+3) {
3535
r.transferStep = time.Now()
3636

37-
r.Ctx.Log().Info("Uploaded " + toHumanReadable(r.total) + " " + r.Rate()+ "\r")
37+
r.Ctx.Log().Info("Uploaded " + toHumanReadable(r.total) + " " + r.Rate() + "\r")
3838
}
3939
}
4040

@@ -51,7 +51,7 @@ func (r *ProgressReader) Rate() string {
5151
if end.IsZero() {
5252
end = time.Now()
5353
}
54-
return toHumanReadable(int64((float64(r.total)/(end.Sub(r.transferStart).Seconds())))) + "/s"
54+
return toHumanReadable(int64((float64(r.total) / (end.Sub(r.transferStart).Seconds())))) + "/s"
5555
}
5656

5757
// convert bytes input to a human readable format (Gb,Mb,Kb,b)

0 commit comments

Comments
 (0)