From 252a1ec30df6754919a36c49720cb55fd81ccf66 Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Fri, 31 Oct 2025 18:22:59 +0600 Subject: [PATCH 1/7] Add gitops cli Signed-off-by: obaydullahmhs --- pkg/debug/gitops.go | 168 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 pkg/debug/gitops.go diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go new file mode 100644 index 000000000..c5766172a --- /dev/null +++ b/pkg/debug/gitops.go @@ -0,0 +1,168 @@ +/* +Copyright AppsCode Inc. and Contributors + +Licensed under the AppsCode Community License 1.0.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://github.com/appscode/licenses/raw/1.0.0/AppsCode-Community-1.0.0.md + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package debug + +import ( + "bytes" + "context" + "log" + "os" + "path" + + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/kubernetes" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/klog/v2" + cmdutil "k8s.io/kubectl/pkg/cmd/util" + kmapi "kmodules.xyz/client-go/api/v1" + dbapi "kubedb.dev/apimachinery/apis/kubedb/v1" + kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme" + ps "kubeops.dev/petset/client/clientset/versioned" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var scheme = runtime.NewScheme() + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(kubedbscheme.AddToScheme(scheme)) +} + +type dbInfo struct { + resource string + name string + namespace string +} +type gitOpsOpts struct { + kc client.Client + db dbInfo + + operatorNamespace string + dir string + errWriter *bytes.Buffer +} + +func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { + var ( + dbName string + operatorNamespace string + ) + + gitOpsDebugCmd := &cobra.Command{ + Use: "gitops", + Aliases: []string{ + "git", + }, + Short: "Debug helper for gitops databases", + Example: `kubectl dba debug gitops --db-type mysql -n demo sample-mysql --operator-namespace kubedb`, + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + log.Fatal("Enter mysql object's name as an argument") + } + dbName = args[0] + + namespace, _, err := f.ToRawKubeConfigLoader().Namespace() + if err != nil { + klog.Error(err, "failed to get current namespace") + } + + opts, err := newGitOpsOpts(f, dbName, namespace, operatorNamespace) + if err != nil { + log.Fatalln(err) + } + + err = opts.collectGitOpsDatabase() + if err != nil { + log.Fatal(err) + } + + err = opts.collectForAllDBPetSets() + if err != nil { + log.Fatal(err) + } + + err = opts.collectForAllDBPods() + if err != nil { + log.Fatal(err) + } + + err = opts.collectOtherYamls() + if err != nil { + log.Fatal(err) + } + }, + } + gitOpsDebugCmd.Flags().StringVarP(&operatorNamespace, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") + gitOpsDebugCmd.Flags().StringVarP(&opts, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") + + return gitOpsDebugCmd +} + +func newGitOpsOpts(f cmdutil.Factory, dbName, namespace, operatorNS string) (*gitOpsOpts, error) { + config, err := f.ToRESTConfig() + if err != nil { + return nil, err + } + + kc, err := client.New(config, client.Options{Scheme: scheme}) + if err != nil { + log.Fatalf("failed to create client: %v", err) + } + + pwd, _ := os.Getwd() + dir := path.Join(pwd, dbName) + err = os.MkdirAll(path.Join(dir, logsDir), dirPerm) + if err != nil { + return nil, err + } + err = os.MkdirAll(path.Join(dir, yamlsDir), dirPerm) + if err != nil { + return nil, err + } + + opts := &gitOpsOpts{ + db: dbInfo{ + name: dbName, + namespace: namespace, + }, + kc: kc, + operatorNamespace: operatorNS, + dir: dir, + errWriter: &bytes.Buffer{}, + } + return opts, nil +} + +func (g *gitOpsOpts) collectGitOpsDatabase() error { + var uns unstructured.Unstructured + uns.SetGroupVersionKind(dbapi.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource))) + err := g.kc.Get(context.Background(), types.NamespacedName{ + Namespace: g.db.namespace, + Name: g.db.name, + }, &uns) + if err != nil { + log.Fatalf("failed to get database: %v", err) + } + + return writeYaml(&uns, path.Join(g.dir, yamlsDir)) +} From b005396d2729e0a5b5416f1c1f5df4fd77a14e95 Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Mon, 3 Nov 2025 18:53:19 +0600 Subject: [PATCH 2/7] added more func Signed-off-by: obaydullahmhs --- pkg/debug/gitops.go | 186 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 148 insertions(+), 38 deletions(-) diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index c5766172a..36ab4e0ab 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -19,25 +19,27 @@ package debug import ( "bytes" "context" + "fmt" "log" "os" "path" + "strings" "github.com/spf13/cobra" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/kubernetes" + "k8s.io/client-go/discovery" clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth" + "k8s.io/client-go/rest" "k8s.io/klog/v2" cmdutil "k8s.io/kubectl/pkg/cmd/util" - kmapi "kmodules.xyz/client-go/api/v1" + gitops "kubedb.dev/apimachinery/apis/gitops/v1alpha1" dbapi "kubedb.dev/apimachinery/apis/kubedb/v1" + opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1" kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme" - ps "kubeops.dev/petset/client/clientset/versioned" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -48,18 +50,27 @@ func init() { utilruntime.Must(kubedbscheme.AddToScheme(scheme)) } +type GitOpsStatus struct { + GitOps gitops.GitOpsStatus `json:"gitops,omitempty" yaml:"gitops,omitempty"` +} +type GitOps struct { + Status GitOpsStatus `json:"status,omitempty" yaml:"status,omitempty"` +} + type dbInfo struct { resource string name string namespace string } type gitOpsOpts struct { - kc client.Client - db dbInfo + kc client.Client + config *rest.Config + db dbInfo operatorNamespace string dir string errWriter *bytes.Buffer + resMap map[string]string } func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { @@ -67,7 +78,7 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { dbName string operatorNamespace string ) - + opts := newGitOpsOpts(f) gitOpsDebugCmd := &cobra.Command{ Use: "gitops", Aliases: []string{ @@ -86,42 +97,43 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { klog.Error(err, "failed to get current namespace") } - opts, err := newGitOpsOpts(f, dbName, namespace, operatorNamespace) + pwd, _ := os.Getwd() + dir := path.Join(pwd, dbName) + err = os.MkdirAll(path.Join(dir, logsDir), dirPerm) if err != nil { - log.Fatalln(err) + log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) } - - err = opts.collectGitOpsDatabase() + err = os.MkdirAll(path.Join(dir, yamlsDir), dirPerm) if err != nil { - log.Fatal(err) + log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) } - - err = opts.collectForAllDBPetSets() - if err != nil { - log.Fatal(err) + opts.dir = dir + opts.db = dbInfo{ + namespace: namespace, + name: dbName, } - err = opts.collectForAllDBPods() + err = opts.collectGitOpsDatabase() if err != nil { log.Fatal(err) } - err = opts.collectOtherYamls() + err = opts.collectDatabase() if err != nil { log.Fatal(err) } }, } gitOpsDebugCmd.Flags().StringVarP(&operatorNamespace, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") - gitOpsDebugCmd.Flags().StringVarP(&opts, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") + gitOpsDebugCmd.Flags().StringVarP(&opts.db.resource, "db-type", "t", "postgre", "database type") return gitOpsDebugCmd } -func newGitOpsOpts(f cmdutil.Factory, dbName, namespace, operatorNS string) (*gitOpsOpts, error) { +func newGitOpsOpts(f cmdutil.Factory) *gitOpsOpts { config, err := f.ToRESTConfig() if err != nil { - return nil, err + log.Fatalln(err) } kc, err := client.New(config, client.Options{Scheme: scheme}) @@ -129,31 +141,82 @@ func newGitOpsOpts(f cmdutil.Factory, dbName, namespace, operatorNS string) (*gi log.Fatalf("failed to create client: %v", err) } - pwd, _ := os.Getwd() - dir := path.Join(pwd, dbName) - err = os.MkdirAll(path.Join(dir, logsDir), dirPerm) + opts := &gitOpsOpts{ + kc: kc, + config: config, + errWriter: &bytes.Buffer{}, + } + return opts +} + +func (g *gitOpsOpts) collectGitOpsDatabase() error { + var uns unstructured.Unstructured + uns.SetGroupVersionKind(gitops.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource))) + err := g.kc.Get(context.Background(), types.NamespacedName{ + Namespace: g.db.namespace, + Name: g.db.name, + }, &uns) if err != nil { - return nil, err + log.Fatalf("failed to get gitops database obj: %v", err) + return err } - err = os.MkdirAll(path.Join(dir, yamlsDir), dirPerm) + + var gitOpsObj GitOps + err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &gitOpsObj) if err != nil { - return nil, err + log.Fatalf("failed to convert unstructured to gitops obj: %v", err) + return err } - opts := &gitOpsOpts{ - db: dbInfo{ - name: dbName, - namespace: namespace, - }, - kc: kc, - operatorNamespace: operatorNS, - dir: dir, - errWriter: &bytes.Buffer{}, + if err := g.collectOpsRequests(gitOpsObj.Status); err != nil { + return err } - return opts, nil + + return writeYaml(&uns, g.dir) } -func (g *gitOpsOpts) collectGitOpsDatabase() error { +func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { + opsYamlDir := path.Join(g.dir, yamlsDir, "ops") + err := os.MkdirAll(opsYamlDir, dirPerm) + if err != nil { + return err + } + for _, info := range gitOpsStatus.GitOps.GitOpsInfo { + for _, op := range info.Operations { + var uns unstructured.Unstructured + uns.SetGroupVersionKind(opsapi.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource + "opsrequest"))) + err := g.kc.Get(context.Background(), types.NamespacedName{ + Namespace: g.db.namespace, + Name: op.Name, + }, &uns) + if err != nil { + log.Fatalf("failed to get opsrequest: %v", err) + return err + } + err = writeYaml(&uns, opsYamlDir) + if err != nil { + return err + } + var opsStatus opsapi.OpsRequestStatus + err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &opsStatus) + if err != nil { + log.Fatalf("failed to convert unstructured to opsrequest obj: %v", err) + return err + } + if opsStatus.Phase == opsapi.OpsRequestPhaseFailed { + for _, cond := range opsStatus.Conditions { + if cond.Type == opsapi.Failed { + + } + } + } + } + } + + return nil +} + +func (g *gitOpsOpts) collectDatabase() error { var uns unstructured.Unstructured uns.SetGroupVersionKind(dbapi.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource))) err := g.kc.Get(context.Background(), types.NamespacedName{ @@ -166,3 +229,50 @@ func (g *gitOpsOpts) collectGitOpsDatabase() error { return writeYaml(&uns, path.Join(g.dir, yamlsDir)) } + +func (g *gitOpsOpts) populateResourceMap() error { + dc, err := discovery.NewDiscoveryClientForConfig(g.config) + if err != nil { + return err + } + g.resMap = make(map[string]string) + + if err := g.populate(dc, "kubedb.com/v1"); err != nil { + return err + } + if err := g.populate(dc, "kubedb.com/v1alpha2"); err != nil { + return err + } + if err := g.populate(dc, "gitops.kubedb.com/v1alpha1"); err != nil { + return err + } + if err := g.populate(dc, "ops.kubedb.com/v1alpha1"); err != nil { + return err + } + return nil +} + +func (g *gitOpsOpts) populate(dc *discovery.DiscoveryClient, gv string) error { + resources, err := dc.ServerResourcesForGroupVersion(gv) + if err != nil { + return err + } + for _, r := range resources.APIResources { + if !strings.ContainsAny(r.Name, "/") { + g.resMap[r.Name] = r.Kind + g.resMap[r.SingularName] = r.Kind + for _, s := range r.ShortNames { + g.resMap[s] = r.Kind + } + g.resMap[r.Kind] = r.Kind + } + } + return nil +} +func (g *gitOpsOpts) getKindFromResource(res string) string { + kind, exists := g.resMap[res] + if !exists { + _ = fmt.Errorf("resource %s not supported", res) + } + return kind +} From c39cb67721aecbaeba600aed7d428b3f776ec53a Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Tue, 4 Nov 2025 09:53:11 +0000 Subject: [PATCH 3/7] finish remaining Signed-off-by: obaydullahmhs --- pkg/cmds/debug.go | 2 + pkg/debug/gitops.go | 130 +++++++++++++++++++++++++++++++++----------- 2 files changed, 99 insertions(+), 33 deletions(-) diff --git a/pkg/cmds/debug.go b/pkg/cmds/debug.go index 769199dd0..25e8b62fd 100644 --- a/pkg/cmds/debug.go +++ b/pkg/cmds/debug.go @@ -36,6 +36,7 @@ var ( * mysql * postgres * redis + * gitops `) ) @@ -62,6 +63,7 @@ func NewCmdDebug(f cmdutil.Factory) *cobra.Command { cmd.AddCommand(debug.PostgresDebugCMD(f)) cmd.AddCommand(debug.ProxySQLDebugCMD(f)) cmd.AddCommand(debug.RedisDebugCMD(f)) + cmd.AddCommand(debug.GitOpsDebugCMD(f)) // KubeDB v1alpha2 databases cmd.AddCommand(debug.CassandraDebugCMD(f)) diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index 36ab4e0ab..df25da810 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -25,21 +25,24 @@ import ( "path" "strings" + gitops "kubedb.dev/apimachinery/apis/gitops/v1alpha1" + dbapi "kubedb.dev/apimachinery/apis/kubedb/v1" + opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1" + kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme" + "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes" clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth" "k8s.io/client-go/rest" - "k8s.io/klog/v2" cmdutil "k8s.io/kubectl/pkg/cmd/util" - gitops "kubedb.dev/apimachinery/apis/gitops/v1alpha1" - dbapi "kubedb.dev/apimachinery/apis/kubedb/v1" - opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1" - kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -53,6 +56,7 @@ func init() { type GitOpsStatus struct { GitOps gitops.GitOpsStatus `json:"gitops,omitempty" yaml:"gitops,omitempty"` } + type GitOps struct { Status GitOpsStatus `json:"status,omitempty" yaml:"status,omitempty"` } @@ -62,10 +66,12 @@ type dbInfo struct { name string namespace string } + type gitOpsOpts struct { - kc client.Client - config *rest.Config - db dbInfo + kc client.Client + config *rest.Config + db dbInfo + kubeClient kubernetes.Interface operatorNamespace string dir string @@ -74,10 +80,7 @@ type gitOpsOpts struct { } func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { - var ( - dbName string - operatorNamespace string - ) + var dbName string opts := newGitOpsOpts(f) gitOpsDebugCmd := &cobra.Command{ Use: "gitops", @@ -92,14 +95,9 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { } dbName = args[0] - namespace, _, err := f.ToRawKubeConfigLoader().Namespace() - if err != nil { - klog.Error(err, "failed to get current namespace") - } - pwd, _ := os.Getwd() dir := path.Join(pwd, dbName) - err = os.MkdirAll(path.Join(dir, logsDir), dirPerm) + err := os.MkdirAll(path.Join(dir, logsDir), dirPerm) if err != nil { log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) } @@ -108,9 +106,11 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) } opts.dir = dir - opts.db = dbInfo{ - namespace: namespace, - name: dbName, + opts.db.name = dbName + + err = opts.populateResourceMap() + if err != nil { + log.Fatal(err) } err = opts.collectGitOpsDatabase() @@ -122,10 +122,17 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatal(err) } + + err = opts.collectOperatorLogs(opts.operatorNamespace) + if err != nil { + log.Fatal(err) + } }, } - gitOpsDebugCmd.Flags().StringVarP(&operatorNamespace, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") - gitOpsDebugCmd.Flags().StringVarP(&opts.db.resource, "db-type", "t", "postgre", "database type") + + gitOpsDebugCmd.Flags().StringVarP(&opts.db.namespace, "namespace", "n", "demo", "Database namespace") + gitOpsDebugCmd.Flags().StringVarP(&opts.operatorNamespace, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") + gitOpsDebugCmd.Flags().StringVarP(&opts.db.resource, "db-type", "t", "postgres", "database type") return gitOpsDebugCmd } @@ -141,10 +148,16 @@ func newGitOpsOpts(f cmdutil.Factory) *gitOpsOpts { log.Fatalf("failed to create client: %v", err) } + cs, err := kubernetes.NewForConfig(config) + if err != nil { + log.Fatalf("failed to create kube client: %v", err) + } + opts := &gitOpsOpts{ - kc: kc, - config: config, - errWriter: &bytes.Buffer{}, + kc: kc, + config: config, + errWriter: &bytes.Buffer{}, + kubeClient: cs, } return opts } @@ -203,13 +216,13 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { log.Fatalf("failed to convert unstructured to opsrequest obj: %v", err) return err } - if opsStatus.Phase == opsapi.OpsRequestPhaseFailed { - for _, cond := range opsStatus.Conditions { - if cond.Type == opsapi.Failed { - - } - } - } + // if opsStatus.Phase == opsapi.OpsRequestPhaseFailed { + // for _, cond := range opsStatus.Conditions { + // if cond.Type == opsapi.Failed { + // // TODO: () + // } + // } + // } } } @@ -230,6 +243,28 @@ func (g *gitOpsOpts) collectDatabase() error { return writeYaml(&uns, path.Join(g.dir, yamlsDir)) } +func (g *gitOpsOpts) collectOperatorLogs(operatorNamespace string) error { + pods, err := g.kubeClient.CoreV1().Pods(operatorNamespace).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err + } + for _, pod := range pods.Items { + isOperatorPod := false + for _, container := range pod.Spec.Containers { + if container.Name == operatorContainerName { + isOperatorPod = true + } + } + if isOperatorPod { + err = g.writeLogs(pod.Name, pod.Namespace, operatorContainerName) + if err != nil { + return err + } + } + } + return nil +} + func (g *gitOpsOpts) populateResourceMap() error { dc, err := discovery.NewDiscoveryClientForConfig(g.config) if err != nil { @@ -269,6 +304,7 @@ func (g *gitOpsOpts) populate(dc *discovery.DiscoveryClient, gv string) error { } return nil } + func (g *gitOpsOpts) getKindFromResource(res string) string { kind, exists := g.resMap[res] if !exists { @@ -276,3 +312,31 @@ func (g *gitOpsOpts) getKindFromResource(res string) string { } return kind } + +func (g *gitOpsOpts) writeLogs(podName, ns, container string) error { + req := g.kubeClient.CoreV1().Pods(ns).GetLogs(podName, &corev1.PodLogOptions{ + Container: container, + }) + + podLogs, err := req.Stream(context.TODO()) + if err != nil { + return err + } + defer podLogs.Close() + + logFile, err := os.Create(path.Join(g.dir, logsDir, podName+"_"+container+".log")) + if err != nil { + return err + } + defer logFile.Close() + + buf := make([]byte, 1024) + for { + bytesRead, err := podLogs.Read(buf) + if err != nil { + break + } + _, _ = logFile.Write(buf[:bytesRead]) + } + return nil +} From f524c8af13752a33f37b4bfafc89d18ad691de47 Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Wed, 5 Nov 2025 12:01:01 +0600 Subject: [PATCH 4/7] Added summary Signed-off-by: obaydullahmhs --- pkg/debug/gitops.go | 48 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index df25da810..6d21fbb90 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -61,6 +61,10 @@ type GitOps struct { Status GitOpsStatus `json:"status,omitempty" yaml:"status,omitempty"` } +type Ops struct { + Status *opsapi.OpsRequestStatus `json:"status,omitempty" yaml:"status,omitempty"` +} + type dbInfo struct { resource string name string @@ -77,6 +81,7 @@ type gitOpsOpts struct { dir string errWriter *bytes.Buffer resMap map[string]string + summary []string } func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { @@ -127,6 +132,12 @@ func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatal(err) } + + fmt.Println("Summary:") + for _, line := range opts.summary { + fmt.Println("- ", line) + } + fmt.Println("--------------- Done ---------------") }, } @@ -158,6 +169,8 @@ func newGitOpsOpts(f cmdutil.Factory) *gitOpsOpts { config: config, errWriter: &bytes.Buffer{}, kubeClient: cs, + resMap: make(map[string]string), + summary: make([]string, 0), } return opts } @@ -181,6 +194,23 @@ func (g *gitOpsOpts) collectGitOpsDatabase() error { return err } + statuses := []string{ + string(gitops.ChangeRequestStatusInCurrent), string(gitops.ChangeRequestStatusPending), + string(gitops.ChangeRequestStatusInProgress), string(gitops.ChangeRequestStatusFailed), + } + statusIdx := 0 + for _, info := range gitOpsObj.Status.GitOps.GitOpsInfo { + for i := range statuses { + if string(info.ChangeRequestStatus) == statuses[i] { + if i > statusIdx { + statusIdx = i + } + } + } + } + + g.summary = append(g.summary, fmt.Sprintf("GitOps Database Status for: %s/%s is %s", g.db.namespace, g.db.name, statuses[statusIdx])) + if err := g.collectOpsRequests(gitOpsObj.Status); err != nil { return err } @@ -210,19 +240,19 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { if err != nil { return err } - var opsStatus opsapi.OpsRequestStatus - err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &opsStatus) + var ops Ops + err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &ops) if err != nil { log.Fatalf("failed to convert unstructured to opsrequest obj: %v", err) return err } - // if opsStatus.Phase == opsapi.OpsRequestPhaseFailed { - // for _, cond := range opsStatus.Conditions { - // if cond.Type == opsapi.Failed { - // // TODO: () - // } - // } - // } + if ops.Status.Phase == opsapi.OpsRequestPhaseFailed { + for _, cond := range ops.Status.Conditions { + if cond.Reason == opsapi.Failed { + g.summary = append(g.summary, fmt.Sprintf("RequestName %s: %s", op.Name, cond.Message)) + } + } + } } } From af61d2f8f1b44cd5ca19e0ba427e74b443c54a9f Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Thu, 6 Nov 2025 19:19:38 +0600 Subject: [PATCH 5/7] make gitops common Signed-off-by: obaydullahmhs --- pkg/cmds/debug.go | 1 - pkg/debug/common.go | 10 ++ pkg/debug/gitops.go | 263 +++++++------------------------------------ pkg/debug/helpers.go | 10 ++ 4 files changed, 58 insertions(+), 226 deletions(-) diff --git a/pkg/cmds/debug.go b/pkg/cmds/debug.go index 25e8b62fd..6cbc168b6 100644 --- a/pkg/cmds/debug.go +++ b/pkg/cmds/debug.go @@ -63,7 +63,6 @@ func NewCmdDebug(f cmdutil.Factory) *cobra.Command { cmd.AddCommand(debug.PostgresDebugCMD(f)) cmd.AddCommand(debug.ProxySQLDebugCMD(f)) cmd.AddCommand(debug.RedisDebugCMD(f)) - cmd.AddCommand(debug.GitOpsDebugCMD(f)) // KubeDB v1alpha2 databases cmd.AddCommand(debug.CassandraDebugCMD(f)) diff --git a/pkg/debug/common.go b/pkg/debug/common.go index 2159b2599..e4f664ce4 100644 --- a/pkg/debug/common.go +++ b/pkg/debug/common.go @@ -117,6 +117,16 @@ func (opts *dbOpts) collectALl() error { if err != nil { return err } + if IsOwnByGitOpsObject(opts.db.GetOwnerReferences(), opts.db.GetName(), opts.kind) { + gitOpsOpts, err := newGitOpsOpts(opts.kc, opts.db.GetName(), opts.db.GetNamespace(), opts.kind, path.Join(opts.dir, "gitops")) + if err != nil { + return err + } + err = gitOpsOpts.collectGitOpsYamls() + if err != nil { + return err + } + } return nil } diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index 6d21fbb90..b00578f86 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -17,42 +17,23 @@ limitations under the License. package debug import ( - "bytes" "context" "fmt" "log" "os" "path" - "strings" gitops "kubedb.dev/apimachinery/apis/gitops/v1alpha1" - dbapi "kubedb.dev/apimachinery/apis/kubedb/v1" opsapi "kubedb.dev/apimachinery/apis/ops/v1alpha1" - kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme" - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/discovery" - "k8s.io/client-go/kubernetes" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" _ "k8s.io/client-go/plugin/pkg/client/auth" - "k8s.io/client-go/rest" - cmdutil "k8s.io/kubectl/pkg/cmd/util" "sigs.k8s.io/controller-runtime/pkg/client" ) -var scheme = runtime.NewScheme() - -func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(kubedbscheme.AddToScheme(scheme)) -} - type GitOpsStatus struct { GitOps gitops.GitOpsStatus `json:"gitops,omitempty" yaml:"gitops,omitempty"` } @@ -66,118 +47,58 @@ type Ops struct { } type dbInfo struct { - resource string + kind string name string namespace string } type gitOpsOpts struct { - kc client.Client - config *rest.Config - db dbInfo - kubeClient kubernetes.Interface + kc client.Client + db dbInfo - operatorNamespace string - dir string - errWriter *bytes.Buffer - resMap map[string]string - summary []string + dir string + summary []string } -func GitOpsDebugCMD(f cmdutil.Factory) *cobra.Command { - var dbName string - opts := newGitOpsOpts(f) - gitOpsDebugCmd := &cobra.Command{ - Use: "gitops", - Aliases: []string{ - "git", - }, - Short: "Debug helper for gitops databases", - Example: `kubectl dba debug gitops --db-type mysql -n demo sample-mysql --operator-namespace kubedb`, - Run: func(cmd *cobra.Command, args []string) { - if len(args) == 0 { - log.Fatal("Enter mysql object's name as an argument") - } - dbName = args[0] - - pwd, _ := os.Getwd() - dir := path.Join(pwd, dbName) - err := os.MkdirAll(path.Join(dir, logsDir), dirPerm) - if err != nil { - log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) - } - err = os.MkdirAll(path.Join(dir, yamlsDir), dirPerm) - if err != nil { - log.Fatalln(fmt.Errorf("failed to create directory %s: %w", dir, err)) - } - opts.dir = dir - opts.db.name = dbName - - err = opts.populateResourceMap() - if err != nil { - log.Fatal(err) - } - - err = opts.collectGitOpsDatabase() - if err != nil { - log.Fatal(err) - } - - err = opts.collectDatabase() - if err != nil { - log.Fatal(err) - } - - err = opts.collectOperatorLogs(opts.operatorNamespace) - if err != nil { - log.Fatal(err) - } - - fmt.Println("Summary:") - for _, line := range opts.summary { - fmt.Println("- ", line) - } - fmt.Println("--------------- Done ---------------") - }, - } - - gitOpsDebugCmd.Flags().StringVarP(&opts.db.namespace, "namespace", "n", "demo", "Database namespace") - gitOpsDebugCmd.Flags().StringVarP(&opts.operatorNamespace, "operator-namespace", "o", "kubedb", "the namespace where the kubedb gitops operator is installed") - gitOpsDebugCmd.Flags().StringVarP(&opts.db.resource, "db-type", "t", "postgres", "database type") - - return gitOpsDebugCmd -} - -func newGitOpsOpts(f cmdutil.Factory) *gitOpsOpts { - config, err := f.ToRESTConfig() +func (g *gitOpsOpts) collectGitOpsYamls() error { + err := g.collectGitOpsDatabase() if err != nil { - log.Fatalln(err) + return err } - kc, err := client.New(config, client.Options{Scheme: scheme}) - if err != nil { - log.Fatalf("failed to create client: %v", err) + fmt.Println("Summary:") + for _, line := range g.summary { + fmt.Println("- ", line) } + fmt.Println("--------------- Done ---------------") + return nil +} - cs, err := kubernetes.NewForConfig(config) +func newGitOpsOpts(kc client.Client, name, namespace, kind, dir string) (*gitOpsOpts, error) { + err := os.MkdirAll(dir, dirPerm) if err != nil { - log.Fatalf("failed to create kube client: %v", err) + return nil, err } - opts := &gitOpsOpts{ - kc: kc, - config: config, - errWriter: &bytes.Buffer{}, - kubeClient: cs, - resMap: make(map[string]string), - summary: make([]string, 0), + kc: kc, + db: dbInfo{ + kind: kind, + name: name, + namespace: namespace, + }, + dir: dir, + summary: make([]string, 0), } - return opts + return opts, nil } func (g *gitOpsOpts) collectGitOpsDatabase() error { var uns unstructured.Unstructured - uns.SetGroupVersionKind(gitops.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource))) + uns.SetGroupVersionKind(schema.GroupVersionKind{ + Group: gitops.SchemeGroupVersion.Group, + Version: gitops.SchemeGroupVersion.Version, + Kind: g.db.kind, + }) err := g.kc.Get(context.Background(), types.NamespacedName{ Namespace: g.db.namespace, Name: g.db.name, @@ -219,7 +140,7 @@ func (g *gitOpsOpts) collectGitOpsDatabase() error { } func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { - opsYamlDir := path.Join(g.dir, yamlsDir, "ops") + opsYamlDir := path.Join(g.dir, "ops") err := os.MkdirAll(opsYamlDir, dirPerm) if err != nil { return err @@ -227,7 +148,11 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { for _, info := range gitOpsStatus.GitOps.GitOpsInfo { for _, op := range info.Operations { var uns unstructured.Unstructured - uns.SetGroupVersionKind(opsapi.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource + "opsrequest"))) + uns.SetGroupVersionKind(schema.GroupVersionKind{ + Group: opsapi.SchemeGroupVersion.Group, + Version: opsapi.SchemeGroupVersion.Version, + Kind: g.db.kind + "OpsRequest", + }) err := g.kc.Get(context.Background(), types.NamespacedName{ Namespace: g.db.namespace, Name: op.Name, @@ -258,115 +183,3 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { return nil } - -func (g *gitOpsOpts) collectDatabase() error { - var uns unstructured.Unstructured - uns.SetGroupVersionKind(dbapi.SchemeGroupVersion.WithKind(g.getKindFromResource(g.db.resource))) - err := g.kc.Get(context.Background(), types.NamespacedName{ - Namespace: g.db.namespace, - Name: g.db.name, - }, &uns) - if err != nil { - log.Fatalf("failed to get database: %v", err) - } - - return writeYaml(&uns, path.Join(g.dir, yamlsDir)) -} - -func (g *gitOpsOpts) collectOperatorLogs(operatorNamespace string) error { - pods, err := g.kubeClient.CoreV1().Pods(operatorNamespace).List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - for _, pod := range pods.Items { - isOperatorPod := false - for _, container := range pod.Spec.Containers { - if container.Name == operatorContainerName { - isOperatorPod = true - } - } - if isOperatorPod { - err = g.writeLogs(pod.Name, pod.Namespace, operatorContainerName) - if err != nil { - return err - } - } - } - return nil -} - -func (g *gitOpsOpts) populateResourceMap() error { - dc, err := discovery.NewDiscoveryClientForConfig(g.config) - if err != nil { - return err - } - g.resMap = make(map[string]string) - - if err := g.populate(dc, "kubedb.com/v1"); err != nil { - return err - } - if err := g.populate(dc, "kubedb.com/v1alpha2"); err != nil { - return err - } - if err := g.populate(dc, "gitops.kubedb.com/v1alpha1"); err != nil { - return err - } - if err := g.populate(dc, "ops.kubedb.com/v1alpha1"); err != nil { - return err - } - return nil -} - -func (g *gitOpsOpts) populate(dc *discovery.DiscoveryClient, gv string) error { - resources, err := dc.ServerResourcesForGroupVersion(gv) - if err != nil { - return err - } - for _, r := range resources.APIResources { - if !strings.ContainsAny(r.Name, "/") { - g.resMap[r.Name] = r.Kind - g.resMap[r.SingularName] = r.Kind - for _, s := range r.ShortNames { - g.resMap[s] = r.Kind - } - g.resMap[r.Kind] = r.Kind - } - } - return nil -} - -func (g *gitOpsOpts) getKindFromResource(res string) string { - kind, exists := g.resMap[res] - if !exists { - _ = fmt.Errorf("resource %s not supported", res) - } - return kind -} - -func (g *gitOpsOpts) writeLogs(podName, ns, container string) error { - req := g.kubeClient.CoreV1().Pods(ns).GetLogs(podName, &corev1.PodLogOptions{ - Container: container, - }) - - podLogs, err := req.Stream(context.TODO()) - if err != nil { - return err - } - defer podLogs.Close() - - logFile, err := os.Create(path.Join(g.dir, logsDir, podName+"_"+container+".log")) - if err != nil { - return err - } - defer logFile.Close() - - buf := make([]byte, 1024) - for { - bytesRead, err := podLogs.Read(buf) - if err != nil { - break - } - _, _ = logFile.Write(buf[:bytesRead]) - } - return nil -} diff --git a/pkg/debug/helpers.go b/pkg/debug/helpers.go index 3ad2cd55f..adfc9aae5 100644 --- a/pkg/debug/helpers.go +++ b/pkg/debug/helpers.go @@ -20,10 +20,20 @@ import ( "os" "path" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/yaml" ) +func IsOwnByGitOpsObject(owners []metav1.OwnerReference, name, kind string) bool { + for _, owner := range owners { + if owner.Kind == kind && owner.Name == name && owner.APIVersion == "gitops.kubedb.com/v1alpha1" { + return true + } + } + return false +} + func writeYaml(obj client.Object, fullPath string) error { b, err := yaml.Marshal(obj) if err != nil { From b9be34a19cbc7a4b4677713ec8c7d19eee9ca7ac Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Fri, 7 Nov 2025 11:53:11 +0600 Subject: [PATCH 6/7] Fix remaining stuffs Signed-off-by: obaydullahmhs --- pkg/debug/cassandra.go | 1 + pkg/debug/clickhouse.go | 1 + pkg/debug/druid.go | 1 + pkg/debug/elasticsearch.go | 1 + pkg/debug/ferretdb.go | 1 + pkg/debug/gitops.go | 19 +++++-------------- pkg/debug/hazelcast.go | 1 + pkg/debug/ignite.go | 1 + pkg/debug/kafka.go | 1 + pkg/debug/mariadb.go | 1 + pkg/debug/memcached.go | 1 + pkg/debug/mongodb.go | 1 + pkg/debug/mssqlserver.go | 1 + pkg/debug/mysql.go | 1 + pkg/debug/oracle.go | 1 + pkg/debug/perconaxtradb.go | 1 + pkg/debug/pgbouncer.go | 1 + pkg/debug/pgpool.go | 1 + pkg/debug/postgres.go | 1 + pkg/debug/proxysql.go | 1 + pkg/debug/rabbitmq.go | 1 + pkg/debug/redis.go | 1 + pkg/debug/singlestore.go | 1 + pkg/debug/solr.go | 1 + pkg/debug/zookeeper.go | 1 + 25 files changed, 29 insertions(+), 14 deletions(-) diff --git a/pkg/debug/cassandra.go b/pkg/debug/cassandra.go index b5eaa77e2..9deecc9e2 100644 --- a/pkg/debug/cassandra.go +++ b/pkg/debug/cassandra.go @@ -73,6 +73,7 @@ func CassandraDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/clickhouse.go b/pkg/debug/clickhouse.go index 03cce975c..c7b9083e2 100644 --- a/pkg/debug/clickhouse.go +++ b/pkg/debug/clickhouse.go @@ -73,6 +73,7 @@ func ClickHouseDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/druid.go b/pkg/debug/druid.go index 4b6439f10..d7edf4c75 100644 --- a/pkg/debug/druid.go +++ b/pkg/debug/druid.go @@ -73,6 +73,7 @@ func DruidDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/elasticsearch.go b/pkg/debug/elasticsearch.go index 0a0d3ce84..46bfb61e6 100644 --- a/pkg/debug/elasticsearch.go +++ b/pkg/debug/elasticsearch.go @@ -73,6 +73,7 @@ func ElasticsearchDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/ferretdb.go b/pkg/debug/ferretdb.go index ea7da0a26..6b7880d51 100644 --- a/pkg/debug/ferretdb.go +++ b/pkg/debug/ferretdb.go @@ -73,6 +73,7 @@ func FerretDBDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index b00578f86..b9ff1343f 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -115,22 +115,13 @@ func (g *gitOpsOpts) collectGitOpsDatabase() error { return err } - statuses := []string{ - string(gitops.ChangeRequestStatusInCurrent), string(gitops.ChangeRequestStatusPending), - string(gitops.ChangeRequestStatusInProgress), string(gitops.ChangeRequestStatusFailed), - } - statusIdx := 0 - for _, info := range gitOpsObj.Status.GitOps.GitOpsInfo { - for i := range statuses { - if string(info.ChangeRequestStatus) == statuses[i] { - if i > statusIdx { - statusIdx = i - } - } - } + status := string(gitops.ChangeRequestStatusInCurrent) + // last status is the latest status + if len(gitOpsObj.Status.GitOps.GitOpsInfo) > 0 { + status = string(gitOpsObj.Status.GitOps.GitOpsInfo[len(gitOpsObj.Status.GitOps.GitOpsInfo)-1].ChangeRequestStatus) } - g.summary = append(g.summary, fmt.Sprintf("GitOps Database Status for: %s/%s is %s", g.db.namespace, g.db.name, statuses[statusIdx])) + g.summary = append(g.summary, fmt.Sprintf("GitOps Database Status for: %s/%s is %s", g.db.namespace, g.db.name, status)) if err := g.collectOpsRequests(gitOpsObj.Status); err != nil { return err diff --git a/pkg/debug/hazelcast.go b/pkg/debug/hazelcast.go index 4fb35c0f3..0073b6ff9 100644 --- a/pkg/debug/hazelcast.go +++ b/pkg/debug/hazelcast.go @@ -73,6 +73,7 @@ func HazelcastDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/ignite.go b/pkg/debug/ignite.go index d79d961b2..12b97ac35 100644 --- a/pkg/debug/ignite.go +++ b/pkg/debug/ignite.go @@ -73,6 +73,7 @@ func IgniteDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/kafka.go b/pkg/debug/kafka.go index f18664a11..8764c52c7 100644 --- a/pkg/debug/kafka.go +++ b/pkg/debug/kafka.go @@ -73,6 +73,7 @@ func KafkaDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/mariadb.go b/pkg/debug/mariadb.go index 6a7260e5f..1ec56404e 100644 --- a/pkg/debug/mariadb.go +++ b/pkg/debug/mariadb.go @@ -73,6 +73,7 @@ func MariaDBDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/memcached.go b/pkg/debug/memcached.go index c22ab0c40..2b94b669c 100644 --- a/pkg/debug/memcached.go +++ b/pkg/debug/memcached.go @@ -73,6 +73,7 @@ func MemcachedDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/mongodb.go b/pkg/debug/mongodb.go index 612899a6c..5413a93b5 100644 --- a/pkg/debug/mongodb.go +++ b/pkg/debug/mongodb.go @@ -73,6 +73,7 @@ func MongoDBDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/mssqlserver.go b/pkg/debug/mssqlserver.go index c6d4e8ddb..4fdeb5bae 100644 --- a/pkg/debug/mssqlserver.go +++ b/pkg/debug/mssqlserver.go @@ -73,6 +73,7 @@ func MSSQLServerDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/mysql.go b/pkg/debug/mysql.go index dc71ddf91..53c91a34e 100644 --- a/pkg/debug/mysql.go +++ b/pkg/debug/mysql.go @@ -73,6 +73,7 @@ func MySQLDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/oracle.go b/pkg/debug/oracle.go index 477c1406f..a964fdbab 100644 --- a/pkg/debug/oracle.go +++ b/pkg/debug/oracle.go @@ -73,6 +73,7 @@ func OracleDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/perconaxtradb.go b/pkg/debug/perconaxtradb.go index f888df78c..2c889d858 100644 --- a/pkg/debug/perconaxtradb.go +++ b/pkg/debug/perconaxtradb.go @@ -73,6 +73,7 @@ func PerconaXtraDBDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/pgbouncer.go b/pkg/debug/pgbouncer.go index 8d075bc89..f2a0944ae 100644 --- a/pkg/debug/pgbouncer.go +++ b/pkg/debug/pgbouncer.go @@ -73,6 +73,7 @@ func PgBouncerDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/pgpool.go b/pkg/debug/pgpool.go index a4313fa07..8d50cbd4c 100644 --- a/pkg/debug/pgpool.go +++ b/pkg/debug/pgpool.go @@ -73,6 +73,7 @@ func PgpoolDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/postgres.go b/pkg/debug/postgres.go index 58cb6afb3..b5e40a4af 100644 --- a/pkg/debug/postgres.go +++ b/pkg/debug/postgres.go @@ -73,6 +73,7 @@ func PostgresDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/proxysql.go b/pkg/debug/proxysql.go index d7c1d1fde..73c3a0dbb 100644 --- a/pkg/debug/proxysql.go +++ b/pkg/debug/proxysql.go @@ -73,6 +73,7 @@ func ProxySQLDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/rabbitmq.go b/pkg/debug/rabbitmq.go index 57fa1a0c2..29d79ce75 100644 --- a/pkg/debug/rabbitmq.go +++ b/pkg/debug/rabbitmq.go @@ -73,6 +73,7 @@ func RabbitMQDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/redis.go b/pkg/debug/redis.go index a29868cbe..e167fe9bf 100644 --- a/pkg/debug/redis.go +++ b/pkg/debug/redis.go @@ -73,6 +73,7 @@ func RedisDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/singlestore.go b/pkg/debug/singlestore.go index 3696077ae..63f8b8c3f 100644 --- a/pkg/debug/singlestore.go +++ b/pkg/debug/singlestore.go @@ -73,6 +73,7 @@ func SinglestoreDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/solr.go b/pkg/debug/solr.go index 154339f43..4542be737 100644 --- a/pkg/debug/solr.go +++ b/pkg/debug/solr.go @@ -73,6 +73,7 @@ func SolrDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { diff --git a/pkg/debug/zookeeper.go b/pkg/debug/zookeeper.go index bbdbe2be6..e5dbdda6e 100644 --- a/pkg/debug/zookeeper.go +++ b/pkg/debug/zookeeper.go @@ -73,6 +73,7 @@ func ZooKeeperDebugCMD(f cmdutil.Factory) *cobra.Command { if err != nil { log.Fatalln(err) } + opts.db.OwnerReferences = db.OwnerReferences err = writeYaml(&db, getDir(db.GetName())) if err != nil { From 547e674b2f181b606ad58b5aa1f30c8e69f1b9b2 Mon Sep 17 00:00:00 2001 From: obaydullahmhs Date: Fri, 7 Nov 2025 12:15:49 +0600 Subject: [PATCH 7/7] fix copilot review Signed-off-by: obaydullahmhs --- pkg/debug/gitops.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pkg/debug/gitops.go b/pkg/debug/gitops.go index b9ff1343f..f985b8cff 100644 --- a/pkg/debug/gitops.go +++ b/pkg/debug/gitops.go @@ -19,7 +19,6 @@ package debug import ( "context" "fmt" - "log" "os" "path" @@ -104,14 +103,12 @@ func (g *gitOpsOpts) collectGitOpsDatabase() error { Name: g.db.name, }, &uns) if err != nil { - log.Fatalf("failed to get gitops database obj: %v", err) return err } var gitOpsObj GitOps err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &gitOpsObj) if err != nil { - log.Fatalf("failed to convert unstructured to gitops obj: %v", err) return err } @@ -149,7 +146,6 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { Name: op.Name, }, &uns) if err != nil { - log.Fatalf("failed to get opsrequest: %v", err) return err } err = writeYaml(&uns, opsYamlDir) @@ -159,7 +155,6 @@ func (g *gitOpsOpts) collectOpsRequests(gitOpsStatus GitOpsStatus) error { var ops Ops err = runtime.DefaultUnstructuredConverter.FromUnstructured(uns.Object, &ops) if err != nil { - log.Fatalf("failed to convert unstructured to opsrequest obj: %v", err) return err } if ops.Status.Phase == opsapi.OpsRequestPhaseFailed {