diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index e0c019a9cf5..f52e55405ba 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -3476,6 +3476,16 @@ func ValidateNodeUpdate(node, oldNode *api.Node) field.ErrorList { allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "podCIDR"), "node updates may not change podCIDR except from \"\" to valid")) } } + + // Allow controller manager updating provider ID when not set + if len(oldNode.Spec.ProviderID) == 0 { + oldNode.Spec.ProviderID = node.Spec.ProviderID + } else { + if oldNode.Spec.ProviderID != node.Spec.ProviderID { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "providerID"), "node updates may not change providerID 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 diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 24557e72e7b..065af85d543 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -8375,6 +8375,33 @@ func TestValidateNodeUpdate(t *testing.T) { }, }, }, false}, + {api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "update-provider-id-when-not-set", + }, + }, api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "update-provider-id-when-not-set", + }, + Spec: api.NodeSpec{ + ProviderID: "provider:///new", + }, + }, true}, + {api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "update-provider-id-when-set", + }, + Spec: api.NodeSpec{ + ProviderID: "provider:///old", + }, + }, api.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "update-provider-id-when-set", + }, + Spec: api.NodeSpec{ + ProviderID: "provider:///new", + }, + }, false}, } for i, test := range tests { test.oldNode.ObjectMeta.ResourceVersion = "1"