1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-31 03:45:17 +00:00

fix: use background helper in ur generator (#4009)

* fix: stop mutating cached resource in ur controller (#4003)

Signed-off-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>
(cherry picked from commit dac733755b)
Signed-off-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>

* fix: use background helper in ur generator

Signed-off-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>
This commit is contained in:
Charles-Edouard Brétéché 2022-05-24 18:58:45 +02:00 committed by GitHub
parent 2e91d233c0
commit 3a3556919f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -69,64 +69,49 @@ func (g *generator) applyResource(policyName string, urSpec kyvernov1beta1.Updat
} }
func (g *generator) tryApplyResource(policyName string, urSpec kyvernov1beta1.UpdateRequestSpec) error { func (g *generator) tryApplyResource(policyName string, urSpec kyvernov1beta1.UpdateRequestSpec) error {
ur := kyvernov1beta1.UpdateRequest{ l := logger.WithValues("ruleType", urSpec.Type, "kind", urSpec.Resource.Kind, "name", urSpec.Resource.Name, "namespace", urSpec.Resource.Namespace)
Spec: urSpec,
Status: kyvernov1beta1.UpdateRequestStatus{
State: kyvernov1beta1.Pending,
},
}
var queryLabels labels.Set var queryLabels labels.Set
if ur.Spec.Type == kyvernov1beta1.Mutate { if urSpec.Type == kyvernov1beta1.Mutate {
queryLabels = common.MutateLabelsSet(ur.Spec.Policy, ur.Spec.Resource) queryLabels = common.MutateLabelsSet(urSpec.Policy, urSpec.Resource)
} else if ur.Spec.Type == kyvernov1beta1.Generate { } else if urSpec.Type == kyvernov1beta1.Generate {
queryLabels = common.GenerateLabelsSet(ur.Spec.Policy, ur.Spec.Resource) queryLabels = common.GenerateLabelsSet(urSpec.Policy, urSpec.Resource)
} }
ur.SetNamespace(config.KyvernoNamespace())
isExist := false
logger.V(4).Info("apply UpdateRequest", "ruleType", ur.Spec.Type)
urList, err := g.urLister.List(labels.SelectorFromSet(queryLabels)) urList, err := g.urLister.List(labels.SelectorFromSet(queryLabels))
if err != nil { if err != nil {
logger.Error(err, "failed to get update request for the resource", "kind", urSpec.Resource.Kind, "name", urSpec.Resource.Name, "namespace", urSpec.Resource.Namespace) l.Error(err, "failed to get update request for the resource", "kind", urSpec.Resource.Kind, "name", urSpec.Resource.Name, "namespace", urSpec.Resource.Namespace)
return err return err
} }
for _, v := range urList { for _, v := range urList {
logger.V(4).Info("updating existing update request", "name", v.GetName()) l := l.WithValues("name", v.GetName())
l.V(4).Info("updating existing update request")
v.Spec.Context = ur.Spec.Context if _, err := common.Update(g.client, g.urLister, v.GetName(), func(ur *kyvernov1beta1.UpdateRequest) {
v.Spec.Policy = ur.Spec.Policy v.Spec = urSpec
v.Spec.Resource = ur.Spec.Resource }); err != nil {
v.Status.Message = "" l.V(4).Error(err, "failed to update UpdateRequest")
new, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Update(context.TODO(), v, metav1.UpdateOptions{})
if err != nil {
logger.V(4).Info("failed to update UpdateRequest, retrying", "name", ur.GetName(), "namespace", ur.GetNamespace(), "err", err.Error())
return err return err
} else { } else {
logger.V(4).Info("successfully updated UpdateRequest", "name", ur.GetName(), "namespace", ur.GetNamespace()) l.V(4).Info("successfully updated UpdateRequest")
} }
if _, err := common.UpdateStatus(g.client, g.urLister, v.GetName(), kyvernov1beta1.Pending, "", nil); err != nil {
new.Status.State = kyvernov1beta1.Pending l.V(4).Error(err, "failed to update UpdateRequest status")
if _, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).UpdateStatus(context.TODO(), new, metav1.UpdateOptions{}); err != nil {
logger.Error(err, "failed to set UpdateRequest state to Pending")
return err return err
} }
isExist = true
} }
if len(urList) == 0 {
if !isExist { l.V(4).Info("creating new UpdateRequest")
logger.V(4).Info("creating new UpdateRequest", "type", ur.Spec.Type) ur := kyvernov1beta1.UpdateRequest{
ur.SetGenerateName("ur-") ObjectMeta: metav1.ObjectMeta{
ur.SetLabels(queryLabels) Namespace: config.KyvernoNamespace(),
GenerateName: "ur-",
Labels: queryLabels,
},
Spec: urSpec,
}
if new, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), &ur, metav1.CreateOptions{}); err != nil { if new, err := g.client.KyvernoV1beta1().UpdateRequests(config.KyvernoNamespace()).Create(context.TODO(), &ur, metav1.CreateOptions{}); err != nil {
logger.V(4).Info("failed to create UpdateRequest, retrying", "name", ur.GetGenerateName(), "namespace", ur.GetNamespace(), "err", err.Error()) l.V(4).Error(err, "failed to create UpdateRequest, retrying", "name", ur.GetGenerateName(), "namespace", ur.GetNamespace())
return err return err
} else { } else {
logger.V(4).Info("successfully created UpdateRequest", "name", new.GetName(), "namespace", ur.GetNamespace()) l.V(4).Info("successfully created UpdateRequest", "name", new.GetName(), "namespace", ur.GetNamespace())
} }
} }
return nil return nil