diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 5e07a458729..5c24cd3f1ca 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -3437,6 +3437,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 d7038753f30..d6603a00aab 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -8245,6 +8245,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"