2020-01-07 10:33:28 -08:00
package cleanup
import (
2020-03-17 16:25:34 -07:00
"github.com/go-logr/logr"
2020-10-07 11:12:31 -07:00
kyverno "github.com/kyverno/kyverno/pkg/api/kyverno/v1"
dclient "github.com/kyverno/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-03-17 16:25:34 -07:00
logger := c . log . WithValues ( "kind" , gr . Kind , "namespace" , gr . Namespace , "name" , gr . Name )
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
2020-03-17 16:25:34 -07:00
if ! ownerResourceExists ( logger , c . client , gr ) {
if err := deleteGeneratedResources ( logger , c . client , gr ) ; err != nil {
2020-02-10 12:44:20 -08:00
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
}
2020-03-17 16:25:34 -07:00
func ownerResourceExists ( log logr . Logger , client * dclient . Client , gr kyverno . GenerateRequest ) bool {
2020-08-07 09:47:33 +05:30
_ , 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 {
2020-03-17 16:25:34 -07:00
log . Error ( err , "failed to get resource" , "genKind" , gr . Spec . Resource . Kind , "genNamespace" , gr . Spec . Resource . Namespace , "genName" , gr . Spec . Resource . Name )
2020-02-10 12:44:20 -08:00
}
// 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
2020-03-17 16:25:34 -07:00
func deleteGeneratedResources ( log logr . Logger , client * dclient . Client , gr kyverno . GenerateRequest ) error {
2020-01-07 15:13:57 -08:00
for _ , genResource := range gr . Status . GeneratedResources {
2020-08-07 09:47:33 +05:30
err := client . DeleteResource ( "" , genResource . Kind , genResource . Namespace , genResource . Name , false )
2020-02-10 12:44:20 -08:00
if apierrors . IsNotFound ( err ) {
2020-11-19 14:22:54 -08:00
log . Error ( err , "resource not found will not delete" , "genKind" , gr . Spec . Resource . Kind , "genNamespace" , gr . Spec . Resource . Namespace , "genName" , gr . Spec . Resource . Name )
2020-01-07 15:13:57 -08:00
continue
}
if err != nil {
return err
}
2020-01-24 12:05:53 -08:00
2020-01-07 15:13:57 -08:00
}
return nil
}