mirror of https://github.com/fluxcd/cli-utils.git
135 lines
4.5 KiB
Go
135 lines
4.5 KiB
Go
// Copyright 2021 The Kubernetes Authors.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package task
|
|
|
|
import (
|
|
"testing"
|
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
"sigs.k8s.io/cli-utils/pkg/apply/cache"
|
|
"sigs.k8s.io/cli-utils/pkg/apply/event"
|
|
"sigs.k8s.io/cli-utils/pkg/apply/taskrunner"
|
|
"sigs.k8s.io/cli-utils/pkg/common"
|
|
"sigs.k8s.io/cli-utils/pkg/inventory"
|
|
"sigs.k8s.io/cli-utils/pkg/object"
|
|
"sigs.k8s.io/cli-utils/pkg/testutil"
|
|
)
|
|
|
|
func TestDeleteInvTask(t *testing.T) {
|
|
id1 := object.UnstructuredToObjMetadata(obj1)
|
|
id2 := object.UnstructuredToObjMetadata(obj2)
|
|
id3 := object.UnstructuredToObjMetadata(obj3)
|
|
testCases := map[string]struct {
|
|
prevInventory object.ObjMetadataSet
|
|
deletedObjs object.ObjMetadataSet
|
|
failedDeletes object.ObjMetadataSet
|
|
failedReconciles object.ObjMetadataSet
|
|
timeoutReconciles object.ObjMetadataSet
|
|
err error
|
|
isError bool
|
|
expectedObjs object.ObjMetadataSet
|
|
}{
|
|
"no error case": {
|
|
prevInventory: object.ObjMetadataSet{id1, id2, id3},
|
|
err: nil,
|
|
isError: false,
|
|
},
|
|
"error is returned in result": {
|
|
err: apierrors.NewResourceExpired("unused message"),
|
|
isError: true,
|
|
},
|
|
"inventory not found is not error and not returned": {
|
|
err: apierrors.NewNotFound(schema.GroupResource{Resource: "simples"},
|
|
"unused-resource-name"),
|
|
isError: false,
|
|
},
|
|
"inventory is updated instead of deleted in case of pruning failure": {
|
|
prevInventory: object.ObjMetadataSet{id1, id2, id3},
|
|
failedDeletes: object.ObjMetadataSet{id1},
|
|
err: nil,
|
|
isError: false,
|
|
expectedObjs: object.ObjMetadataSet{id1},
|
|
},
|
|
"inventory is updated instead of deleted in case of reconcile failure": {
|
|
prevInventory: object.ObjMetadataSet{id1, id2, id3},
|
|
deletedObjs: object.ObjMetadataSet{id1, id2, id3},
|
|
failedReconciles: object.ObjMetadataSet{id1},
|
|
err: nil,
|
|
isError: false,
|
|
expectedObjs: object.ObjMetadataSet{id1},
|
|
},
|
|
"inventory is updated instead of deleted in case of reconcile timeout": {
|
|
prevInventory: object.ObjMetadataSet{id1, id2, id3},
|
|
deletedObjs: object.ObjMetadataSet{id1, id2, id3},
|
|
timeoutReconciles: object.ObjMetadataSet{id1},
|
|
err: nil,
|
|
isError: false,
|
|
expectedObjs: object.ObjMetadataSet{id1},
|
|
},
|
|
"inventory is updated instead of deleted in case of pruning/reconcile failure": {
|
|
prevInventory: object.ObjMetadataSet{id1, id2, id3},
|
|
deletedObjs: object.ObjMetadataSet{id1, id2, id3},
|
|
failedReconciles: object.ObjMetadataSet{id1},
|
|
failedDeletes: object.ObjMetadataSet{id2},
|
|
err: nil,
|
|
isError: false,
|
|
expectedObjs: object.ObjMetadataSet{id1, id2},
|
|
},
|
|
}
|
|
for name, tc := range testCases {
|
|
t.Run(name, func(t *testing.T) {
|
|
client := inventory.NewFakeClient(object.ObjMetadataSet{})
|
|
client.Err = tc.err
|
|
eventChannel := make(chan event.Event)
|
|
resourceCache := cache.NewResourceCacheMap()
|
|
context := taskrunner.NewTaskContext(eventChannel, resourceCache)
|
|
im := context.InventoryManager()
|
|
for _, deleteObj := range tc.deletedObjs {
|
|
im.AddSuccessfulDelete(deleteObj, "unused-uid")
|
|
}
|
|
for _, failedDelete := range tc.failedDeletes {
|
|
im.AddFailedDelete(failedDelete)
|
|
}
|
|
for _, failedReconcile := range tc.failedReconciles {
|
|
if err := im.SetFailedReconcile(failedReconcile); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
for _, timeoutReconcile := range tc.timeoutReconciles {
|
|
if err := im.SetTimeoutReconcile(timeoutReconcile); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
task := DeleteOrUpdateInvTask{
|
|
TaskName: taskName,
|
|
InvClient: client,
|
|
InvInfo: nil,
|
|
DryRun: common.DryRunNone,
|
|
PrevInventory: tc.prevInventory,
|
|
Destroy: true,
|
|
}
|
|
if taskName != task.Name() {
|
|
t.Errorf("expected task name (%s), got (%s)", taskName, task.Name())
|
|
}
|
|
task.Start(context)
|
|
result := <-context.TaskChannel()
|
|
if tc.isError {
|
|
if tc.err != result.Err {
|
|
t.Errorf("running DeleteOrUpdateInvTask expected error (%s), got (%s)", tc.err, result.Err)
|
|
}
|
|
} else {
|
|
if result.Err != nil {
|
|
t.Errorf("unexpected error running DeleteOrUpdateInvTask: %s", result.Err)
|
|
}
|
|
}
|
|
actual, _ := client.GetClusterObjs(nil)
|
|
testutil.AssertEqual(t, tc.expectedObjs, actual,
|
|
"Actual cluster objects (%d) do not match expected cluster objects (%d)",
|
|
len(actual), len(tc.expectedObjs))
|
|
})
|
|
}
|
|
}
|