Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kor for openSUSE:Factory checked in at 2024-07-04 16:24:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kor (Old) and /work/SRC/openSUSE:Factory/.kor.new.2080 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kor" Thu Jul 4 16:24:55 2024 rev:20 rq:1185195 version:0.5.2 Changes: -------- --- /work/SRC/openSUSE:Factory/kor/kor.changes 2024-06-19 16:39:41.628030821 +0200 +++ /work/SRC/openSUSE:Factory/.kor.new.2080/kor.changes 2024-07-04 16:26:13.521976921 +0200 @@ -1,0 +2,12 @@ +Wed Jul 03 16:36:27 UTC 2024 - opensuse_buildserv...@ojkastl.de + +- Update to version 0.5.2: + * Fix: Add filters to replicasets (#324) + * fix(multi): Support grouping by resource in multi resource mode + (#320) + * fix(delete): Refactor input handling & output display on + resource deletion (#323) + * feat: add CI step to package and publish Helm chart (#306) + * update readme to show unused reason (#317) + +------------------------------------------------------------------- Old: ---- kor-0.5.1.obscpio New: ---- kor-0.5.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kor.spec ++++++ --- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.370044412 +0200 +++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.370044412 +0200 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: kor -Version: 0.5.1 +Version: 0.5.2 Release: 0 Summary: Tool to discover unused Kubernetes Resources License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.406045727 +0200 +++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.406045727 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/yonahd/kor</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.5.1</param> + <param name="revision">v0.5.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.430046603 +0200 +++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.434046750 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/yonahd/kor</param> - <param name="changesrevision">ced2ef283271806d0102c102f21c28766344d423</param></service></servicedata> + <param name="changesrevision">181141dcce1fb608e6982500e88b8f0609b47356</param></service></servicedata> (No newline at EOF) ++++++ kor-0.5.1.obscpio -> kor-0.5.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/.github/workflows/release.yml new/kor-0.5.2/.github/workflows/release.yml --- old/kor-0.5.1/.github/workflows/release.yml 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/.github/workflows/release.yml 2024-06-26 10:08:43.000000000 +0200 @@ -53,3 +53,14 @@ - name: Update new version in krew-index uses: rajatjindal/krew-release-bot@v0.0.46 + + - name: Configure Git + run: | + git config user.name "$GITHUB_ACTOR" + git config user.email "$github_ac...@users.noreply.github.com" + + - name: Run chart-releaser + uses: helm/chart-releaser-action@v1.6.0 + env: + CR_TOKEN: "${{ secrets.RELEASE_GITHUB_TOKEN }}" + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/README.md new/kor-0.5.2/README.md --- old/kor-0.5.1/README.md 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/README.md 2024-06-26 10:08:43.000000000 +0200 @@ -31,7 +31,7 @@ - StorageClasses - NetworkPolicies -![Kor Screenshot](/images/screenshot.png) +![Kor Screenshot](/images/show_reason_screenshot.png) ## Installation @@ -224,6 +224,27 @@ Kor supports three output formats: `table`, `json`, and `yaml`. The default output format is `table`. Additionally, you can use the `--group-by` flag to group the output by `namespace` or `resource`. +#### Show reason + +```sh +kor all -n test --show-reason +``` +``` +Unused resources in namespace: "test" ++---+----------------+----------------------------------------------+--------------------------------------------------------+ +| # | RESOURCE TYPE | RESOURCE NAME | REASON | ++---+----------------+----------------------------------------------+--------------------------------------------------------+ +| 1 | Service | do-not-delete | Marked with unused label | +| 2 | Ingress | example-ingress | Ingress does not have a valid backend service | +| 3 | Ingress | example-ingress2 | Ingress does not have a valid backend service | +| 4 | ConfigMap | prober-blackbox-config | ConfigMap is not used in any pod or container | +| 5 | ConfigMap | release-name-prober-operator-blackbox-config | ConfigMap is not used in any pod or container | +| 6 | ConfigMap | unused-cm | ConfigMap is not used in any pod or container | +| 7 | ServiceAccount | my-service-account2 | ServiceAccount is not in use | +| 8 | Pdb | my-pdb | Pdb is not referencing any deployments or statefulsets | ++---+----------------+----------------------------------------------+--------------------------------------------------------+ +``` + #### Group by resource ```sh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/Chart.yaml new/kor-0.5.2/charts/kor/Chart.yaml --- old/kor-0.5.1/charts/kor/Chart.yaml 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/charts/kor/Chart.yaml 2024-06-26 10:08:43.000000000 +0200 @@ -2,8 +2,17 @@ name: kor description: A Kubernetes Helm Chart to discover orphaned resources using kor type: application -version: 0.1.8 -appVersion: "0.4.3" +version: 0.1.9 +appVersion: "0.5.1" maintainers: - name: "yonahd" url: "https://github.com/yonahd/kor" +annotations: + "artifacthub.io/license": MIT + "artifacthub.io/links": | + - name: Application Source + url: https://github.com/yonahd/kor + - name: Chart Source + url: https://github.com/yonahd/kor/tree/main/charts/kor + - name: Grafana Dashboard + url: https://grafana.com/grafana/dashboards/19863-kor-dashboard/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/charts/kor/README.md new/kor-0.5.2/charts/kor/README.md --- old/kor-0.5.1/charts/kor/README.md 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/charts/kor/README.md 2024-06-26 10:08:43.000000000 +0200 @@ -1,6 +1,6 @@ # kor -![Version: 0.1.8](https://img.shields.io/badge/Version-0.1.8-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.4.3](https://img.shields.io/badge/AppVersion-0.4.3-informational?style=flat-square) +![Version: 0.1.9](https://img.shields.io/badge/Version-0.1.9-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.5.1](https://img.shields.io/badge/AppVersion-0.5.1-informational?style=flat-square) A Kubernetes Helm Chart to discover orphaned resources using kor Binary files old/kor-0.5.1/images/show_reason_screenshot.png and new/kor-0.5.2/images/show_reason_screenshot.png differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/clusterroles.go new/kor-0.5.2/pkg/kor/clusterroles.go --- old/kor-0.5.1/pkg/kor/clusterroles.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/clusterroles.go 2024-06-26 10:08:43.000000000 +0200 @@ -44,9 +44,6 @@ usedClusterRoles := make(map[string]bool) for _, rb := range roleBindingsAllNameSpaces { - if pass, _ := filter.Run(filterOpts); pass { - continue - } usedClusterRoles[rb.RoleRef.Name] = true if rb.RoleRef.Kind == "ClusterRole" { usedClusterRoles[rb.RoleRef.Name] = true @@ -61,9 +58,6 @@ } for _, crb := range clusterRoleBindings.Items { - if pass, _ := filter.Run(filterOpts); pass { - continue - } usedClusterRoles[crb.RoleRef.Name] = true } @@ -191,6 +185,11 @@ if err != nil { fmt.Fprintf(os.Stderr, "Failed to process cluster role : %v\n", err) } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err) + } + } switch opts.GroupBy { case "namespace": resources[""] = make(map[string][]ResourceInfo) @@ -198,11 +197,6 @@ case "resource": appendResources(resources, "ClusterRole", "", diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, "", "ClusterRole", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete clusterRole %s : %v\n", diff, err) - } - } var outputBuffer bytes.Buffer var jsonResponse []byte diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/configmaps.go new/kor-0.5.2/pkg/kor/configmaps.go --- old/kor-0.5.1/pkg/kor/configmaps.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/configmaps.go 2024-06-26 10:08:43.000000000 +0200 @@ -166,6 +166,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -173,11 +178,6 @@ case "resource": appendResources(resources, "ConfigMap", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "ConfigMap", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete ConfigMap %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/daemonsets.go new/kor-0.5.2/pkg/kor/daemonsets.go --- old/kor-0.5.1/pkg/kor/daemonsets.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/daemonsets.go 2024-06-26 10:08:43.000000000 +0200 @@ -67,6 +67,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -74,11 +79,6 @@ case "resource": appendResources(resources, "DaemonSet", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "DaemonSet", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete DaemonSet %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete.go new/kor-0.5.2/pkg/kor/delete.go --- old/kor-0.5.1/pkg/kor/delete.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/delete.go 2024-06-26 10:08:43.000000000 +0200 @@ -270,58 +270,7 @@ return remainingResources, nil } -func DeleteResource(diff []string, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]string, error) { - deletedDiff := []string{} - - for _, resourceName := range diff { - deleteFunc, exists := DeleteResourceCmd()[resourceType] - if !exists { - fmt.Printf("Resource type '%s' is not supported\n", resourceName) - continue - } - - if !noInteractive { - fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resourceName, namespace) - var confirmation string - _, err := fmt.Scanf("%s", &confirmation) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err) - continue - } - - if strings.ToLower(confirmation) != "y" && strings.ToLower(confirmation) != "yes" { - deletedDiff = append(deletedDiff, resourceName) - - fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resourceName, namespace) - var inUse string - _, err := fmt.Scanf("%s", &inUse) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err) - continue - } - - if strings.ToLower(inUse) == "y" || strings.ToLower(inUse) == "yes" { - if err := FlagResource(clientset, namespace, resourceType, resourceName); err != nil { - fmt.Fprintf(os.Stderr, "Failed to flag resource %s %s in namespace %s as In Use: %v\n", resourceType, resourceName, namespace, err) - } - continue - } - continue - } - } - - fmt.Printf("Deleting %s %s in namespace %s\n", resourceType, resourceName, namespace) - if err := deleteFunc(clientset, namespace, resourceName); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", resourceType, resourceName, namespace, err) - continue - } - deletedDiff = append(deletedDiff, resourceName+"-DELETED") - } - - return deletedDiff, nil -} - -func DeleteResource2(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) { +func DeleteResource(diff []ResourceInfo, clientset kubernetes.Interface, namespace, resourceType string, noInteractive bool) ([]ResourceInfo, error) { deletedDiff := []ResourceInfo{} for _, resource := range diff { @@ -334,7 +283,7 @@ if !noInteractive { fmt.Printf("Do you want to delete %s %s in namespace %s? (Y/N): ", resourceType, resource.Name, namespace) var confirmation string - _, err := fmt.Scanf("%s", &confirmation) + _, err := fmt.Scanf("%s\n", &confirmation) if err != nil { fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err) continue @@ -345,7 +294,7 @@ fmt.Printf("Do you want flag the resource %s %s in namespace %s as In Use? (Y/N): ", resourceType, resource.Name, namespace) var inUse string - _, err := fmt.Scanf("%s", &inUse) + _, err := fmt.Scanf("%s\n", &inUse) if err != nil { fmt.Fprintf(os.Stderr, "Failed to read input: %v\n", err) continue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/delete_test.go new/kor-0.5.2/pkg/kor/delete_test.go --- old/kor-0.5.1/pkg/kor/delete_test.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/delete_test.go 2024-06-26 10:08:43.000000000 +0200 @@ -15,26 +15,42 @@ func TestDeleteResource(t *testing.T) { clientset := fake.NewSimpleClientset() + configmap1 := CreateTestConfigmap(testNamespace, "configmap-1", AppLabels) + _, err := clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap1, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error creating fake configmap: %v", err) + } + configmap2 := CreateTestConfigmap(testNamespace, "configmap-2", AppLabels) + _, err = clientset.CoreV1().ConfigMaps(testNamespace).Create(context.TODO(), configmap2, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error creating fake configmap: %v", err) + } + tests := []struct { name string - diff []string + diff []ResourceInfo resourceType string - expectedDiff []string + expectedDiff []ResourceInfo expectedError bool }{ { - name: "Test deletion confirmation", - diff: []string{"resource1", "resource2"}, - resourceType: "ConfigMap", - expectedDiff: []string{"resource1-DELETED", "resource2"}, + name: "Test deletion confirmation", + diff: []ResourceInfo{ + {Name: configmap1.Name, Reason: "ConfigMap is not used in any pod or container"}, + {Name: configmap2.Name, Reason: "Marked with unused label"}, + }, + resourceType: "ConfigMap", + expectedDiff: []ResourceInfo{ + {Name: configmap1.Name + "-DELETED", Reason: "ConfigMap is not used in any pod or container"}, + {Name: configmap2.Name + "-DELETED", Reason: "Marked with unused label"}, + }, expectedError: false, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - deletedDiff, _ := DeleteResource(test.diff, clientset, "namespace", test.resourceType, true) - + deletedDiff, _ := DeleteResource(test.diff, clientset, testNamespace, test.resourceType, true) for i, deleted := range deletedDiff { if deleted != test.expectedDiff[i] { t.Errorf("Expected: %s, Got: %s", test.expectedDiff[i], deleted) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/deployments.go new/kor-0.5.2/pkg/kor/deployments.go --- old/kor-0.5.1/pkg/kor/deployments.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/deployments.go 2024-06-26 10:08:43.000000000 +0200 @@ -49,6 +49,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -56,11 +61,6 @@ case "resource": appendResources(resources, "Deployment", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Deployment", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Deployment %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/finalizers.go new/kor-0.5.2/pkg/kor/finalizers.go --- old/kor-0.5.1/pkg/kor/finalizers.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/finalizers.go 2024-06-26 10:08:43.000000000 +0200 @@ -47,7 +47,7 @@ continue } for _, item := range resourceList.Items { - if pass, _ := filter.Run(filterOpts); pass { + if pass, _ := filter.SetObject(&item).Run(filterOpts); pass { continue } if CheckFinalizers(item.GetFinalizers(), item.GetDeletionTimestamp()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/formatter.go new/kor-0.5.2/pkg/kor/formatter.go --- old/kor-0.5.1/pkg/kor/formatter.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/formatter.go 2024-06-26 10:08:43.000000000 +0200 @@ -148,7 +148,7 @@ } } table.Render() - return fmt.Sprintf("Unused %ss:\n%s", resource, buf.String()) + return fmt.Sprintf("Unused %ss:\n%s\n", resource, buf.String()) } func appendResources(resources map[string]map[string][]ResourceInfo, resourceType, namespace string, diff []ResourceInfo) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/hpas.go new/kor-0.5.2/pkg/kor/hpas.go --- old/kor-0.5.1/pkg/kor/hpas.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/hpas.go 2024-06-26 10:08:43.000000000 +0200 @@ -88,6 +88,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -95,11 +100,6 @@ case "resource": appendResources(resources, "Hpa", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "HPA", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete HPA %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/ingresses.go new/kor-0.5.2/pkg/kor/ingresses.go --- old/kor-0.5.1/pkg/kor/ingresses.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/ingresses.go 2024-06-26 10:08:43.000000000 +0200 @@ -36,7 +36,7 @@ usedIngresses := []string{} for _, ingress := range ingresses.Items { - if pass, _ := filter.Run(filterOpts); pass { + if pass, _ := filter.SetObject(&ingress).Run(filterOpts); pass { continue } @@ -124,6 +124,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -131,11 +136,6 @@ case "resource": appendResources(resources, "Ingress", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Ingress", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Ingress %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/jobs.go new/kor-0.5.2/pkg/kor/jobs.go --- old/kor-0.5.1/pkg/kor/jobs.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/jobs.go 2024-06-26 10:08:43.000000000 +0200 @@ -73,6 +73,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -80,11 +85,6 @@ case "resource": appendResources(resources, "Job", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Job", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Job %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/multi.go new/kor-0.5.2/pkg/kor/multi.go --- old/kor-0.5.1/pkg/kor/multi.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/multi.go 2024-06-26 10:08:43.000000000 +0200 @@ -97,64 +97,62 @@ } func GetUnusedMulti(resourceNames string, filterOpts *filters.Options, clientset kubernetes.Interface, apiExtClient apiextensionsclientset.Interface, dynamicClient dynamic.Interface, outputFormat string, opts Opts) (string, error) { - var allDiffs []ResourceDiff - var outputBuffer bytes.Buffer - var unusedMulti string resourceList := strings.Split(resourceNames, ",") namespaces := filterOpts.Namespaces(clientset) - response := make(map[string]map[string][]ResourceInfo) + resources := make(map[string]map[string][]ResourceInfo) var err error noNamespaceDiff, resourceList := retrieveNoNamespaceDiff(clientset, apiExtClient, dynamicClient, resourceList, filterOpts) if len(noNamespaceDiff) != 0 { for _, diff := range noNamespaceDiff { if len(diff.diff) != 0 { - output := FormatOutputAll("", []ResourceDiff{diff}, opts) - outputBuffer.WriteString(output) - - resourceMap := make(map[string][]ResourceInfo) - resourceMap[diff.resourceType] = diff.diff - response[""] = resourceMap + if opts.DeleteFlag { + if diff.diff, err = DeleteResource(diff.diff, clientset, "", diff.resourceType, opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete %s %s: %v\n", diff.resourceType, diff.diff, err) + } + } + switch opts.GroupBy { + case "namespace": + resources[""] = make(map[string][]ResourceInfo) + resources[""][diff.resourceType] = diff.diff + case "resource": + appendResources(resources, diff.resourceType, "", diff.diff) + } } } - - resourceMap := make(map[string][]ResourceInfo) - for _, diff := range noNamespaceDiff { - resourceMap[diff.resourceType] = diff.diff - } - response[""] = resourceMap - } for _, namespace := range namespaces { - allDiffs = retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts) - - if opts.DeleteFlag { - for _, diff := range allDiffs { - if diff.diff, err = DeleteResource2(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil { + allDiffs := retrieveNamespaceDiffs(clientset, namespace, resourceList, filterOpts) + for _, diff := range allDiffs { + if opts.DeleteFlag { + if diff.diff, err = DeleteResource(diff.diff, clientset, namespace, diff.resourceType, opts.NoInteractive); err != nil { fmt.Fprintf(os.Stderr, "Failed to delete %s %s in namespace %s: %v\n", diff.resourceType, diff.diff, namespace, err) } } - - } - output := FormatOutputAll(namespace, allDiffs, opts) - if output != "" { - outputBuffer.WriteString(output) - - resourceMap := make(map[string][]ResourceInfo) - for _, diff := range allDiffs { - resourceMap[diff.resourceType] = diff.diff + switch opts.GroupBy { + case "namespace": + resources[namespace] = make(map[string][]ResourceInfo) + resources[namespace][diff.resourceType] = diff.diff + case "resource": + appendResources(resources, diff.resourceType, namespace, diff.diff) } - response[namespace] = resourceMap } } - jsonResponse, err := json.MarshalIndent(response, "", " ") - if err != nil { - return "", err + var outputBuffer bytes.Buffer + var jsonResponse []byte + switch outputFormat { + case "table": + outputBuffer = FormatOutput(resources, opts) + case "json", "yaml": + var err error + if jsonResponse, err = json.MarshalIndent(resources, "", " "); err != nil { + return "", err + } } - unusedMulti, err = unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse) + unusedMulti, err := unusedResourceFormatter(outputFormat, outputBuffer, opts, jsonResponse) if err != nil { fmt.Printf("err: %v\n", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/networkpolicies.go new/kor-0.5.2/pkg/kor/networkpolicies.go --- old/kor-0.5.1/pkg/kor/networkpolicies.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/networkpolicies.go 2024-06-26 10:08:43.000000000 +0200 @@ -62,7 +62,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } - + if opts.DeleteFlag { + if diff, err := DeleteResource(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -70,12 +74,6 @@ case "resource": appendResources(resources, "NetworkPolicy", namespace, diff) } - - if opts.DeleteFlag { - if diff, err := DeleteResource2(diff, clientset, namespace, "NetworkPolicy", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete NetworkPolicy %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pdbs.go new/kor-0.5.2/pkg/kor/pdbs.go --- old/kor-0.5.1/pkg/kor/pdbs.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/pdbs.go 2024-06-26 10:08:43.000000000 +0200 @@ -89,6 +89,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -96,11 +101,6 @@ case "resource": appendResources(resources, "Pdb", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "PDB", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete PDB %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pods.go new/kor-0.5.2/pkg/kor/pods.go --- old/kor-0.5.1/pkg/kor/pods.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/pods.go 2024-06-26 10:08:43.000000000 +0200 @@ -51,6 +51,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -58,11 +63,6 @@ case "resource": appendResources(resources, "Pod", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Pod", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Pod %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pv.go new/kor-0.5.2/pkg/kor/pv.go --- old/kor-0.5.1/pkg/kor/pv.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/pv.go 2024-06-26 10:08:43.000000000 +0200 @@ -50,6 +50,11 @@ if err != nil { fmt.Fprintf(os.Stderr, "Failed to process pvs: %v\n", err) } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, "", "PV", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err) + } + } switch opts.GroupBy { case "namespace": resources[""] = make(map[string][]ResourceInfo) @@ -57,11 +62,6 @@ case "resource": appendResources(resources, "Pv", "", diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, "", "PV", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete PV %s: %v\n", diff, err) - } - } var outputBuffer bytes.Buffer var jsonResponse []byte diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/pvc.go new/kor-0.5.2/pkg/kor/pvc.go --- old/kor-0.5.1/pkg/kor/pvc.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/pvc.go 2024-06-26 10:08:43.000000000 +0200 @@ -80,6 +80,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -87,11 +92,6 @@ case "resource": appendResources(resources, "Pvc", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "PVC", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete PVC %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/replicaset.go new/kor-0.5.2/pkg/kor/replicaset.go --- old/kor-0.5.1/pkg/kor/replicaset.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/replicaset.go 2024-06-26 10:08:43.000000000 +0200 @@ -22,7 +22,7 @@ var unusedReplicaSetNames []ResourceInfo for _, replicaSet := range replicaSetList.Items { - if pass, _ := filter.Run(filterOpts); pass { + if pass, _ := filter.SetObject(&replicaSet).Run(filterOpts); pass { continue } @@ -44,6 +44,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -51,11 +56,6 @@ case "resource": appendResources(resources, "ReplicaSet", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "ReplicaSet", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete ReplicaSet %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles.go new/kor-0.5.2/pkg/kor/roles.go --- old/kor-0.5.1/pkg/kor/roles.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/roles.go 2024-06-26 10:08:43.000000000 +0200 @@ -18,7 +18,7 @@ //go:embed exceptions/roles/roles.json var rolesConfig []byte -func retrieveUsedRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]string, error) { +func retrieveUsedRoles(clientset kubernetes.Interface, namespace string) ([]string, error) { // Get a list of all role bindings in the specified namespace roleBindings, err := clientset.RbacV1().RoleBindings(namespace).List(context.TODO(), metav1.ListOptions{}) if err != nil { @@ -27,10 +27,6 @@ usedRoles := make(map[string]bool) for _, rb := range roleBindings.Items { - if pass, _ := filter.Run(filterOpts); pass { - continue - } - usedRoles[rb.RoleRef.Name] = true } @@ -78,7 +74,7 @@ } func processNamespaceRoles(clientset kubernetes.Interface, namespace string, filterOpts *filters.Options) ([]ResourceInfo, error) { - usedRoles, err := retrieveUsedRoles(clientset, namespace, filterOpts) + usedRoles, err := retrieveUsedRoles(clientset, namespace) if err != nil { return nil, err } @@ -113,6 +109,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -120,11 +121,6 @@ case "resource": appendResources(resources, "Role", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Role", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Role %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/roles_test.go new/kor-0.5.2/pkg/kor/roles_test.go --- old/kor-0.5.1/pkg/kor/roles_test.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/roles_test.go 2024-06-26 10:08:43.000000000 +0200 @@ -63,7 +63,7 @@ func TestRetrieveUsedRoles(t *testing.T) { clientset := createTestRoles(t) - usedRoles, err := retrieveUsedRoles(clientset, testNamespace, &filters.Options{}) + usedRoles, err := retrieveUsedRoles(clientset, testNamespace) if err != nil { t.Errorf("Expected no error, got %v", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/secrets.go new/kor-0.5.2/pkg/kor/secrets.go --- old/kor-0.5.1/pkg/kor/secrets.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/secrets.go 2024-06-26 10:08:43.000000000 +0200 @@ -203,6 +203,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -210,11 +215,6 @@ case "resource": appendResources(resources, "Secret", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Secret", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Secret %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/serviceaccounts.go new/kor-0.5.2/pkg/kor/serviceaccounts.go --- old/kor-0.5.1/pkg/kor/serviceaccounts.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/serviceaccounts.go 2024-06-26 10:08:43.000000000 +0200 @@ -171,6 +171,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": resources[namespace] = make(map[string][]ResourceInfo) @@ -178,11 +183,6 @@ case "resource": appendResources(resources, "ServiceAccount", namespace, diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "ServiceAccount", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Serviceaccount %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/services.go new/kor-0.5.2/pkg/kor/services.go --- old/kor-0.5.1/pkg/kor/services.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/services.go 2024-06-26 10:08:43.000000000 +0200 @@ -31,7 +31,7 @@ var endpointsWithoutSubsets []ResourceInfo for _, endpoints := range endpointsList.Items { - if pass, _ := filter.Run(filterOpts); pass { + if pass, _ := filter.SetObject(&endpoints).Run(filterOpts); pass { continue } @@ -68,7 +68,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } - + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": if diff != nil { @@ -79,13 +83,6 @@ if diff != nil { appendResources(resources, "Service", namespace, diff) } - - } - - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "Service", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Service %s in namespace %s: %v\n", diff, namespace, err) - } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/statefulsets.go new/kor-0.5.2/pkg/kor/statefulsets.go --- old/kor-0.5.1/pkg/kor/statefulsets.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/statefulsets.go 2024-06-26 10:08:43.000000000 +0200 @@ -22,7 +22,7 @@ var statefulSetsWithoutReplicas []ResourceInfo for _, statefulSet := range statefulSetsList.Items { - if pass, _ := filter.Run(filterOpts); pass { + if pass, _ := filter.SetObject(&statefulSet).Run(filterOpts); pass { continue } @@ -51,6 +51,11 @@ fmt.Fprintf(os.Stderr, "Failed to process namespace %s: %v\n", namespace, err) continue } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err) + } + } switch opts.GroupBy { case "namespace": if diff != nil { @@ -62,11 +67,6 @@ appendResources(resources, "StatefulSet", namespace, diff) } } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, namespace, "StatefulSet", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete Statefulset %s in namespace %s: %v\n", diff, namespace, err) - } - } } var outputBuffer bytes.Buffer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kor-0.5.1/pkg/kor/storageclasses.go new/kor-0.5.2/pkg/kor/storageclasses.go --- old/kor-0.5.1/pkg/kor/storageclasses.go 2024-06-18 20:44:31.000000000 +0200 +++ new/kor-0.5.2/pkg/kor/storageclasses.go 2024-06-26 10:08:43.000000000 +0200 @@ -104,6 +104,11 @@ if err != nil { fmt.Fprintf(os.Stderr, "Failed to process storageClasses: %v\n", err) } + if opts.DeleteFlag { + if diff, err = DeleteResource(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil { + fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err) + } + } switch opts.GroupBy { case "namespace": resources[""] = make(map[string][]ResourceInfo) @@ -111,11 +116,6 @@ case "resource": appendResources(resources, "StorageClass", "", diff) } - if opts.DeleteFlag { - if diff, err = DeleteResource2(diff, clientset, "", "StorageClass", opts.NoInteractive); err != nil { - fmt.Fprintf(os.Stderr, "Failed to delete StorageClass %s: %v\n", diff, err) - } - } var outputBuffer bytes.Buffer var jsonResponse []byte ++++++ kor.obsinfo ++++++ --- /var/tmp/diff_new_pack.Dfm6ww/_old 2024-07-04 16:26:15.610053177 +0200 +++ /var/tmp/diff_new_pack.Dfm6ww/_new 2024-07-04 16:26:15.614053323 +0200 @@ -1,5 +1,5 @@ name: kor -version: 0.5.1 -mtime: 1718736271 -commit: ced2ef283271806d0102c102f21c28766344d423 +version: 0.5.2 +mtime: 1719389323 +commit: 181141dcce1fb608e6982500e88b8f0609b47356 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/kor/vendor.tar.gz /work/SRC/openSUSE:Factory/.kor.new.2080/vendor.tar.gz differ: char 5, line 1