diff --git a/cmd/initContainer/main.go b/cmd/initContainer/main.go index dd20685f87..cbbc6e7771 100644 --- a/cmd/initContainer/main.go +++ b/cmd/initContainer/main.go @@ -4,16 +4,20 @@ Cleans up stale webhookconfigurations created by kyverno that were not cleanedup package main import ( + "context" "flag" "fmt" "os" "sync" "time" + kyvernoclient "github.com/kyverno/kyverno/pkg/client/clientset/versioned" + "github.com/kyverno/kyverno/pkg/config" client "github.com/kyverno/kyverno/pkg/dclient" "github.com/kyverno/kyverno/pkg/signal" "github.com/kyverno/kyverno/pkg/utils" "k8s.io/apimachinery/pkg/api/errors" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" rest "k8s.io/client-go/rest" clientcmd "k8s.io/client-go/tools/clientcmd" "k8s.io/klog/v2" @@ -63,6 +67,17 @@ func main() { os.Exit(1) } + pclientConfig, err := config.CreateClientConfig(kubeconfig, log.Log) + if err != nil { + setupLog.Error(err, "Failed to build client config") + os.Exit(1) + } + pclient, err := kyvernoclient.NewForConfig(pclientConfig) + if err != nil { + setupLog.Error(err, "Failed to create client") + os.Exit(1) + } + // Exit for unsupported version of kubernetes cluster if !utils.HigherThanKubernetesVersion(client, log.Log, 1, 16, 0) { os.Exit(1) @@ -88,8 +103,8 @@ func main() { in := gen(done, stopCh, requests...) // process requests // processing routine count : 2 - p1 := process(client, done, stopCh, in) - p2 := process(client, done, stopCh, in) + p1 := process(client, pclient, done, stopCh, in) + p2 := process(client, pclient, done, stopCh, in) // merge results from processing routines for err := range merge(done, stopCh, p1, p2) { if err != nil { @@ -105,10 +120,10 @@ func main() { } } -func executeRequest(client *client.Client, req request) error { +func executeRequest(client *client.Client, pclient *kyvernoclient.Clientset, req request) error { switch req.kind { case policyReportKind: - return removePolicyReport(client, req.kind) + return removePolicyReport(client, pclient, req.kind) case clusterPolicyReportKind: return removeClusterPolicyReport(client, req.kind) case reportChangeRequestKind: @@ -167,14 +182,14 @@ func gen(done <-chan struct{}, stopCh <-chan struct{}, requests ...request) <-ch } // processes the requests -func process(client *client.Client, done <-chan struct{}, stopCh <-chan struct{}, requests <-chan request) <-chan error { +func process(client *client.Client, pclient *kyvernoclient.Clientset, done <-chan struct{}, stopCh <-chan struct{}, requests <-chan request) <-chan error { logger := log.Log.WithName("process") out := make(chan error) go func() { defer close(out) for req := range requests { select { - case out <- executeRequest(client, req): + case out <- executeRequest(client, pclient, req): case <-done: logger.Info("done") return @@ -231,12 +246,12 @@ func removeClusterPolicyReport(client *client.Client, kind string) error { } for _, cpolr := range cpolrs.Items { - deleteResource(client, cpolr.GetAPIVersion(), cpolr.GetKind(), "", cpolr.GetName(), nil) + deleteResource(client, cpolr.GetAPIVersion(), cpolr.GetKind(), "", cpolr.GetName()) } return nil } -func removePolicyReport(client *client.Client, kind string) error { +func removePolicyReport(client *client.Client, pclient *kyvernoclient.Clientset, kind string) error { logger := log.Log.WithName("removePolicyReport") namespaces, err := client.ListResource("", "Namespace", "", nil) @@ -245,21 +260,12 @@ func removePolicyReport(client *client.Client, kind string) error { return err } - // name of namespace policy report follows the name convention - // pr-ns- for _, ns := range namespaces.Items { - reportNames := []string{ - fmt.Sprintf("policyreport-ns-%s", ns.GetName()), - fmt.Sprintf("pr-ns-%s", ns.GetName()), - fmt.Sprintf("polr-ns-%s", ns.GetName()), + logger.Info("Removing policy reports", "namespace", ns.GetName()) + err := pclient.Wgpolicyk8sV1alpha2().PolicyReports(ns.GetName()).DeleteCollection(context.TODO(), v1.DeleteOptions{}, v1.ListOptions{}) + if err != nil { + logger.Error(err, "Failed to delete policy reports", "namespace", ns.GetName()) } - - var wg sync.WaitGroup - wg.Add(len(reportNames)) - for _, reportName := range reportNames { - go deleteResource(client, "", kind, ns.GetName(), reportName, &wg) - } - wg.Wait() } return nil @@ -276,7 +282,7 @@ func removeReportChangeRequest(client *client.Client, kind string) error { } for _, rcr := range rcrList.Items { - deleteResource(client, rcr.GetAPIVersion(), rcr.GetKind(), rcr.GetNamespace(), rcr.GetName(), nil) + deleteResource(client, rcr.GetAPIVersion(), rcr.GetKind(), rcr.GetNamespace(), rcr.GetName()) } return nil @@ -290,7 +296,7 @@ func removeClusterReportChangeRequest(client *client.Client, kind string) error } for _, crcr := range crcrList.Items { - deleteResource(client, crcr.GetAPIVersion(), crcr.GetKind(), "", crcr.GetName(), nil) + deleteResource(client, crcr.GetAPIVersion(), crcr.GetKind(), "", crcr.GetName()) } return nil } @@ -319,11 +325,7 @@ func getKyvernoNameSpace() string { return kyvernoNamespace } -func deleteResource(client *client.Client, apiversion, kind, ns, name string, wg *sync.WaitGroup) { - if wg != nil { - defer wg.Done() - } - +func deleteResource(client *client.Client, apiversion, kind, ns, name string) { err := client.DeleteResource(apiversion, kind, ns, name, false) if err != nil && !errors.IsNotFound(err) { log.Log.Error(err, "failed to delete resource", "kind", kind, "name", name)