Skip to content

Instantly share code, notes, and snippets.

@nathanperkins
Created July 20, 2021 19:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nathanperkins/706ec3c009b8234374354eba520e90ab to your computer and use it in GitHub Desktop.
Save nathanperkins/706ec3c009b8234374354eba520e90ab to your computer and use it in GitHub Desktop.
func verifyResourceClean(
ctx context.Context,
k8sClient client.Client,
resource client.ObjectList,
ignoredObjects ...client.ObjectKey,
) error {
if err := k8sClient.List(ctx, resource); err != nil {
return err
}
list := reflect.Indirect(reflect.ValueOf(resource))
filtered := filterItems(list, ignoredObjects...)
if len(filtered) > 0 {
return fmt.Errorf("%w: found non-ignored objects on cluster: %s",
ErrResourceNotClean, pretty.Sprint(filtered))
}
return nil
}
func filterItems(
list reflect.Value,
ignoredObjects ...client.ObjectKey,
) []interface{} {
var filtered []interface{}
items := list.FieldByName("Items")
for i := 0; i < items.Len(); i++ {
val := items.Index(i)
name := val.FieldByName("Name").String()
namespace := val.FieldByName("Namespace").String()
isIgnored := func() bool {
for _, ignoredObject := range ignoredObjects {
if name == ignoredObject.Name && namespace == ignoredObject.Namespace {
return true
}
}
return false
}
if !isIgnored() {
filtered = append(filtered, val.Interface())
}
}
return filtered
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment