diff --git a/pkg/restore/restorers/service_restorer.go b/pkg/restore/restorers/service_restorer.go index 8f2d28e5..bc4f7797 100644 --- a/pkg/restore/restorers/service_restorer.go +++ b/pkg/restore/restorers/service_restorer.go @@ -45,7 +45,10 @@ func (sr *serviceRestorer) Prepare(obj runtime.Unstructured, restore *api.Restor return nil, nil, err } - delete(spec, "clusterIP") + // Since clusterIP is an optional key, we can ignore 'not found' errors. Also assuming it was a string already. + if val, _ := collections.GetString(spec, "clusterIP"); val != "None" { + delete(spec, "clusterIP") + } ports, err := collections.GetSlice(obj.UnstructuredContent(), "spec.ports") if err != nil { diff --git a/pkg/restore/restorers/service_restorer_test.go b/pkg/restore/restorers/service_restorer_test.go index d7c22ba5..096e44f6 100644 --- a/pkg/restore/restorers/service_restorer_test.go +++ b/pkg/restore/restorers/service_restorer_test.go @@ -42,6 +42,12 @@ func TestServiceRestorerPrepare(t *testing.T) { expectedErr: false, expectedRes: NewTestUnstructured().WithName("svc-1").WithSpec("foo").WithSpecField("ports", []interface{}{}).Unstructured, }, + { + name: "headless clusterIP should not be deleted from spec", + obj: NewTestUnstructured().WithName("svc-1").WithSpecField("clusterIP", "None").WithSpecField("ports", []interface{}{}).Unstructured, + expectedErr: false, + expectedRes: NewTestUnstructured().WithName("svc-1").WithSpecField("clusterIP", "None").WithSpecField("ports", []interface{}{}).Unstructured, + }, { name: "nodePort (only) should be deleted from all spec.ports", obj: NewTestUnstructured().WithName("svc-1").