| 365 | } |
| 366 | |
| 367 | func validateDev(config *latest.Config) error { |
| 368 | for devPodName, devPod := range config.Dev { |
| 369 | devPodName = strings.TrimSpace(devPodName) |
| 370 | if encoding.IsUnsafeName(devPodName) { |
| 371 | return fmt.Errorf("dev.%s has to match the following regex: %v", devPodName, encoding.UnsafeNameRegEx.String()) |
| 372 | } |
| 373 | if len(devPod.LabelSelector) == 0 && devPod.ImageSelector == "" { |
| 374 | return errors.Errorf("dev.%s: image selector and label selector are nil", devPodName) |
| 375 | } |
| 376 | |
| 377 | definedSelectors := 0 |
| 378 | if devPod.ImageSelector != "" { |
| 379 | definedSelectors++ |
| 380 | } |
| 381 | if len(devPod.LabelSelector) > 0 { |
| 382 | definedSelectors++ |
| 383 | } |
| 384 | if definedSelectors > 1 { |
| 385 | return errors.Errorf("dev.%s: image selector and label selector cannot be used together", devPodName) |
| 386 | } |
| 387 | |
| 388 | err := validateDevContainer(fmt.Sprintf("dev.%s", devPodName), &devPod.DevContainer, devPod, false) |
| 389 | if err != nil { |
| 390 | return err |
| 391 | } |
| 392 | if len(devPod.Containers) > 0 { |
| 393 | for i, c := range devPod.Containers { |
| 394 | err := validateDevContainer(fmt.Sprintf("dev.%s.containers[%s]", devPodName, i), c, devPod, true) |
| 395 | if err != nil { |
| 396 | return err |
| 397 | } |
| 398 | } |
| 399 | } |
| 400 | } |
| 401 | |
| 402 | return nil |
| 403 | } |
| 404 | |
| 405 | func validateDevContainer(path string, devContainer *latest.DevContainer, devPod *latest.DevPod, nameRequired bool) error { |
| 406 | if nameRequired && devContainer.Container == "" { |