mirror of
https://github.com/projectcapsule/capsule.git
synced 2026-03-05 19:21:29 +00:00
* fix(controller): decode old object for delete requests Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: modernize golang Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(config): remove usergroups default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * fix(config): remove usergroups default Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * sec(ghsa-2ww6-hf35-mfjm): intercept namespace subresource Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * chore: conflicts Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> * feat(api): add rulestatus api Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com> --------- Signed-off-by: Oliver Bähler <oliverbaehler@hotmail.com>
91 lines
1.7 KiB
Go
91 lines
1.7 KiB
Go
// Copyright 2020-2026 Project Capsule Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
apierr "k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
)
|
|
|
|
func CreateOrPatch(
|
|
ctx context.Context,
|
|
c client.Client,
|
|
obj client.Object,
|
|
fieldOwner string,
|
|
overwrite bool,
|
|
) error {
|
|
gvks, _, err := c.Scheme().ObjectKinds(obj)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(gvks) == 0 {
|
|
return fmt.Errorf("no GVK found for object %T", obj)
|
|
}
|
|
|
|
obj.GetObjectKind().SetGroupVersionKind(gvks[0])
|
|
|
|
//nolint:forcetypeassert
|
|
actual := obj.DeepCopyObject().(client.Object)
|
|
|
|
key := client.ObjectKeyFromObject(obj)
|
|
|
|
err = c.Get(ctx, key, actual)
|
|
|
|
notFound := apierr.IsNotFound(err)
|
|
if err != nil && !notFound {
|
|
return err
|
|
}
|
|
|
|
if !notFound {
|
|
obj.SetResourceVersion(actual.GetResourceVersion())
|
|
} else {
|
|
obj.SetResourceVersion("")
|
|
}
|
|
|
|
patchOpts := []client.PatchOption{
|
|
client.FieldOwner(fieldOwner),
|
|
}
|
|
|
|
if overwrite {
|
|
patchOpts = append(patchOpts, client.ForceOwnership)
|
|
}
|
|
|
|
//nolint:staticcheck
|
|
return c.Patch(ctx, obj, client.Apply, patchOpts...)
|
|
}
|
|
|
|
// Returns timestamp of last apply for a manager.
|
|
func LastApplyTimeForManager(obj *unstructured.Unstructured, manager string) *metav1.Time {
|
|
var latest *metav1.Time
|
|
|
|
for i := range obj.GetManagedFields() {
|
|
mf := obj.GetManagedFields()[i]
|
|
|
|
if mf.Manager != manager {
|
|
continue
|
|
}
|
|
|
|
if mf.Operation != metav1.ManagedFieldsOperationApply {
|
|
continue
|
|
}
|
|
|
|
if mf.Time == nil {
|
|
continue
|
|
}
|
|
|
|
if latest == nil || mf.Time.After(latest.Time) {
|
|
t := *mf.Time
|
|
latest = &t
|
|
}
|
|
}
|
|
|
|
return latest
|
|
}
|