Update types, add defaulting code, conversions and validation.
This commit is contained in:
@@ -283,6 +283,13 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
validSelector2 := map[string]string{"c": "d"}
|
||||
invalidSelector := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"}
|
||||
|
||||
validUpdateStrategy := extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(1),
|
||||
},
|
||||
}
|
||||
|
||||
validPodSpecAbc := api.PodSpec{
|
||||
RestartPolicy: api.RestartPolicyAlways,
|
||||
DNSPolicy: api.DNSClusterFirst,
|
||||
@@ -368,15 +375,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -384,15 +393,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector2},
|
||||
Template: &validPodTemplateAbc2.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector2},
|
||||
Template: &validPodTemplateAbc2.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -400,15 +411,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateNodeSelector.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateNodeSelector.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -425,15 +438,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -441,15 +456,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: invalidSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: invalidSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -457,15 +474,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &invalidPodTemplate.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &invalidPodTemplate.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -473,15 +492,17 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateDef.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateDef.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -489,15 +510,38 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &readWriteVolumePodTemplate.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &readWriteVolumePodTemplate.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy": {
|
||||
old: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
update: extensions.DaemonSet{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: invalidSelector},
|
||||
Template: &validPodTemplateAbc.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -511,6 +555,12 @@ func TestValidateDaemonSetUpdate(t *testing.T) {
|
||||
|
||||
func TestValidateDaemonSet(t *testing.T) {
|
||||
validSelector := map[string]string{"a": "b"}
|
||||
validUpdateStrategy := extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(1),
|
||||
},
|
||||
}
|
||||
validPodTemplate := api.PodTemplate{
|
||||
Template: api.PodTemplateSpec{
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
@@ -539,15 +589,17 @@ func TestValidateDaemonSet(t *testing.T) {
|
||||
{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
{
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc-123", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: validUpdateStrategy,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -585,7 +637,7 @@ func TestValidateDaemonSet(t *testing.T) {
|
||||
Template: &validPodTemplate.Template,
|
||||
},
|
||||
},
|
||||
"invalid manifest": {
|
||||
"invalid template": {
|
||||
ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: api.NamespaceDefault},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
@@ -667,6 +719,104 @@ func TestValidateDaemonSet(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - Type is not RollingUpdate": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: "",
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(1),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - RollingUpdate field is nil": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - MaxUnavailable is 0": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(0),
|
||||
MinReadySeconds: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - MaxUnavailable is greater than 100%": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromString("150%"),
|
||||
MinReadySeconds: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - MaxUnavailable is negative": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(-1),
|
||||
MinReadySeconds: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"invalid update strategy - MinReadySeconds is negative": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "abc-123",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: extensions.DaemonSetSpec{
|
||||
Selector: &extensions.LabelSelector{MatchLabels: validSelector},
|
||||
Template: &validPodTemplate.Template,
|
||||
UpdateStrategy: extensions.DaemonSetUpdateStrategy{
|
||||
Type: extensions.RollingUpdateDaemonSetStrategyType,
|
||||
RollingUpdate: &extensions.RollingUpdateDaemonSet{
|
||||
MaxUnavailable: intstr.FromInt(-1),
|
||||
MinReadySeconds: -1,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for k, v := range errorCases {
|
||||
errs := ValidateDaemonSet(&v)
|
||||
@@ -676,6 +826,7 @@ func TestValidateDaemonSet(t *testing.T) {
|
||||
for i := range errs {
|
||||
field := errs[i].Field
|
||||
if !strings.HasPrefix(field, "spec.template.") &&
|
||||
!strings.HasPrefix(field, "spec.updateStrategy") &&
|
||||
field != "metadata.name" &&
|
||||
field != "metadata.namespace" &&
|
||||
field != "spec.selector" &&
|
||||
|
Reference in New Issue
Block a user