Skip to content

Commit c93057f

Browse files
Add debug util for gateway
Signed-off-by: Arnob kumar saha <arnob@appscode.com>
1 parent b969d0d commit c93057f

5,633 files changed

Lines changed: 2075255 additions & 111947 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

go.mod

Lines changed: 168 additions & 115 deletions
Large diffs are not rendered by default.

go.sum

Lines changed: 395 additions & 268 deletions
Large diffs are not rendered by default.

pkg/cmds/debug/debug.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
Copyright AppsCode Inc. and Contributors
3+
4+
Licensed under the AppsCode Community License 1.0.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
https://github.com/appscode/licenses/raw/1.0.0/AppsCode-Community-1.0.0.md
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package debug
18+
19+
import (
20+
"go.bytebuilders.dev/cli/pkg/cmds/debug/gateway"
21+
22+
"github.com/spf13/cobra"
23+
"k8s.io/cli-runtime/pkg/genericclioptions"
24+
cmdutil "k8s.io/kubectl/pkg/cmd/util"
25+
)
26+
27+
func NewCmdDebug() *cobra.Command {
28+
cmd := &cobra.Command{
29+
Use: "debug",
30+
Short: "Debug utilities",
31+
DisableAutoGenTag: true,
32+
}
33+
34+
kubeConfigFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag()
35+
matchVersionKubeConfigFlags := cmdutil.NewMatchVersionFlags(kubeConfigFlags)
36+
f := cmdutil.NewFactory(matchVersionKubeConfigFlags)
37+
38+
cmd.AddCommand(gateway.NewCmdGateway(f))
39+
40+
return cmd
41+
}

pkg/cmds/debug/gateway/gateway.go

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package gateway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"os"
8+
"path"
9+
10+
catalogapi "go.bytebuilders.dev/catalog/api/catalog/v1alpha1"
11+
12+
flux "github.com/fluxcd/helm-controller/api/v2"
13+
"github.com/spf13/cobra"
14+
corev1 "k8s.io/api/core/v1"
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
17+
"k8s.io/apimachinery/pkg/labels"
18+
"k8s.io/apimachinery/pkg/runtime"
19+
"k8s.io/apimachinery/pkg/types"
20+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
21+
"k8s.io/client-go/kubernetes"
22+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
23+
"k8s.io/klog/v2"
24+
cmdutil "k8s.io/kubectl/pkg/cmd/util"
25+
"kmodules.xyz/client-go/meta"
26+
dbapi "kubedb.dev/apimachinery/apis/kubedb/v1"
27+
kubedbscheme "kubedb.dev/apimachinery/client/clientset/versioned/scheme"
28+
"sigs.k8s.io/controller-runtime/pkg/client"
29+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
30+
vgapi "voyagermesh.dev/gateway-api/apis/gateway/v1alpha1"
31+
)
32+
33+
var scheme = runtime.NewScheme()
34+
35+
func init() {
36+
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
37+
utilruntime.Must(catalogapi.AddToScheme(scheme))
38+
utilruntime.Must(kubedbscheme.AddToScheme(scheme))
39+
utilruntime.Must(gwapiv1.Install(scheme))
40+
utilruntime.Must(vgapi.AddToScheme(scheme))
41+
utilruntime.Must(flux.AddToScheme(scheme))
42+
}
43+
44+
func NewCmdGateway(f cmdutil.Factory) *cobra.Command {
45+
opt := newGatewayOpts(f)
46+
cmd := &cobra.Command{
47+
Use: "gateway",
48+
Short: "Gateway related info",
49+
DisableAutoGenTag: true,
50+
RunE: func(cmd *cobra.Command, args []string) error {
51+
klog.Infof("========> %s %s %s \n", opt.db.resource, opt.db.name, opt.db.namespace)
52+
return opt.run()
53+
},
54+
}
55+
56+
cmd.Flags().StringVarP(&opt.db.resource, "db-type", "t", "mongodb", "Database type")
57+
cmd.Flags().StringVarP(&opt.db.name, "name", "m", "mg-test", "Database name")
58+
cmd.Flags().StringVarP(&opt.db.namespace, "namespace", "n", "demo", "Database namespace")
59+
return cmd
60+
}
61+
62+
type gatewayOpts struct {
63+
kc client.Client
64+
kubeClient kubernetes.Interface
65+
db dbInfo
66+
dir string
67+
}
68+
69+
type dbInfo struct {
70+
resource string
71+
name string
72+
namespace string
73+
}
74+
75+
func newGatewayOpts(f cmdutil.Factory) *gatewayOpts {
76+
config, err := f.ToRESTConfig()
77+
if err != nil {
78+
log.Fatal(err)
79+
}
80+
kc, err := client.New(config, client.Options{Scheme: scheme})
81+
if err != nil {
82+
log.Fatalf("failed to create client: %v", err)
83+
}
84+
85+
cs, err := kubernetes.NewForConfig(config)
86+
if err != nil {
87+
log.Fatalf("failed to create kube client: %v", err)
88+
}
89+
90+
return &gatewayOpts{kc: kc, kubeClient: cs}
91+
}
92+
93+
func (g *gatewayOpts) run() error {
94+
pwd, _ := os.Getwd()
95+
dir := path.Join(pwd, g.db.name)
96+
err := os.MkdirAll(path.Join(dir, logsDir), dirPerm)
97+
if err != nil {
98+
return err
99+
}
100+
err = os.MkdirAll(path.Join(dir, yamlsDir), dirPerm)
101+
if err != nil {
102+
return err
103+
}
104+
g.dir = dir
105+
106+
if err := g.collectGateways(); err != nil {
107+
return err
108+
}
109+
if err := g.collectDatabase(); err != nil {
110+
return err
111+
}
112+
113+
if err := g.collectOperatorLogs(); err != nil {
114+
return err
115+
}
116+
fmt.Println("Success !!!")
117+
return nil
118+
}
119+
120+
func (g *gatewayOpts) collectGateways() error {
121+
var gwList gwapiv1.GatewayList
122+
err := g.kc.List(context.TODO(), &gwList, client.InNamespace(g.db.namespace))
123+
if err != nil {
124+
log.Fatalf("failed to get gateways: %v", err)
125+
}
126+
127+
psYamlDir := path.Join(g.dir, yamlsDir, "gateways")
128+
err = os.MkdirAll(psYamlDir, dirPerm)
129+
if err != nil {
130+
return err
131+
}
132+
133+
for _, p := range gwList.Items {
134+
err = writeYaml(&p, psYamlDir)
135+
if err != nil {
136+
return err
137+
}
138+
139+
}
140+
return nil
141+
}
142+
143+
func (g *gatewayOpts) collectDatabase() error {
144+
var uns unstructured.Unstructured
145+
uns.SetGroupVersionKind(dbapi.SchemeGroupVersion.WithKind(getKindFromResource(g.db.resource)))
146+
err := g.kc.Get(context.Background(), types.NamespacedName{
147+
Namespace: g.db.namespace,
148+
Name: g.db.name,
149+
}, &uns)
150+
if err != nil {
151+
log.Fatalf("failed to get gateways: %v", err)
152+
}
153+
154+
return writeYaml(&uns, path.Join(g.dir, yamlsDir))
155+
}
156+
157+
func (g *gatewayOpts) collectOperatorLogs() error {
158+
labels := labels.SelectorFromSet(map[string]string{
159+
meta.InstanceLabelKey: catalogManager,
160+
}).String()
161+
pods, err := g.kubeClient.CoreV1().Pods("ace").List(context.TODO(), metav1.ListOptions{
162+
LabelSelector: labels,
163+
})
164+
if err != nil {
165+
return err
166+
}
167+
for _, pod := range pods.Items {
168+
isOperatorPod := false
169+
for _, container := range pod.Spec.Containers {
170+
if container.Name == catalogManager {
171+
isOperatorPod = true
172+
}
173+
}
174+
if isOperatorPod {
175+
err = g.writeLogs(pod.Name, pod.Namespace, catalogManager)
176+
if err != nil {
177+
return err
178+
}
179+
}
180+
}
181+
return nil
182+
}
183+
184+
func (g *gatewayOpts) writeLogs(podName, ns, container string) error {
185+
req := g.kubeClient.CoreV1().Pods(ns).GetLogs(podName, &corev1.PodLogOptions{
186+
Container: container,
187+
})
188+
189+
podLogs, err := req.Stream(context.TODO())
190+
if err != nil {
191+
return err
192+
}
193+
defer podLogs.Close()
194+
195+
logFile, err := os.Create(path.Join(g.dir, logsDir, podName+"_"+container+".log"))
196+
if err != nil {
197+
return err
198+
}
199+
defer logFile.Close()
200+
201+
buf := make([]byte, 1024)
202+
for {
203+
bytesRead, err := podLogs.Read(buf)
204+
if err != nil {
205+
break
206+
}
207+
_, _ = logFile.Write(buf[:bytesRead])
208+
}
209+
return nil
210+
}

