2020-01-07 10:33:28 -08:00
|
|
|
package cleanup
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/golang/glog"
|
|
|
|
kyverno "github.com/nirmata/kyverno/pkg/api/kyverno/v1"
|
|
|
|
dclient "github.com/nirmata/kyverno/pkg/dclient"
|
2020-02-10 12:44:20 -08:00
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
2020-01-07 10:33:28 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
func (c *Controller) processGR(gr kyverno.GenerateRequest) error {
|
2020-02-10 12:44:20 -08:00
|
|
|
// 1- Corresponding policy has been deleted
|
|
|
|
// then we dont delete the generated resources
|
2020-01-07 10:33:28 -08:00
|
|
|
|
2020-02-10 12:44:20 -08:00
|
|
|
// 2- The trigger resource is deleted, then delete the generated resources
|
|
|
|
if !ownerResourceExists(c.client, gr) {
|
|
|
|
if err := deleteGeneratedResources(c.client, gr); err != nil {
|
|
|
|
return err
|
2020-01-07 10:33:28 -08:00
|
|
|
}
|
2020-02-13 13:57:48 -08:00
|
|
|
// - trigger-resource is deleted
|
|
|
|
// - generated-resources are deleted
|
2020-02-10 12:44:20 -08:00
|
|
|
// - > Now delete the GenerateRequest CR
|
2020-01-07 10:33:28 -08:00
|
|
|
return c.control.Delete(gr.Name)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func ownerResourceExists(client *dclient.Client, gr kyverno.GenerateRequest) bool {
|
|
|
|
_, err := client.GetResource(gr.Spec.Resource.Kind, gr.Spec.Resource.Namespace, gr.Spec.Resource.Name)
|
2020-02-10 12:44:20 -08:00
|
|
|
// trigger resources has been deleted
|
|
|
|
if apierrors.IsNotFound(err) {
|
2020-01-07 10:33:28 -08:00
|
|
|
return false
|
|
|
|
}
|
2020-02-10 12:44:20 -08:00
|
|
|
if err != nil {
|
|
|
|
glog.V(4).Infof("Failed to get resource %s/%s/%s: error : %s", gr.Spec.Resource.Kind, gr.Spec.Resource.Namespace, gr.Spec.Resource.Name, err)
|
|
|
|
}
|
|
|
|
// if there was an error while querying the resources we dont delete the generated resources
|
|
|
|
// but expect the deletion in next reconciliation loop
|
2020-01-07 10:33:28 -08:00
|
|
|
return true
|
|
|
|
}
|
2020-01-07 15:13:57 -08:00
|
|
|
|
|
|
|
func deleteGeneratedResources(client *dclient.Client, gr kyverno.GenerateRequest) error {
|
|
|
|
for _, genResource := range gr.Status.GeneratedResources {
|
|
|
|
err := client.DeleteResource(genResource.Kind, genResource.Namespace, genResource.Name, false)
|
2020-02-10 12:44:20 -08:00
|
|
|
if apierrors.IsNotFound(err) {
|
2020-01-07 15:13:57 -08:00
|
|
|
glog.V(4).Infof("resource %s/%s/%s not found, will no delete", genResource.Kind, genResource.Namespace, genResource.Name)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-01-24 12:05:53 -08:00
|
|
|
|
2020-01-07 15:13:57 -08:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|