mirror of
https://github.com/kyverno/kyverno.git
synced 2025-03-29 02:45:06 +00:00
chore: generate controller cleanups (#6281)
* deepcopy ur before processing Signed-off-by: ShutingZhao <shuting@nirmata.com> * refactor retry annotation updates Signed-off-by: ShutingZhao <shuting@nirmata.com> * set pending status on UR creation Signed-off-by: ShutingZhao <shuting@nirmata.com> * clean up UR on completion Signed-off-by: ShutingZhao <shuting@nirmata.com> * unset Signed-off-by: ShutingZhao <shuting@nirmata.com> * linter fixes Signed-off-by: ShutingZhao <shuting@nirmata.com> * revert Signed-off-by: ShutingZhao <shuting@nirmata.com> --------- Signed-off-by: ShutingZhao <shuting@nirmata.com>
This commit is contained in:
parent
ed5cf2cdde
commit
c3559f2b8e
3 changed files with 51 additions and 53 deletions
|
@ -6,7 +6,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -100,49 +99,25 @@ func (c *GenerateController) ProcessUR(ur *kyvernov1beta1.UpdateRequest) error {
|
|||
// Don't update status
|
||||
// re-queueing the UR by updating the annotation
|
||||
// retry - 5 times
|
||||
logger.V(3).Info("resource does not exist or is pending creation, re-queueing", "details", err.Error(), "retry")
|
||||
urAnnotations := ur.Annotations
|
||||
|
||||
if len(urAnnotations) == 0 {
|
||||
urAnnotations = map[string]string{
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation]: "1",
|
||||
}
|
||||
} else {
|
||||
if val, ok := urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation]; ok {
|
||||
sleepCountInt64, err := strconv.ParseUint(val, 10, 32)
|
||||
if err != nil {
|
||||
logger.Error(err, "unable to convert retry-count")
|
||||
return err
|
||||
}
|
||||
|
||||
sleepCountInt := int(sleepCountInt64) + 1
|
||||
if sleepCountInt > 5 {
|
||||
if err := deleteGeneratedResources(logger, c.client, *ur); err != nil {
|
||||
return err
|
||||
}
|
||||
// - trigger-resource is deleted
|
||||
// - generated-resources are deleted
|
||||
// - > Now delete the UpdateRequest CR
|
||||
return c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Delete(context.TODO(), ur.Name, metav1.DeleteOptions{})
|
||||
} else {
|
||||
time.Sleep(time.Second * time.Duration(sleepCountInt))
|
||||
incrementedCountString := strconv.Itoa(sleepCountInt)
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation] = incrementedCountString
|
||||
}
|
||||
} else {
|
||||
time.Sleep(time.Second * 1)
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation] = "1"
|
||||
logger.V(3).Info("resource does not exist or is pending creation, re-queueing", "details", err.Error())
|
||||
retry, urAnnotations, err := increaseRetryAnnotation(ur)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if retry > 5 {
|
||||
err = c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Delete(context.TODO(), ur.GetName(), metav1.DeleteOptions{})
|
||||
if err != nil {
|
||||
logger.Error(err, "exceeds retry limit, failed to delete the UR", "update request", ur.Name, "retry", retry, "resourceVersion", ur.GetResourceVersion())
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
ur.SetAnnotations(urAnnotations)
|
||||
_, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Update(context.TODO(), ur, metav1.UpdateOptions{})
|
||||
_, err = c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Update(context.TODO(), ur, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
logger.Error(err, "failed to update annotation in update request for the resource", "update request", ur.Name, "resourceVersion", ur.GetResourceVersion())
|
||||
logger.Error(err, "failed to update annotation in update request for the resource", "update request", ur.Name, "resourceVersion", ur.GetResourceVersion(), "annotations", urAnnotations, "retry", retry)
|
||||
return err
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// trigger resource is being terminated
|
||||
|
@ -841,15 +816,3 @@ func (c *GenerateController) GetUnstrResource(genResourceSpec kyvernov1.Resource
|
|||
}
|
||||
return resource, nil
|
||||
}
|
||||
|
||||
func deleteGeneratedResources(log logr.Logger, client dclient.Interface, ur kyvernov1beta1.UpdateRequest) error {
|
||||
for _, genResource := range ur.Status.GeneratedResources {
|
||||
err := client.DeleteResource(context.TODO(), genResource.APIVersion, genResource.Kind, genResource.Namespace, genResource.Name, false)
|
||||
if err != nil && !apierrors.IsNotFound(err) {
|
||||
return err
|
||||
}
|
||||
|
||||
log.V(3).Info("generated resource deleted", "genKind", ur.Spec.Resource.Kind, "genNamespace", ur.Spec.Resource.Namespace, "genName", ur.Spec.Resource.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
34
pkg/background/generate/utils.go
Normal file
34
pkg/background/generate/utils.go
Normal file
|
@ -0,0 +1,34 @@
|
|||
package generate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
|
||||
)
|
||||
|
||||
func increaseRetryAnnotation(ur *kyvernov1beta1.UpdateRequest) (int, map[string]string, error) {
|
||||
urAnnotations := ur.Annotations
|
||||
if len(urAnnotations) == 0 {
|
||||
urAnnotations = map[string]string{
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation]: "1",
|
||||
}
|
||||
}
|
||||
|
||||
retry := 1
|
||||
val, ok := urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation]
|
||||
if !ok {
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation] = "1"
|
||||
} else {
|
||||
retryUint, err := strconv.ParseUint(val, 10, 64)
|
||||
if err != nil {
|
||||
return retry, urAnnotations, fmt.Errorf("unable to convert retry-count %v: %w", val, err)
|
||||
}
|
||||
retry = int(retryUint)
|
||||
retry += 1
|
||||
incrementedRetryString := strconv.Itoa(retry)
|
||||
urAnnotations[kyvernov1beta1.URGenerateRetryCountAnnotation] = incrementedRetryString
|
||||
}
|
||||
|
||||
return retry, urAnnotations, nil
|
||||
}
|
|
@ -184,13 +184,14 @@ func (c *controller) syncUpdateRequest(key string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
// Deep-copy otherwise we are mutating our cache.
|
||||
ur = ur.DeepCopy()
|
||||
|
||||
// if not in any state, try to set it to pending
|
||||
if ur.Status.State == "" {
|
||||
ur = ur.DeepCopy()
|
||||
ur.Status.State = kyvernov1beta1.Pending
|
||||
if _, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{}); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err := c.kyvernoClient.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), ur, metav1.UpdateOptions{})
|
||||
return err
|
||||
}
|
||||
// try to get the linked policy
|
||||
if _, err := c.getPolicy(ur.Spec.Policy); err != nil {
|
||||
|
|
Loading…
Add table
Reference in a new issue