Skip to content

Commit 4d121e9

Browse files
committed
moved CRD rendering out of client into mcp service
1 parent 3deea20 commit 4d121e9

2 files changed

Lines changed: 42 additions & 38 deletions

File tree

internal/client/k8s_client.go

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package client
33
import (
44
"bytes"
55
"context"
6-
"encoding/json"
76
"fmt"
87
"strings"
98

@@ -71,47 +70,17 @@ func (c *K8sClient) ListCRDs(ctx context.Context) ([]*apiextv1.CustomResourceDef
7170
return items, nil
7271
}
7372

74-
// GetCRD fetches a CRD by name and renders it as yaml|json|describe (default yaml).
75-
func (c *K8sClient) GetCRD(ctx context.Context, name, mode string) (string, error) {
73+
// GetCRD returns the native CRD by name (no formatting).
74+
func (c *K8sClient) GetCRD(ctx context.Context, name string) (*apiextv1.CustomResourceDefinition, error) {
7675
cs, err := apiextcs.NewForConfig(c.cfg)
7776
if err != nil {
78-
return "", fmt.Errorf("apiextensions client: %w", err)
77+
return nil, fmt.Errorf("apiextensions client: %w", err)
7978
}
8079
crd, err := cs.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, name, metav1.GetOptions{})
8180
if err != nil {
82-
return "", err
83-
}
84-
85-
switch strings.ToLower(mode) {
86-
case "json":
87-
b, err := json.MarshalIndent(crd, "", " ")
88-
if err != nil {
89-
return "", err
90-
}
91-
return string(b), nil
92-
case "describe":
93-
var sb strings.Builder
94-
fmt.Fprintf(&sb, "Name: %s\n", crd.Name)
95-
fmt.Fprintf(&sb, "Group: %s\n", crd.Spec.Group)
96-
fmt.Fprintf(&sb, "Kind: %s\n", crd.Spec.Names.Kind)
97-
fmt.Fprintf(&sb, "Scope: %s\n", crd.Spec.Scope)
98-
versions := make([]string, 0, len(crd.Spec.Versions))
99-
for _, v := range crd.Spec.Versions {
100-
versions = append(versions, v.Name)
101-
}
102-
fmt.Fprintf(&sb, "Versions: %s\n", strings.Join(versions, ", "))
103-
return sb.String(), nil
104-
default: // yaml
105-
b, err := json.Marshal(crd)
106-
if err != nil {
107-
return "", err
108-
}
109-
y, err := syaml.JSONToYAML(b)
110-
if err != nil {
111-
return "", err
112-
}
113-
return string(y), nil
81+
return nil, err
11482
}
83+
return crd, nil
11584
}
11685

11786
// ValidateYAML validates one or more YAML documents using Create with server-side dry-run.

internal/mcp/service.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package mcp
33
import (
44
"context"
55
"fmt"
6+
"strings"
7+
"encoding/json"
68

79
"go.datum.net/datumctl/internal/client"
10+
syaml "sigs.k8s.io/yaml"
811
)
912

1013
type Service struct {
@@ -69,11 +72,43 @@ func (s *Service) GetCRD(ctx context.Context, r GetCRDReq) (GetCRDResp, error) {
6972
if r.Name == "" {
7073
return GetCRDResp{}, fmt.Errorf("missing CRD name")
7174
}
72-
text, err := s.K.GetCRD(ctx, r.Name, r.Mode)
75+
crd, err := s.K.GetCRD(ctx, r.Name) // native CRD from client
7376
if err != nil {
7477
return GetCRDResp{}, err
7578
}
76-
return GetCRDResp{Text: text}, nil
79+
80+
switch strings.ToLower(r.Mode) {
81+
case "json":
82+
b, err := json.MarshalIndent(crd, "", " ")
83+
if err != nil {
84+
return GetCRDResp{}, err
85+
}
86+
return GetCRDResp{Text: string(b)}, nil
87+
88+
case "describe":
89+
var sb strings.Builder
90+
fmt.Fprintf(&sb, "Name: %s\n", crd.Name)
91+
fmt.Fprintf(&sb, "Group: %s\n", crd.Spec.Group)
92+
fmt.Fprintf(&sb, "Kind: %s\n", crd.Spec.Names.Kind)
93+
fmt.Fprintf(&sb, "Scope: %s\n", crd.Spec.Scope)
94+
versions := make([]string, 0, len(crd.Spec.Versions))
95+
for _, v := range crd.Spec.Versions {
96+
versions = append(versions, v.Name)
97+
}
98+
fmt.Fprintf(&sb, "Versions: %s\n", strings.Join(versions, ", "))
99+
return GetCRDResp{Text: sb.String()}, nil
100+
101+
default: // yaml
102+
b, err := json.Marshal(crd)
103+
if err != nil {
104+
return GetCRDResp{}, err
105+
}
106+
y, err := syaml.JSONToYAML(b)
107+
if err != nil {
108+
return GetCRDResp{}, err
109+
}
110+
return GetCRDResp{Text: string(y)}, nil
111+
}
77112
}
78113

79114
func (s *Service) ValidateYAML(ctx context.Context, r ValidateReq) ValidateResp {

0 commit comments

Comments
 (0)