2019-11-18 11:41:37 -08:00
/ *
Cleans up stale webhookconfigurations created by kyverno that were not cleanedup
* /
package main
import (
2021-10-06 14:25:38 -04:00
"context"
2019-11-18 11:41:37 -08:00
"flag"
"os"
"sync"
2019-12-16 12:55:44 -08:00
"time"
2019-11-18 11:41:37 -08:00
2022-05-17 13:12:43 +02:00
kyvernov1beta1 "github.com/kyverno/kyverno/api/kyverno/v1beta1"
2022-04-29 19:05:49 +08:00
kyvernoclient "github.com/kyverno/kyverno/pkg/client/clientset/versioned"
2021-10-06 14:25:38 -04:00
"github.com/kyverno/kyverno/pkg/config"
2022-05-17 16:40:51 +02:00
"github.com/kyverno/kyverno/pkg/dclient"
2022-04-29 19:05:49 +08:00
engineUtils "github.com/kyverno/kyverno/pkg/engine/utils"
2021-10-07 04:42:07 +05:30
"github.com/kyverno/kyverno/pkg/leaderelection"
2021-12-17 06:03:52 +01:00
"github.com/kyverno/kyverno/pkg/policyreport"
2020-10-07 11:12:31 -07:00
"github.com/kyverno/kyverno/pkg/signal"
2022-01-11 14:17:24 +05:30
"github.com/kyverno/kyverno/pkg/tls"
2020-10-07 11:12:31 -07:00
"github.com/kyverno/kyverno/pkg/utils"
2022-05-17 16:14:31 +02:00
coordinationv1 "k8s.io/api/coordination/v1"
2019-11-18 11:41:37 -08:00
"k8s.io/apimachinery/pkg/api/errors"
2022-04-26 22:18:14 +02:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2021-12-17 06:03:52 +01:00
"k8s.io/apimachinery/pkg/labels"
2022-04-29 19:05:49 +08:00
"k8s.io/client-go/kubernetes"
2022-05-05 12:12:43 +02:00
"k8s.io/client-go/rest"
2021-02-07 20:26:56 -08:00
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
2020-03-17 16:25:34 -07:00
"sigs.k8s.io/controller-runtime/pkg/log"
2019-11-18 11:41:37 -08:00
)
var (
2021-12-08 14:03:07 +01:00
setupLog = log . Log . WithName ( "setup" )
clientRateLimitQPS float64
clientRateLimitBurst int
2021-12-17 06:03:52 +01:00
2022-04-26 22:18:14 +02:00
updateLabelSelector = & metav1 . LabelSelector {
MatchExpressions : [ ] metav1 . LabelSelectorRequirement {
2021-12-17 06:03:52 +01:00
{
Key : policyreport . LabelSelectorKey ,
2022-04-26 22:18:14 +02:00
Operator : metav1 . LabelSelectorOpDoesNotExist ,
2021-12-17 06:03:52 +01:00
Values : [ ] string { } ,
} ,
} ,
}
2019-11-18 11:41:37 -08:00
)
const (
2020-12-03 19:19:36 -08:00
policyReportKind string = "PolicyReport"
clusterPolicyReportKind string = "ClusterPolicyReport"
reportChangeRequestKind string = "ReportChangeRequest"
clusterReportChangeRequestKind string = "ClusterReportChangeRequest"
2022-04-29 19:05:49 +08:00
convertGenerateRequest string = "ConvertGenerateRequest"
2019-11-18 11:41:37 -08:00
)
func main ( ) {
2020-03-17 16:25:34 -07:00
klog . InitFlags ( nil )
2022-05-02 17:49:39 +02:00
log . SetLogger ( klogr . New ( ) . WithCallDepth ( 1 ) )
2020-03-17 16:25:34 -07:00
// arguments
2022-04-29 09:29:18 -07:00
flag . Float64Var ( & clientRateLimitQPS , "clientRateLimitQPS" , 0 , "Configure the maximum QPS to the Kubernetes API server from Kyverno. Uses the client default if zero." )
2021-12-08 14:03:07 +01:00
flag . IntVar ( & clientRateLimitBurst , "clientRateLimitBurst" , 0 , "Configure the maximum burst for throttle. Uses the client default if zero." )
2020-03-17 16:25:34 -07:00
if err := flag . Set ( "v" , "2" ) ; err != nil {
klog . Fatalf ( "failed to set log level: %v" , err )
}
2021-01-24 11:34:02 -08:00
2020-03-17 16:25:34 -07:00
flag . Parse ( )
2019-11-18 11:41:37 -08:00
// os signal handler
stopCh := signal . SetupSignalHandler ( )
// create client config
2022-05-05 12:12:43 +02:00
clientConfig , err := rest . InClusterConfig ( )
2019-11-18 11:41:37 -08:00
if err != nil {
2022-05-05 12:12:43 +02:00
setupLog . Error ( err , "Failed to create clientConfig" )
os . Exit ( 1 )
}
if err := config . ConfigureClientConfig ( clientConfig , clientRateLimitQPS , clientRateLimitBurst ) ; err != nil {
setupLog . Error ( err , "Failed to create clientConfig" )
2020-03-17 11:05:20 -07:00
os . Exit ( 1 )
2019-11-18 11:41:37 -08:00
}
// DYNAMIC CLIENT
// - client for all registered resources
2022-05-17 16:40:51 +02:00
client , err := dclient . NewClient ( clientConfig , 15 * time . Minute , stopCh )
2019-11-18 11:41:37 -08:00
if err != nil {
2020-03-17 11:05:20 -07:00
setupLog . Error ( err , "Failed to create client" )
os . Exit ( 1 )
2019-11-18 11:41:37 -08:00
}
2022-05-04 14:14:17 +02:00
kubeClient , err := kubernetes . NewForConfig ( clientConfig )
2022-04-26 22:18:14 +02:00
if err != nil {
setupLog . Error ( err , "Failed to create kubernetes client" )
os . Exit ( 1 )
}
2022-04-29 19:05:49 +08:00
pclient , err := kyvernoclient . NewForConfig ( clientConfig )
if err != nil {
setupLog . Error ( err , "Failed to create client" )
os . Exit ( 1 )
}
2020-02-14 18:12:28 -08:00
// Exit for unsupported version of kubernetes cluster
2022-04-26 22:18:14 +02:00
if ! utils . HigherThanKubernetesVersion ( kubeClient . Discovery ( ) , log . Log , 1 , 16 , 0 ) {
2020-05-18 17:00:52 -07:00
os . Exit ( 1 )
}
2020-02-14 18:12:28 -08:00
2019-11-18 11:41:37 -08:00
requests := [ ] request {
2022-05-10 17:50:04 +02:00
{ policyReportKind } ,
{ clusterPolicyReportKind } ,
2020-12-03 19:19:36 -08:00
2022-05-10 17:50:04 +02:00
{ reportChangeRequestKind } ,
{ clusterReportChangeRequestKind } ,
2020-12-03 19:19:36 -08:00
2022-05-10 17:50:04 +02:00
{ convertGenerateRequest } ,
2019-11-18 11:41:37 -08:00
}
2021-10-07 04:42:07 +05:30
ctx , cancel := context . WithCancel ( context . Background ( ) )
go func ( ) {
<- stopCh
cancel ( )
} ( )
2021-12-17 06:03:52 +01:00
addPolicyReportSelectorLabel ( client )
addClusterPolicyReportSelectorLabel ( client )
2019-11-18 11:41:37 -08:00
done := make ( chan struct { } )
defer close ( done )
failure := false
2021-10-07 04:42:07 +05:30
run := func ( ) {
2022-05-11 16:58:14 +02:00
name := tls . GenerateRootCASecretName ( )
_ , err = kubeClient . CoreV1 ( ) . Secrets ( config . KyvernoNamespace ( ) ) . Get ( context . TODO ( ) , name , metav1 . GetOptions { } )
2022-01-11 14:17:24 +05:30
if err != nil {
2022-04-29 19:05:49 +08:00
log . Log . Info ( "failed to fetch root CA secret" , "name" , name , "error" , err . Error ( ) )
2022-01-11 14:17:24 +05:30
if ! errors . IsNotFound ( err ) {
os . Exit ( 1 )
}
}
2022-05-11 16:58:14 +02:00
name = tls . GenerateTLSPairSecretName ( )
_ , err = kubeClient . CoreV1 ( ) . Secrets ( config . KyvernoNamespace ( ) ) . Get ( context . TODO ( ) , name , metav1 . GetOptions { } )
2022-01-11 14:17:24 +05:30
if err != nil {
2022-04-29 19:05:49 +08:00
log . Log . Info ( "failed to fetch TLS Pair secret" , "name" , name , "error" , err . Error ( ) )
2022-01-11 14:17:24 +05:30
if ! errors . IsNotFound ( err ) {
os . Exit ( 1 )
}
}
2021-10-07 04:42:07 +05:30
2022-04-29 19:05:49 +08:00
if err = acquireLeader ( ctx , kubeClient ) ; err != nil {
log . Log . Info ( "Failed to create lease 'kyvernopre-lock'" )
os . Exit ( 1 )
2021-10-07 04:42:07 +05:30
}
// use pipline to pass request to cleanup resources
in := gen ( done , stopCh , requests ... )
// process requests
// processing routine count : 2
2022-04-29 19:05:49 +08:00
p1 := process ( client , pclient , done , stopCh , in )
p2 := process ( client , pclient , done , stopCh , in )
2021-10-07 04:42:07 +05:30
// merge results from processing routines
for err := range merge ( done , stopCh , p1 , p2 ) {
if err != nil {
failure = true
log . Log . Error ( err , "failed to cleanup resource" )
}
}
// if there is any failure then we fail process
if failure {
log . Log . Info ( "failed to cleanup prior configurations" )
os . Exit ( 1 )
}
os . Exit ( 0 )
2019-11-18 11:41:37 -08:00
}
2021-01-24 11:34:02 -08:00
2022-05-11 08:14:30 +02:00
le , err := leaderelection . New ( "kyvernopre" , config . KyvernoNamespace ( ) , kubeClient , run , nil , log . Log . WithName ( "kyvernopre/LeaderElection" ) )
2021-10-07 04:42:07 +05:30
if err != nil {
setupLog . Error ( err , "failed to elect a leader" )
2019-11-18 11:41:37 -08:00
os . Exit ( 1 )
}
2021-10-07 04:42:07 +05:30
le . Run ( ctx )
2019-11-18 11:41:37 -08:00
}
2022-04-29 19:05:49 +08:00
func acquireLeader ( ctx context . Context , kubeClient kubernetes . Interface ) error {
2022-05-11 08:14:30 +02:00
_ , err := kubeClient . CoordinationV1 ( ) . Leases ( config . KyvernoNamespace ( ) ) . Get ( ctx , "kyvernopre-lock" , metav1 . GetOptions { } )
2022-04-29 19:05:49 +08:00
if err != nil {
log . Log . Info ( "Lease 'kyvernopre-lock' not found. Starting clean-up..." )
} else {
log . Log . Info ( "Leader was elected, quiting" )
os . Exit ( 0 )
}
2022-05-17 16:14:31 +02:00
lease := coordinationv1 . Lease {
2022-04-29 19:05:49 +08:00
ObjectMeta : metav1 . ObjectMeta {
Name : "kyvernopre-lock" ,
} ,
}
2022-05-11 08:14:30 +02:00
_ , err = kubeClient . CoordinationV1 ( ) . Leases ( config . KyvernoNamespace ( ) ) . Create ( ctx , & lease , metav1 . CreateOptions { } )
2022-04-29 19:05:49 +08:00
return err
}
2022-05-17 16:40:51 +02:00
func executeRequest ( client dclient . Interface , kyvernoclient kyvernoclient . Interface , req request ) error {
2020-11-09 11:26:12 -08:00
switch req . kind {
case policyReportKind :
2021-12-17 06:03:52 +01:00
return removePolicyReport ( client , req . kind )
2020-11-09 11:26:12 -08:00
case clusterPolicyReportKind :
return removeClusterPolicyReport ( client , req . kind )
2020-12-03 19:19:36 -08:00
case reportChangeRequestKind :
return removeReportChangeRequest ( client , req . kind )
case clusterReportChangeRequestKind :
return removeClusterReportChangeRequest ( client , req . kind )
2022-04-29 19:05:49 +08:00
case convertGenerateRequest :
return convertGR ( kyvernoclient )
2019-11-18 11:41:37 -08:00
}
2021-01-24 11:34:02 -08:00
2019-11-18 11:41:37 -08:00
return nil
}
type request struct {
kind string
}
/ * Processing Pipeline
- > Process Requests
Generate Requests - > Process Requests - > Merge Results
- > Process Requests
- number of processes can be controlled
- stop processing on SIGTERM OR SIGNKILL signal
- stop processing if any process fails ( supported )
* /
// Generates requests to be processed
func gen ( done <- chan struct { } , stopCh <- chan struct { } , requests ... request ) <- chan request {
out := make ( chan request )
go func ( ) {
defer close ( out )
for _ , req := range requests {
select {
case out <- req :
case <- done :
println ( "done generate" )
return
case <- stopCh :
println ( "shutting down generate" )
return
}
}
} ( )
return out
}
// processes the requests
2022-05-17 16:40:51 +02:00
func process ( client dclient . Interface , kyvernoclient kyvernoclient . Interface , done <- chan struct { } , stopCh <- chan struct { } , requests <- chan request ) <- chan error {
2020-03-17 11:05:20 -07:00
logger := log . Log . WithName ( "process" )
2019-11-18 11:41:37 -08:00
out := make ( chan error )
go func ( ) {
defer close ( out )
for req := range requests {
select {
2022-04-29 19:05:49 +08:00
case out <- executeRequest ( client , kyvernoclient , req ) :
2019-11-18 11:41:37 -08:00
case <- done :
2020-03-17 11:05:20 -07:00
logger . Info ( "done" )
2019-11-18 11:41:37 -08:00
return
case <- stopCh :
2020-03-17 11:05:20 -07:00
logger . Info ( "shutting down" )
2019-11-18 11:41:37 -08:00
return
}
}
} ( )
return out
}
// waits for all processes to be complete and merges result
func merge ( done <- chan struct { } , stopCh <- chan struct { } , processes ... <- chan error ) <- chan error {
2020-03-17 11:05:20 -07:00
logger := log . Log . WithName ( "merge" )
2019-11-18 11:41:37 -08:00
var wg sync . WaitGroup
out := make ( chan error )
// gets the output from each process
output := func ( ch <- chan error ) {
defer wg . Done ( )
for err := range ch {
select {
case out <- err :
case <- done :
2020-03-17 11:05:20 -07:00
logger . Info ( "done" )
2019-11-18 11:41:37 -08:00
return
case <- stopCh :
2020-03-17 11:05:20 -07:00
logger . Info ( "shutting down" )
2019-11-18 11:41:37 -08:00
return
}
}
}
wg . Add ( len ( processes ) )
for _ , process := range processes {
go output ( process )
}
// close when all the process goroutines are done
go func ( ) {
wg . Wait ( )
close ( out )
} ( )
return out
}
2020-11-09 11:26:12 -08:00
2022-05-17 16:40:51 +02:00
func removeClusterPolicyReport ( client dclient . Interface , kind string ) error {
2020-11-09 11:26:12 -08:00
logger := log . Log . WithName ( "removeClusterPolicyReport" )
2021-12-17 06:03:52 +01:00
cpolrs , err := client . ListResource ( "" , kind , "" , policyreport . LabelSelector )
2021-01-21 18:58:53 -08:00
if err != nil {
2020-11-09 11:26:12 -08:00
logger . Error ( err , "failed to list clusterPolicyReport" )
2020-12-03 19:19:36 -08:00
return nil
2020-11-09 11:26:12 -08:00
}
for _ , cpolr := range cpolrs . Items {
2021-10-06 14:25:38 -04:00
deleteResource ( client , cpolr . GetAPIVersion ( ) , cpolr . GetKind ( ) , "" , cpolr . GetName ( ) )
2020-11-09 11:26:12 -08:00
}
return nil
}
2022-05-17 16:40:51 +02:00
func removePolicyReport ( client dclient . Interface , kind string ) error {
2020-11-09 11:26:12 -08:00
logger := log . Log . WithName ( "removePolicyReport" )
2022-04-26 22:18:14 +02:00
polrs , err := client . ListResource ( "" , kind , metav1 . NamespaceAll , policyreport . LabelSelector )
2020-11-09 11:26:12 -08:00
if err != nil {
2021-12-17 06:03:52 +01:00
logger . Error ( err , "failed to list policyReport" )
return nil
2020-11-09 11:26:12 -08:00
}
2021-12-17 06:03:52 +01:00
for _ , polr := range polrs . Items {
deleteResource ( client , polr . GetAPIVersion ( ) , polr . GetKind ( ) , polr . GetNamespace ( ) , polr . GetName ( ) )
2020-12-03 19:19:36 -08:00
}
return nil
}
2022-05-17 16:40:51 +02:00
func addClusterPolicyReportSelectorLabel ( client dclient . Interface ) {
2021-12-17 06:03:52 +01:00
logger := log . Log . WithName ( "addClusterPolicyReportSelectorLabel" )
cpolrs , err := client . ListResource ( "" , clusterPolicyReportKind , "" , updateLabelSelector )
if err != nil {
logger . Error ( err , "failed to list clusterPolicyReport" )
return
}
for _ , cpolr := range cpolrs . Items {
if cpolr . GetName ( ) == policyreport . GeneratePolicyReportName ( "" ) {
addSelectorLabel ( client , cpolr . GetAPIVersion ( ) , cpolr . GetKind ( ) , "" , cpolr . GetName ( ) )
}
}
}
2022-05-17 16:40:51 +02:00
func addPolicyReportSelectorLabel ( client dclient . Interface ) {
2021-12-17 06:03:52 +01:00
logger := log . Log . WithName ( "addPolicyReportSelectorLabel" )
2022-04-26 22:18:14 +02:00
polrs , err := client . ListResource ( "" , policyReportKind , metav1 . NamespaceAll , updateLabelSelector )
2021-12-17 06:03:52 +01:00
if err != nil {
logger . Error ( err , "failed to list policyReport" )
return
}
for _ , polr := range polrs . Items {
if polr . GetName ( ) == policyreport . GeneratePolicyReportName ( polr . GetNamespace ( ) ) {
addSelectorLabel ( client , polr . GetAPIVersion ( ) , polr . GetKind ( ) , polr . GetNamespace ( ) , polr . GetName ( ) )
}
}
}
2022-05-17 16:40:51 +02:00
func removeReportChangeRequest ( client dclient . Interface , kind string ) error {
2020-12-03 19:19:36 -08:00
logger := log . Log . WithName ( "removeReportChangeRequest" )
2022-05-11 08:14:30 +02:00
ns := config . KyvernoNamespace ( )
2020-12-03 19:19:36 -08:00
rcrList , err := client . ListResource ( "" , kind , ns , nil )
2021-01-21 18:58:53 -08:00
if err != nil {
2020-12-03 19:19:36 -08:00
logger . Error ( err , "failed to list reportChangeRequest" )
return nil
}
for _ , rcr := range rcrList . Items {
2021-10-06 14:25:38 -04:00
deleteResource ( client , rcr . GetAPIVersion ( ) , rcr . GetKind ( ) , rcr . GetNamespace ( ) , rcr . GetName ( ) )
2020-11-09 11:26:12 -08:00
}
2020-12-21 11:04:19 -08:00
2020-12-03 19:19:36 -08:00
return nil
}
2022-05-17 16:40:51 +02:00
func removeClusterReportChangeRequest ( client dclient . Interface , kind string ) error {
2020-12-03 19:19:36 -08:00
crcrList , err := client . ListResource ( "" , kind , "" , nil )
2021-01-21 18:58:53 -08:00
if err != nil {
2020-12-09 09:29:52 -08:00
log . Log . Error ( err , "failed to list clusterReportChangeRequest" )
2020-12-03 19:19:36 -08:00
return nil
}
2020-11-09 11:26:12 -08:00
2020-12-03 19:19:36 -08:00
for _ , crcr := range crcrList . Items {
2021-10-06 14:25:38 -04:00
deleteResource ( client , crcr . GetAPIVersion ( ) , crcr . GetKind ( ) , "" , crcr . GetName ( ) )
2020-12-03 19:19:36 -08:00
}
2020-11-09 11:26:12 -08:00
return nil
}
2022-05-17 16:40:51 +02:00
func deleteResource ( client dclient . Interface , apiversion , kind , ns , name string ) {
2020-12-08 23:04:16 -08:00
err := client . DeleteResource ( apiversion , kind , ns , name , false )
if err != nil && ! errors . IsNotFound ( err ) {
2020-12-09 09:29:52 -08:00
log . Log . Error ( err , "failed to delete resource" , "kind" , kind , "name" , name )
2020-12-08 23:04:16 -08:00
return
}
2020-12-09 09:29:52 -08:00
log . Log . Info ( "successfully cleaned up resource" , "kind" , kind , "name" , name )
2020-12-08 23:04:16 -08:00
}
2021-12-17 06:03:52 +01:00
2022-05-17 16:40:51 +02:00
func addSelectorLabel ( client dclient . Interface , apiversion , kind , ns , name string ) {
2021-12-17 06:03:52 +01:00
res , err := client . GetResource ( apiversion , kind , ns , name )
if err != nil && ! errors . IsNotFound ( err ) {
log . Log . Error ( err , "failed to get resource" , "kind" , kind , "name" , name )
return
}
2022-04-26 22:18:14 +02:00
l , err := metav1 . LabelSelectorAsMap ( policyreport . LabelSelector )
2021-12-17 06:03:52 +01:00
if err != nil {
log . Log . Error ( err , "failed to convert labels" , "labels" , policyreport . LabelSelector )
return
}
res . SetLabels ( labels . Merge ( res . GetLabels ( ) , l ) )
_ , err = client . UpdateResource ( apiversion , kind , ns , res , false )
if err != nil {
log . Log . Error ( err , "failed to update resource" , "kind" , kind , "name" , name )
return
}
log . Log . Info ( "successfully updated resource labels" , "kind" , kind , "name" , name )
}
2022-04-29 19:05:49 +08:00
2022-05-02 22:30:07 +02:00
func convertGR ( pclient kyvernoclient . Interface ) error {
2022-04-29 19:05:49 +08:00
logger := log . Log . WithName ( "convertGenerateRequest" )
var errors [ ] error
2022-05-11 08:14:30 +02:00
grs , err := pclient . KyvernoV1 ( ) . GenerateRequests ( config . KyvernoNamespace ( ) ) . List ( context . TODO ( ) , metav1 . ListOptions { } )
2022-04-29 19:05:49 +08:00
if err != nil {
logger . Error ( err , "failed to list update requests" )
return err
}
for _ , gr := range grs . Items {
2022-05-17 13:12:43 +02:00
ur := & kyvernov1beta1 . UpdateRequest {
2022-04-29 19:05:49 +08:00
ObjectMeta : metav1 . ObjectMeta {
GenerateName : "ur-" ,
2022-05-11 08:14:30 +02:00
Namespace : config . KyvernoNamespace ( ) ,
2022-04-29 19:05:49 +08:00
Labels : gr . GetLabels ( ) ,
} ,
2022-05-17 13:12:43 +02:00
Spec : kyvernov1beta1 . UpdateRequestSpec {
Type : kyvernov1beta1 . Generate ,
2022-04-29 19:05:49 +08:00
Policy : gr . Spec . Policy ,
Resource : * gr . Spec . Resource . DeepCopy ( ) ,
2022-05-17 13:12:43 +02:00
Context : kyvernov1beta1 . UpdateRequestSpecContext {
UserRequestInfo : kyvernov1beta1 . RequestInfo {
2022-04-29 19:05:49 +08:00
Roles : gr . Spec . Context . UserRequestInfo . DeepCopy ( ) . Roles ,
ClusterRoles : gr . Spec . Context . UserRequestInfo . DeepCopy ( ) . ClusterRoles ,
AdmissionUserInfo : * gr . Spec . Context . UserRequestInfo . AdmissionUserInfo . DeepCopy ( ) ,
} ,
2022-05-17 13:12:43 +02:00
AdmissionRequestInfo : kyvernov1beta1 . AdmissionRequestInfoObject {
2022-04-29 19:05:49 +08:00
AdmissionRequest : gr . Spec . Context . AdmissionRequestInfo . DeepCopy ( ) . AdmissionRequest ,
Operation : gr . Spec . Context . AdmissionRequestInfo . DeepCopy ( ) . Operation ,
} ,
} ,
} ,
}
2022-05-19 18:06:56 +02:00
_ , err := pclient . KyvernoV1beta1 ( ) . UpdateRequests ( config . KyvernoNamespace ( ) ) . Create ( context . TODO ( ) , ur , metav1 . CreateOptions { } )
2022-04-29 19:05:49 +08:00
if err != nil {
logger . Info ( "failed to create UpdateRequest" , "GR namespace" , gr . GetNamespace ( ) , "GR name" , gr . GetName ( ) , "err" , err . Error ( ) )
errors = append ( errors , err )
continue
} else {
logger . Info ( "successfully created UpdateRequest" , "GR namespace" , gr . GetNamespace ( ) , "GR name" , gr . GetName ( ) )
}
2022-05-11 08:14:30 +02:00
if err := pclient . KyvernoV1 ( ) . GenerateRequests ( config . KyvernoNamespace ( ) ) . Delete ( context . TODO ( ) , gr . GetName ( ) , metav1 . DeleteOptions { } ) ; err != nil {
2022-04-29 19:05:49 +08:00
errors = append ( errors , err )
logger . Error ( err , "failed to delete GR" )
}
}
err = engineUtils . CombineErrors ( errors )
return err
}