pkg/cmds/debug/gateway/helpers.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package gateway
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path"
7+
8+
dbapi "kubedb.dev/apimachinery/apis/kubedb/v1"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
"sigs.k8s.io/yaml"
11+
)
12+
13+
const (
14+
logsDir = "logs"
15+
yamlsDir = "yamls"
16+
dirPerm = 0o755
17+
filePerm = 0o644
18+
19+
catalogManager = "catalog-manager"
20+
)
21+
22+
func writeYaml(obj client.Object, fullPath string) error {
23+
b, err := yaml.Marshal(obj)
24+
if err != nil {
25+
return err
26+
}
27+
return os.WriteFile(path.Join(fullPath, obj.GetName()+".yaml"), b, filePerm)
28+
}
29+
30+
func getKindFromResource(res string) string {
31+
switch res {
32+
case "postgres", "pg":
33+
return dbapi.ResourceKindPostgres
34+
}
35+
_ = fmt.Errorf("resource %s not supported", res)
36+
return ""
37+
}

pkg/cmds/root.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"syscall"
2323

2424
"go.bytebuilders.dev/cli/pkg/cmds/auth"
25-
"go.bytebuilders.dev/cli/pkg/cmds/cloud_swap"
2625
"go.bytebuilders.dev/cli/pkg/cmds/cluster"
2726
cmdconfig "go.bytebuilders.dev/cli/pkg/cmds/config"
27+
"go.bytebuilders.dev/cli/pkg/cmds/debug"
2828
"go.bytebuilders.dev/cli/pkg/cmds/installer"
2929
"go.bytebuilders.dev/cli/pkg/config"
3030
ace "go.bytebuilders.dev/client"
@@ -51,9 +51,10 @@ func NewRootCmd() *cobra.Command {
5151
rootCmd.AddCommand(cluster.NewCmdCluster(f))
5252
rootCmd.AddCommand(auth.NewCmdAuth())
5353

54-
rootCmd.AddCommand(cloud_swap.NewCmdCloudSwap())
54+
// rootCmd.AddCommand(cloud_swap.NewCmdCloudSwap())
5555

5656
rootCmd.AddCommand(installer.NewCmdInstaller())
57+
rootCmd.AddCommand(debug.NewCmdDebug())
5758

5859
rootCmd.AddCommand(v.NewCmdVersion())
5960
rootCmd.AddCommand(NewCmdCompletion())

0 commit comments

Comments
 (0)