don't remove annotations from PVs on restore

Signed-off-by: Steve Kriss <steve@heptio.com>
pull/263/head
Steve Kriss 2017-12-21 13:23:48 -08:00
parent 7cc73fb9d2
commit 8878ba860e
2 changed files with 26 additions and 53 deletions

View File

@ -628,7 +628,7 @@ func (ctx *context) restoreResource(resource, namespace, resourcePath string) (a
}
// clear out non-core metadata fields & status
if obj, err = resetMetadataAndStatus(obj, true); err != nil {
if obj, err = resetMetadataAndStatus(obj); err != nil {
addToResult(&errs, namespace, err)
continue
}
@ -676,15 +676,6 @@ func (ctx *context) executePVAction(obj *unstructured.Unstructured) (*unstructur
return nil, err
}
metadata, err := collections.GetMap(obj.UnstructuredContent(), "metadata")
if err != nil {
return nil, err
}
// We need to remove annotations from PVs since they potentially contain
// information about dynamic provisioners which will confuse the controllers.
delete(metadata, "annotations")
delete(spec, "claimRef")
delete(spec, "storageClassName")
@ -740,18 +731,18 @@ func isPVReady(obj runtime.Unstructured) bool {
return phase == string(v1.VolumeAvailable)
}
func resetMetadataAndStatus(obj *unstructured.Unstructured, keepAnnotations bool) (*unstructured.Unstructured, error) {
func resetMetadataAndStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
metadata, err := collections.GetMap(obj.UnstructuredContent(), "metadata")
if err != nil {
return nil, err
}
for k := range metadata {
if k == "name" || k == "namespace" || k == "labels" || (k == "annotations" && keepAnnotations) {
continue
switch k {
case "name", "namespace", "labels", "annotations":
default:
delete(metadata, k)
}
delete(metadata, k)
}
// this should never be backed up anyway, but remove it just

View File

@ -641,51 +641,33 @@ func TestHasControllerOwner(t *testing.T) {
func TestResetMetadataAndStatus(t *testing.T) {
tests := []struct {
name string
obj *unstructured.Unstructured
keepAnnotations bool
expectedErr bool
expectedRes *unstructured.Unstructured
name string
obj *unstructured.Unstructured
expectedErr bool
expectedRes *unstructured.Unstructured
}{
{
name: "no metadata causes error",
obj: NewTestUnstructured().Unstructured,
keepAnnotations: false,
expectedErr: true,
name: "no metadata causes error",
obj: NewTestUnstructured().Unstructured,
expectedErr: true,
},
{
name: "don't keep annotations",
obj: NewTestUnstructured().WithMetadata("name", "namespace", "labels", "annotations").Unstructured,
keepAnnotations: false,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata("name", "namespace", "labels").Unstructured,
name: "keep name, namespace, labels, annotations only",
obj: NewTestUnstructured().WithMetadata("name", "blah", "namespace", "labels", "annotations", "foo").Unstructured,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata("name", "namespace", "labels", "annotations").Unstructured,
},
{
name: "keep annotations",
obj: NewTestUnstructured().WithMetadata("name", "namespace", "labels", "annotations").Unstructured,
keepAnnotations: true,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata("name", "namespace", "labels", "annotations").Unstructured,
},
{
name: "don't keep extraneous metadata",
obj: NewTestUnstructured().WithMetadata("foo").Unstructured,
keepAnnotations: false,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata().Unstructured,
},
{
name: "don't keep status",
obj: NewTestUnstructured().WithMetadata().WithStatus().Unstructured,
keepAnnotations: false,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata().Unstructured,
name: "don't keep status",
obj: NewTestUnstructured().WithMetadata().WithStatus().Unstructured,
expectedErr: false,
expectedRes: NewTestUnstructured().WithMetadata().Unstructured,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
res, err := resetMetadataAndStatus(test.obj, test.keepAnnotations)
res, err := resetMetadataAndStatus(test.obj)
if assert.Equal(t, test.expectedErr, err != nil) {
assert.Equal(t, test.expectedRes, res)
@ -722,18 +704,18 @@ func TestExecutePVAction(t *testing.T) {
expectedErr: true,
},
{
name: "ensure annotations, spec.claimRef, spec.storageClassName are deleted",
name: "ensure spec.claimRef, spec.storageClassName are deleted",
obj: NewTestUnstructured().WithName("pv-1").WithAnnotations("a", "b").WithSpec("claimRef", "storageClassName", "someOtherField").Unstructured,
restore: arktest.NewDefaultTestRestore().WithRestorePVs(false).Restore,
backup: &api.Backup{},
expectedRes: NewTestUnstructured().WithName("pv-1").WithSpec("someOtherField").Unstructured,
expectedRes: NewTestUnstructured().WithAnnotations("a", "b").WithName("pv-1").WithSpec("someOtherField").Unstructured,
},
{
name: "if backup.spec.snapshotVolumes is false, ignore restore.spec.restorePVs and return early",
obj: NewTestUnstructured().WithName("pv-1").WithAnnotations("a", "b").WithSpec("claimRef", "storageClassName", "someOtherField").Unstructured,
restore: arktest.NewDefaultTestRestore().WithRestorePVs(true).Restore,
backup: &api.Backup{Spec: api.BackupSpec{SnapshotVolumes: boolptr.False()}},
expectedRes: NewTestUnstructured().WithName("pv-1").WithSpec("someOtherField").Unstructured,
expectedRes: NewTestUnstructured().WithName("pv-1").WithAnnotations("a", "b").WithSpec("someOtherField").Unstructured,
},
{
name: "not restoring, return early",
@ -1181,7 +1163,7 @@ func (r *fakeAction) Execute(obj runtime.Unstructured, restore *api.Restore) (ru
}
// want the baseline functionality too
res, err := resetMetadataAndStatus(unstructuredObj, true)
res, err := resetMetadataAndStatus(unstructuredObj)
if err != nil {
return nil, nil, err
}