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

properly handle errors in generate controller

This commit is contained in:
Shuting Zhao 2020-11-20 14:14:59 -08:00
parent f3e6e597cd
commit 6a062523a4
5 changed files with 30 additions and 20 deletions

View file

@ -42,14 +42,11 @@ func ownerResourceExists(log logr.Logger, client *dclient.Client, gr kyverno.Gen
func deleteGeneratedResources(log logr.Logger, client *dclient.Client, gr kyverno.GenerateRequest) error { func deleteGeneratedResources(log logr.Logger, client *dclient.Client, gr kyverno.GenerateRequest) error {
for _, genResource := range gr.Status.GeneratedResources { for _, genResource := range gr.Status.GeneratedResources {
err := client.DeleteResource("", genResource.Kind, genResource.Namespace, genResource.Name, false) err := client.DeleteResource("", genResource.Kind, genResource.Namespace, genResource.Name, false)
if apierrors.IsNotFound(err) { if err != nil && !apierrors.IsNotFound(err) {
log.Error(err, "resource not found will not delete", "genKind", gr.Spec.Resource.Kind, "genNamespace", gr.Spec.Resource.Namespace, "genName", gr.Spec.Resource.Name)
continue
}
if err != nil {
return err return err
} }
log.V(3).Info("generated resource deleted", "genKind", gr.Spec.Resource.Kind, "genNamespace", gr.Spec.Resource.Namespace, "genName", gr.Spec.Resource.Name)
} }
return nil return nil
} }

View file

@ -12,6 +12,7 @@ import (
"github.com/kyverno/kyverno/pkg/constant" "github.com/kyverno/kyverno/pkg/constant"
dclient "github.com/kyverno/kyverno/pkg/dclient" dclient "github.com/kyverno/kyverno/pkg/dclient"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -174,13 +175,13 @@ func (c *Controller) deleteGR(obj interface{}) {
} }
for _, resource := range gr.Status.GeneratedResources { for _, resource := range gr.Status.GeneratedResources {
r, err := c.client.GetResource(resource.APIVersion, resource.Kind, resource.Namespace, resource.Name) r, err := c.client.GetResource(resource.APIVersion, resource.Kind, resource.Namespace, resource.Name)
if err != nil { if err != nil && !apierrors.IsNotFound(err) {
logger.Error(err, "Generated resource is not deleted", "Resource", resource.Name) logger.Error(err, "Generated resource is not deleted", "Resource", resource.Name)
return return
} }
labels := r.GetLabels()
if labels["policy.kyverno.io/synchronize"] == "enable" { if r != nil && r.GetLabels()["policy.kyverno.io/synchronize"] == "enable" {
if err := c.client.DeleteResource(r.GetAPIVersion(), r.GetKind(), r.GetNamespace(), r.GetName(), false); err != nil { if err := c.client.DeleteResource(r.GetAPIVersion(), r.GetKind(), r.GetNamespace(), r.GetName(), false); err != nil && !apierrors.IsNotFound(err) {
logger.Error(err, "Generated resource is not deleted", "Resource", r.GetName()) logger.Error(err, "Generated resource is not deleted", "Resource", r.GetName())
return return
} }

View file

@ -15,6 +15,7 @@ import (
"github.com/kyverno/kyverno/pkg/policystatus" "github.com/kyverno/kyverno/pkg/policystatus"
"github.com/kyverno/kyverno/pkg/resourcecache" "github.com/kyverno/kyverno/pkg/resourcecache"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -220,13 +221,13 @@ func (c *Controller) deleteGR(obj interface{}) {
} }
for _, resource := range gr.Status.GeneratedResources { for _, resource := range gr.Status.GeneratedResources {
r, err := c.client.GetResource(resource.APIVersion, resource.Kind, resource.Namespace, resource.Name) r, err := c.client.GetResource(resource.APIVersion, resource.Kind, resource.Namespace, resource.Name)
if err != nil { if err != nil && !apierrors.IsNotFound(err) {
logger.Error(err, "Generated resource is not deleted", "Resource", resource.Name) logger.Error(err, "Generated resource is not deleted", "Resource", resource.Name)
continue continue
} }
labels := r.GetLabels()
if labels["policy.kyverno.io/synchronize"] == "enable" { if r != nil && r.GetLabels()["policy.kyverno.io/synchronize"] == "enable" {
if err := c.client.DeleteResource(r.GetAPIVersion(), r.GetKind(), r.GetNamespace(), r.GetName(), false); err != nil { if err := c.client.DeleteResource(r.GetAPIVersion(), r.GetKind(), r.GetNamespace(), r.GetName(), false); err != nil && !apierrors.IsNotFound(err) {
logger.Error(err, "Generated resource is not deleted", "Resource", r.GetName()) logger.Error(err, "Generated resource is not deleted", "Resource", r.GetName())
} }
} }

View file

@ -34,6 +34,11 @@ func (c *Controller) processGR(gr *kyverno.GenerateRequest) error {
return err return err
} }
// trigger resource is being terminated
if resource == nil {
return nil
}
// 2 - Apply the generate policy on the resource // 2 - Apply the generate policy on the resource
genResources, err = c.applyGenerate(*resource, *gr) genResources, err = c.applyGenerate(*resource, *gr)
@ -57,13 +62,12 @@ func (c *Controller) applyGenerate(resource unstructured.Unstructured, gr kyvern
if apierrors.IsNotFound(err) { if apierrors.IsNotFound(err) {
for _, e := range gr.Status.GeneratedResources { for _, e := range gr.Status.GeneratedResources {
resp, err := c.client.GetResource(e.APIVersion, e.Kind, e.Namespace, e.Name) resp, err := c.client.GetResource(e.APIVersion, e.Kind, e.Namespace, e.Name)
if err != nil { if err != nil && !apierrors.IsNotFound(err) {
logger.Error(err, "failed to find generated resource", "name", e.Name) logger.Error(err, "failed to find generated resource", "name", e.Name)
continue continue
} }
labels := resp.GetLabels() if resp != nil && resp.GetLabels()["policy.kyverno.io/synchronize"] == "enable" {
if labels["policy.kyverno.io/synchronize"] == "enable" {
if err := c.client.DeleteResource(resp.GetAPIVersion(), resp.GetKind(), resp.GetNamespace(), resp.GetName(), false); err != nil { if err := c.client.DeleteResource(resp.GetAPIVersion(), resp.GetKind(), resp.GetNamespace(), resp.GetName(), false); err != nil {
logger.Error(err, "Generated resource is not deleted", "Resource", e.Name) logger.Error(err, "Generated resource is not deleted", "Resource", e.Name)
} }
@ -348,8 +352,6 @@ func applyRule(log logr.Logger, client *dclient.Client, rule kyverno.Rule, resou
logger.V(4).Info("creating new resource") logger.V(4).Info("creating new resource")
_, err = client.CreateResource(genAPIVersion, genKind, genNamespace, newResource, false) _, err = client.CreateResource(genAPIVersion, genKind, genNamespace, newResource, false)
if err != nil { if err != nil {
logger.Error(err, "failed to create resource", "resource", newResource.GetName())
// Failed to create resource
return noGenResource, err return noGenResource, err
} }
logger.V(2).Info("created generated resource") logger.V(2).Info("created generated resource")
@ -403,7 +405,7 @@ func manageData(log logr.Logger, apiVersion, kind, namespace, name string, data
obj, err := client.GetResource(apiVersion, kind, namespace, name) obj, err := client.GetResource(apiVersion, kind, namespace, name)
if err != nil { if err != nil {
if apierrors.IsNotFound(err) { if apierrors.IsNotFound(err) {
log.Error(err, "resource does not exist, will try to create", "genKind", kind, "genAPIVersion", apiVersion, "genNamespace", namespace, "genName", name) log.V(3).Info("resource does not exist, will try to create", "genKind", kind, "genAPIVersion", apiVersion, "genNamespace", namespace, "genName", name)
return data, Create, nil return data, Create, nil
} }
//something wrong while fetching resource //something wrong while fetching resource

View file

@ -7,5 +7,14 @@ import (
) )
func getResource(client *dclient.Client, resourceSpec kyverno.ResourceSpec) (*unstructured.Unstructured, error) { func getResource(client *dclient.Client, resourceSpec kyverno.ResourceSpec) (*unstructured.Unstructured, error) {
return client.GetResource(resourceSpec.APIVersion, resourceSpec.Kind, resourceSpec.Namespace, resourceSpec.Name) resource, err := client.GetResource(resourceSpec.APIVersion, resourceSpec.Kind, resourceSpec.Namespace, resourceSpec.Name)
if err != nil {
return nil, err
}
if resource.GetDeletionTimestamp() != nil {
return nil, nil
}
return resource, nil
} }