diff --git a/scbctl/cmd/cascading.go b/scbctl/cmd/cascading.go new file mode 100644 index 0000000000..844192e70a --- /dev/null +++ b/scbctl/cmd/cascading.go @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: the secureCodeBox authors +// +// SPDX-License-Identifier: Apache-2.0 +package cmd + +import ( + "fmt" + + "github.com/ddddddO/gtree" + v1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" + "github.com/spf13/cobra" + "k8s.io/cli-runtime/pkg/genericclioptions" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +type cascadeOptions struct { + configFlags *genericclioptions.ConfigFlags + genericclioptions.IOStreams + + namespace string +} + +func NewCascadeCommand() *cobra.Command { + cascadeCmd := &cobra.Command{ + Use: "cascade", + Short: "Visualize cascading scans", + Long: `Visualize the relationships between scans based on their cascading relationships`, + RunE: func(cmd *cobra.Command, args []string) error { + kubeclient, namespace, err := clientProvider.GetClient(kubeconfigArgs) + if err != nil { + return fmt.Errorf("error initializing kubernetes client: %w", err) + } + + if namespaceFlag, err := cmd.Flags().GetString("namespace"); err == nil && namespaceFlag != "" { + namespace = namespaceFlag + } + + var scans v1.ScanList + if err := kubeclient.List(cmd.Context(), &scans, client.InNamespace(namespace)); err != nil { + return fmt.Errorf("error listing Scans: %w", err) + } + + root := buildTree(scans.Items) + + return gtree.OutputProgrammably(cmd.OutOrStdout(), root) + }, + } + + return cascadeCmd +} + +const ( + ParentScanAnnotation = "cascading.securecodebox.io/parent-scan" +) + +func buildTree(scans []v1.Scan) *gtree.Node { + root := gtree.NewRoot("Scans") + + scanMap := make(map[string]*v1.Scan) + for i := range scans { + scanMap[scans[i].Name] = &scans[i] + } + for _, scan := range scans { + scanMap[scan.Name] = &scan + } + + for _, scan := range scans { + if isInitialScan(&scan) { + scanNode := root.Add(scan.Name) + buildScanSubtree(scanNode, &scan, scanMap) + } + } + + return root +} + +func isInitialScan(scan *v1.Scan) bool { + return scan.Annotations[ParentScanAnnotation] == "" +} + +func buildScanSubtree(node *gtree.Node, scan *v1.Scan, scanMap map[string]*v1.Scan) { + for _, childScan := range scanMap { + if isCascadedFrom(childScan, scan) { + childNode := node.Add(childScan.Name) + buildScanSubtree(childNode, childScan, scanMap) + } + } +} + +func isCascadedFrom(childScan *v1.Scan, parentScan *v1.Scan) bool { + return childScan.Annotations[ParentScanAnnotation] == parentScan.Name +} diff --git a/scbctl/cmd/cascading_test.go b/scbctl/cmd/cascading_test.go new file mode 100644 index 0000000000..d85420c9f9 --- /dev/null +++ b/scbctl/cmd/cascading_test.go @@ -0,0 +1,213 @@ +// SPDX-FileCopyrightText: the secureCodeBox authors +// +// SPDX-License-Identifier: Apache-2.0 +package cmd + +import ( + "bytes" + "testing" + + "github.com/ddddddO/gtree" + v1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestBuildTree(t *testing.T) { + tests := []struct { + name string + scans []v1.Scan + expected string + }{ + { + name: "Single scan", + scans: []v1.Scan{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "scan1", + }, + }, + }, + expected: `Scans +└── scan1 +`, + }, + { + name: "Two unrelated scans", + scans: []v1.Scan{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "scan1", + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "scan2", + }, + }, + }, + expected: `Scans +├── scan1 +└── scan2 +`, + }, + { + name: "One parent, one child", + scans: []v1.Scan{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "parent", + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "child", + Annotations: map[string]string{ + ParentScanAnnotation: "parent", + }, + }, + }, + }, + expected: `Scans +└── parent + └── child +`, + }, + { + name: "Complex cascade", + scans: []v1.Scan{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "root", + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "child1", + Annotations: map[string]string{ + ParentScanAnnotation: "root", + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "child2", + Annotations: map[string]string{ + ParentScanAnnotation: "root", + }, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "grandchild", + Annotations: map[string]string{ + ParentScanAnnotation: "child1", + }, + }, + }, + }, + expected: `Scans +└── root + ├── child1 + │ └── grandchild + └── child2 +`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root := buildTree(tt.scans) + var buf bytes.Buffer + err := gtree.OutputProgrammably(&buf, root) + assert.NoError(t, err) + result := buf.String() + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestIsInitialScan(t *testing.T) { + tests := []struct { + name string + scan v1.Scan + expected bool + }{ + { + name: "Initial scan", + scan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "initial", + }, + }, + expected: true, + }, + { + name: "Child scan", + scan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "child", + Annotations: map[string]string{ + ParentScanAnnotation: "parent", + }, + }, + }, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isInitialScan(&tt.scan) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestIsCascadedFrom(t *testing.T) { + tests := []struct { + name string + childScan v1.Scan + parentScan v1.Scan + expected bool + }{ + { + name: "Direct child", + childScan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "child", + Annotations: map[string]string{ + ParentScanAnnotation: "parent", + }, + }, + }, + parentScan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "parent", + }, + }, + expected: true, + }, + { + name: "Unrelated scans", + childScan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "scan1", + }, + }, + parentScan: v1.Scan{ + ObjectMeta: metav1.ObjectMeta{ + Name: "scan2", + }, + }, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isCascadedFrom(&tt.childScan, &tt.parentScan) + assert.Equal(t, tt.expected, result) + }) + } +} diff --git a/scbctl/cmd/root.go b/scbctl/cmd/root.go index 78a576bda3..10aad2e5c4 100644 --- a/scbctl/cmd/root.go +++ b/scbctl/cmd/root.go @@ -25,6 +25,7 @@ func NewRootCommand() *cobra.Command { rootCmd.AddCommand(NewScanCommand()) rootCmd.AddCommand(NewTriggerCommand()) + rootCmd.AddCommand(NewCascadeCommand()) return rootCmd } diff --git a/scbctl/go.mod b/scbctl/go.mod index c77109b85c..b119dd6b9f 100644 --- a/scbctl/go.mod +++ b/scbctl/go.mod @@ -10,17 +10,25 @@ toolchain go1.22.3 require ( github.com/secureCodeBox/secureCodeBox/operator v0.0.0-20240709091631-4e5c4b973bf2 github.com/spf13/cobra v1.7.0 - k8s.io/api v0.30.2 - k8s.io/apimachinery v0.30.2 - k8s.io/cli-runtime v0.30.1 + k8s.io/api v0.30.3 + k8s.io/apimachinery v0.30.3 + k8s.io/cli-runtime v0.30.3 sigs.k8s.io/controller-runtime v0.18.4 ) -require github.com/stretchr/testify v1.8.4 +require github.com/stretchr/testify v1.9.0 + +require ( + github.com/fatih/color v1.16.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pelletier/go-toml/v2 v2.2.0 // indirect +) require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ddddddO/gtree v1.10.10 github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect @@ -67,9 +75,10 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/client-go v0.30.2 // indirect + k8s.io/client-go v0.30.3 // indirect k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/kubectl v0.30.3 k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect diff --git a/scbctl/go.sum b/scbctl/go.sum index 8174680682..d9f73dc78b 100644 --- a/scbctl/go.sum +++ b/scbctl/go.sum @@ -14,6 +14,8 @@ github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ddddddO/gtree v1.10.10 h1:RcPJUTsNOq8+kVKa9OK8vkUW4R6dJw38Vcf1nD+Jpms= +github.com/ddddddO/gtree v1.10.10/go.mod h1:FVCTJTSyT7F9mVNNOyAk9qyeSbXGHIFBT0Lp+EDlEK0= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -22,6 +24,8 @@ github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCv github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= @@ -96,6 +100,11 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= @@ -114,6 +123,8 @@ github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8 github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.32.0 h1:JRYU78fJ1LPxlckP6Txi/EYqJvjtMrDC04/MM5XRHPk= github.com/onsi/gomega v1.32.0/go.mod h1:a4x4gW6Pz2yK1MAmvluYme5lvYTn61afQ2ETw/8n4Lg= +github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= +github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -138,6 +149,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -145,6 +157,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -194,6 +208,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -258,22 +274,32 @@ k8s.io/api v0.30.1 h1:kCm/6mADMdbAxmIh0LBjS54nQBE+U4KmbCfIkF5CpJY= k8s.io/api v0.30.1/go.mod h1:ddbN2C0+0DIiPntan/bye3SW3PdwLa11/0yqwvuRrJM= k8s.io/api v0.30.2 h1:+ZhRj+28QT4UOH+BKznu4CBgPWgkXO7XAvMcMl0qKvI= k8s.io/api v0.30.2/go.mod h1:ULg5g9JvOev2dG0u2hig4Z7tQ2hHIuS+m8MNZ+X6EmI= +k8s.io/api v0.30.3 h1:ImHwK9DCsPA9uoU3rVh4QHAHHK5dTSv1nxJUapx8hoQ= +k8s.io/api v0.30.3/go.mod h1:GPc8jlzoe5JG3pb0KJCSLX5oAFIW3/qNJITlDj8BH04= k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws= k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4= k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U= k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= k8s.io/apimachinery v0.30.2 h1:fEMcnBj6qkzzPGSVsAZtQThU62SmQ4ZymlXRC5yFSCg= k8s.io/apimachinery v0.30.2/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc= +k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= k8s.io/cli-runtime v0.30.1 h1:kSBBpfrJGS6lllc24KeniI9JN7ckOOJKnmFYH1RpTOw= k8s.io/cli-runtime v0.30.1/go.mod h1:zhHgbqI4J00pxb6gM3gJPVf2ysDjhQmQtnTxnMScab8= +k8s.io/cli-runtime v0.30.3 h1:aG69oRzJuP2Q4o8dm+f5WJIX4ZBEwrvdID0+MXyUY6k= +k8s.io/cli-runtime v0.30.3/go.mod h1:hwrrRdd9P84CXSKzhHxrOivAR9BRnkMt0OeP5mj7X30= k8s.io/client-go v0.30.1 h1:uC/Ir6A3R46wdkgCV3vbLyNOYyCJ8oZnjtJGKfytl/Q= k8s.io/client-go v0.30.1/go.mod h1:wrAqLNs2trwiCH/wxxmT/x3hKVH9PuV0GGW0oDoHVqc= k8s.io/client-go v0.30.2 h1:sBIVJdojUNPDU/jObC+18tXWcTJVcwyqS9diGdWHk50= k8s.io/client-go v0.30.2/go.mod h1:JglKSWULm9xlJLx4KCkfLLQ7XwtlbflV6uFFSHTMgVs= +k8s.io/client-go v0.30.3 h1:bHrJu3xQZNXIi8/MoxYtZBBWQQXwy16zqJwloXXfD3k= +k8s.io/client-go v0.30.3/go.mod h1:8d4pf8vYu665/kUbsxWAQ/JDBNWqfFeZnvFiVdmx89U= k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/kubectl v0.30.3 h1:YIBBvMdTW0xcDpmrOBzcpUVsn+zOgjMYIu7kAq+yqiI= +k8s.io/kubectl v0.30.3/go.mod h1:IcR0I9RN2+zzTRUa1BzZCm4oM0NLOawE6RzlDvd1Fpo= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/controller-runtime v0.18.4 h1:87+guW1zhvuPLh1PHybKdYFLU0YJp4FhJRmiHvm5BZw= diff --git a/scbctl/pkg/client.go b/scbctl/pkg/client.go index bb0b05e195..5d63edd23a 100644 --- a/scbctl/pkg/client.go +++ b/scbctl/pkg/client.go @@ -6,6 +6,8 @@ package client import ( "fmt" + cascadingv1 "github.com/secureCodeBox/secureCodeBox/operator/apis/cascading/v1" + excv1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" v1 "github.com/secureCodeBox/secureCodeBox/operator/apis/execution/v1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -29,6 +31,8 @@ func (d *DefaultClientProvider) GetClient(flags *genericclioptions.ConfigFlags) func init() { utilruntime.Must(v1.AddToScheme(scheme)) + utilruntime.Must(cascadingv1.AddToScheme(scheme)) + utilruntime.Must(excv1.AddToScheme(scheme)) } func GetClient(flags *genericclioptions.ConfigFlags) (client.Client, string, error) {