forked from openshift/origin
/
validation.go
151 lines (123 loc) · 5.57 KB
/
validation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package validation
import (
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/validation"
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
deployapi "github.com/openshift/origin/pkg/deploy/api"
)
// TODO: These tests validate the ReplicationControllerState in a Deployment or DeploymentConfig.
// The upstream validation API isn't factored currently to allow this; we'll make a PR to
// upstream and fix when it goes in.
func ValidateDeployment(deployment *deployapi.Deployment) errors.ValidationErrorList {
errs := validateDeploymentStrategy(&deployment.Strategy).Prefix("strategy")
if len(deployment.Name) == 0 {
errs = append(errs, errors.NewFieldRequired("name"))
} else if !util.IsDNS1123Subdomain(deployment.Name) {
errs = append(errs, errors.NewFieldInvalid("name", deployment.Name, "name must be a valid subdomain"))
}
if len(deployment.Namespace) == 0 {
errs = append(errs, errors.NewFieldRequired("namespace"))
} else if !util.IsDNS1123Subdomain(deployment.Namespace) {
errs = append(errs, errors.NewFieldInvalid("namespace", deployment.Namespace, "namespace must be a valid subdomain"))
}
errs = append(errs, validation.ValidateLabels(deployment.Labels, "labels")...)
errs = append(errs, validation.ValidateReplicationControllerSpec(&deployment.ControllerTemplate).Prefix("controllerTemplate")...)
return errs
}
func ValidateDeploymentConfig(config *deployapi.DeploymentConfig) errors.ValidationErrorList {
errs := errors.ValidationErrorList{}
if len(config.Name) == 0 {
errs = append(errs, errors.NewFieldRequired("name"))
} else if !util.IsDNS1123Subdomain(config.Name) {
errs = append(errs, errors.NewFieldInvalid("name", config.Name, "name must be a valid subdomain"))
}
if len(config.Namespace) == 0 {
errs = append(errs, errors.NewFieldRequired("namespace"))
} else if !util.IsDNS1123Subdomain(config.Namespace) {
errs = append(errs, errors.NewFieldInvalid("namespace", config.Namespace, "namespace must be a valid subdomain"))
}
errs = append(errs, validation.ValidateLabels(config.Labels, "labels")...)
for i := range config.Triggers {
errs = append(errs, validateTrigger(&config.Triggers[i]).PrefixIndex(i).Prefix("triggers")...)
}
errs = append(errs, validateDeploymentStrategy(&config.Template.Strategy).Prefix("template.strategy")...)
errs = append(errs, validation.ValidateReplicationControllerSpec(&config.Template.ControllerTemplate).Prefix("template.controllerTemplate")...)
return errs
}
func ValidateDeploymentConfigRollback(rollback *deployapi.DeploymentConfigRollback) errors.ValidationErrorList {
result := errors.ValidationErrorList{}
if len(rollback.Spec.From.Name) == 0 {
result = append(result, errors.NewFieldRequired("spec.from.name"))
}
if len(rollback.Spec.From.Kind) == 0 {
rollback.Spec.From.Kind = "ReplicationController"
}
if rollback.Spec.From.Kind != "ReplicationController" {
result = append(result, errors.NewFieldInvalid("spec.from.kind", rollback.Spec.From.Kind, "the kind of the rollback target must be 'ReplicationController'"))
}
return result
}
func validateDeploymentStrategy(strategy *deployapi.DeploymentStrategy) errors.ValidationErrorList {
errs := errors.ValidationErrorList{}
if len(strategy.Type) == 0 {
errs = append(errs, errors.NewFieldRequired("type"))
}
switch strategy.Type {
case deployapi.DeploymentStrategyTypeCustom:
if strategy.CustomParams == nil {
errs = append(errs, errors.NewFieldRequired("customParams"))
} else {
errs = append(errs, validateCustomParams(strategy.CustomParams).Prefix("customParams")...)
}
}
return errs
}
func validateCustomParams(params *deployapi.CustomDeploymentStrategyParams) errors.ValidationErrorList {
errs := errors.ValidationErrorList{}
if len(params.Image) == 0 {
errs = append(errs, errors.NewFieldRequired("image"))
}
return errs
}
func validateTrigger(trigger *deployapi.DeploymentTriggerPolicy) errors.ValidationErrorList {
errs := errors.ValidationErrorList{}
if len(trigger.Type) == 0 {
errs = append(errs, errors.NewFieldRequired("type"))
}
if trigger.Type == deployapi.DeploymentTriggerOnImageChange {
if trigger.ImageChangeParams == nil {
errs = append(errs, errors.NewFieldRequired("imageChangeParams"))
} else {
errs = append(errs, validateImageChangeParams(trigger.ImageChangeParams).Prefix("imageChangeParams")...)
}
}
return errs
}
func validateImageChangeParams(params *deployapi.DeploymentTriggerImageChangeParams) errors.ValidationErrorList {
errs := errors.ValidationErrorList{}
if len(params.From.Name) != 0 {
if len(params.From.Kind) == 0 {
params.From.Kind = "ImageRepository"
}
if params.From.Kind != "ImageRepository" {
errs = append(errs, errors.NewFieldInvalid("from.kind", params.From.Kind, "only 'ImageRepository' is allowed"))
}
if !util.IsDNS1123Subdomain(params.From.Name) {
errs = append(errs, errors.NewFieldInvalid("from.name", params.From.Name, "name must be a valid subdomain"))
}
if len(params.From.Namespace) != 0 && !util.IsDNS1123Subdomain(params.From.Namespace) {
errs = append(errs, errors.NewFieldInvalid("from.namespace", params.From.Namespace, "namespace must be a valid subdomain"))
}
if len(params.RepositoryName) != 0 {
errs = append(errs, errors.NewFieldInvalid("repositoryName", params.RepositoryName, "only one of 'from', 'repository' name may be specified"))
}
} else {
if len(params.RepositoryName) == 0 {
errs = append(errs, errors.NewFieldRequired("from"))
}
}
if len(params.ContainerNames) == 0 {
errs = append(errs, errors.NewFieldRequired("containerNames"))
}
return errs
}