From 470d7af8c9d8921b2a61b6d56a52756a5ac7e860 Mon Sep 17 00:00:00 2001 From: mqliang Date: Sun, 31 Jan 2016 11:49:31 +0800 Subject: [PATCH] pod cidr validation --- pkg/api/validation/validation.go | 10 +++++++-- pkg/api/validation/validation_test.go | 30 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 4594a7cffda..414a59ce730 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1729,13 +1729,19 @@ func ValidateNodeUpdate(node, oldNode *api.Node) field.ErrorList { addresses[address] = true } + if len(oldNode.Spec.PodCIDR) == 0 { + // Allow the controller manager to assign a CIDR to a node if it doesn't have one. + oldNode.Spec.PodCIDR = node.Spec.PodCIDR + } else { + if oldNode.Spec.PodCIDR != node.Spec.PodCIDR { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "podCIDR"), "node updates may not change podCIDR except from \"\" to valid")) + } + } // TODO: move reset function to its own location // Ignore metadata changes now that they have been tested oldNode.ObjectMeta = node.ObjectMeta // Allow users to update capacity oldNode.Status.Capacity = node.Status.Capacity - // Allow the controller manager to assign a CIDR to a node. - oldNode.Spec.PodCIDR = node.Spec.PodCIDR // Allow users to unschedule node oldNode.Spec.Unschedulable = node.Spec.Unschedulable // Clear status diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 2566fa369a4..3b2d5678f15 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -3035,6 +3035,36 @@ func TestValidateNodeUpdate(t *testing.T) { Labels: map[string]string{"foo": "baz"}, }, }, true}, + {api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Spec: api.NodeSpec{ + PodCIDR: "", + }, + }, api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Spec: api.NodeSpec{ + PodCIDR: "192.168.0.0/16", + }, + }, true}, + {api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Spec: api.NodeSpec{ + PodCIDR: "192.123.0.0/16", + }, + }, api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "foo", + }, + Spec: api.NodeSpec{ + PodCIDR: "192.168.0.0/16", + }, + }, false}, {api.Node{ ObjectMeta: api.ObjectMeta{ Name: "foo",