Skip to content

Commit a4c6193

Browse files
authored
Merge pull request #30 from datum-cloud/add_datum_mcp
add datum mcp
2 parents 09a42cc + 4d121e9 commit a4c6193

9 files changed

Lines changed: 818 additions & 47 deletions

File tree

README.md

Lines changed: 95 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Use `datumctl` to manage your Datum Cloud resources, authenticate securely, and
1212
* **Multi-User Support:** Manage credentials for multiple Datum Cloud user accounts.
1313
* **Resource Management:** Interact with Datum Cloud resources (e.g., list organizations).
1414
* **Kubernetes Integration:** Seamlessly configure `kubectl` to use your Datum Cloud credentials for accessing Kubernetes clusters.
15+
* **MCP Server (optional):** Start an MCP server (`datumctl mcp`) for Datum Cloud so AI agents (e.g., Claude) can discover resources, inspect schemas, and validate manifests via server-side dry-run.
1516
* **Cross-Platform:** Pre-built binaries available for Linux, macOS, and Windows.
1617

1718
## Getting Started
@@ -30,21 +31,112 @@ See the [Installation Guide](./docs/user/installation.md) for detailed instructi
3031

3132
2. **List your organizations:**
3233
```bash
33-
datumctl organizations list
34+
datumctl get organizations
3435
```
3536

36-
3. **Configure `kubectl` access:**
37+
3. **Configure `kubectl` access (optional):**
3738
Use the organization ID (or a specific project ID) from the previous step
3839
to configure `kubectl`.
3940
```bash
4041
# Example using an organization ID
4142
datumctl auth update-kubeconfig --organization <org-id>
4243
4344
# Example using a project ID
44-
# datumctl auth update-kubeconfig --project <project-id>
45+
datumctl auth update-kubeconfig --project <project-id>
4546
```
4647
Now you can use `kubectl` to interact with your Datum Cloud control plane.
4748

49+
### Project setup (required for MCP)
50+
51+
MCP typically targets a **project** control plane. You need at least one project and its **Project ID** (the Kubernetes resource name).
52+
53+
**A) If you already have a project:**
54+
```bash
55+
# Ensure your kube context points at an organization control plane
56+
datumctl auth update-kubeconfig --organization <org-id>
57+
58+
# List projects; copy the NAME column (that is the Project ID)
59+
kubectl get projects
60+
# Or JSON-friendly:
61+
kubectl get projects -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'
62+
```
63+
64+
**B) If you need to create a project:**
65+
```bash
66+
# Make sure your kube context targets an organization control plane
67+
datumctl auth update-kubeconfig --organization <org-id>
68+
69+
cat > intro-project.yaml <<'YAML'
70+
apiVersion: resourcemanager.miloapis.com/v1alpha1
71+
kind: Project
72+
metadata:
73+
generateName: intro-project-
74+
spec: {}
75+
YAML
76+
77+
kubectl create -f intro-project.yaml
78+
79+
# Wait until Ready
80+
PRJ_ID="$(kubectl get projects -o jsonpath='{.items[-1:].metadata.name}')"
81+
kubectl wait --for=condition=Ready --timeout=15m project/$PRJ_ID
82+
echo "Project ready: $PRJ_ID"
83+
```
84+
85+
#### MCP subcommand (optional)
86+
87+
Start the Model Context Protocol (MCP) server targeting a specific Datum Cloud context:
88+
```bash
89+
# Exactly one of --organization or --project is required.
90+
datumctl mcp --organization <org-id> --namespace <ns> [--port 8080]
91+
# or
92+
datumctl mcp --project <project-id> --namespace <ns> [--port 8080]
93+
```
94+
95+
##### Startup & safety
96+
97+
- **Preflight:** On startup, `datumctl mcp` verifies connectivity and auth by calling Kubernetes discovery (e.g., `GET /version`). If this check fails, the server exits.
98+
- **Read-only:** All operations are validation-only and use server-side dry-run (`dryRun=All`). No resources are created, modified, or deleted.
99+
100+
> [!NOTE]
101+
> The MCP server builds its own Kubernetes connection for the selected Datum context; it does **not** depend on your local kubeconfig or `--kube-context`. Provide either `--organization` or `--project`.
102+
103+
##### Scope: project vs. organization
104+
105+
> [!IMPORTANT]
106+
> Most Kubernetes operations exposed via MCP (e.g., CRD discovery and server-side dry-run validation) are **project-scoped**.
107+
> Running MCP at **organization** scope will typically show only org-level resources; attempts to validate project-level CRDs may return **HTTP 401/Forbidden** or appear missing.
108+
109+
**Recommended (project scope)**
110+
```bash
111+
datumctl mcp --project <project-id> --namespace <ns> [--port 8080]
112+
```
113+
114+
##### Claude config (macOS)
115+
```json
116+
{
117+
"mcpServers": {
118+
"datum_mcp": {
119+
"command": "/absolute/path/to/datumctl",
120+
"args": ["mcp","--project","<project-id>","--namespace","<ns>"]
121+
}
122+
}
123+
}
124+
```
125+
126+
**Organization scope**
127+
```bash
128+
datumctl mcp --organization <org-id> --namespace <ns> [--port 8080]
129+
```
130+
131+
**HTTP debug (if `--port` is set):**
132+
```bash
133+
# List CRDs
134+
curl -s localhost:8080/datum/list_crds | jq
135+
136+
# Validate a YAML file (wrap safely into JSON)
137+
printf '{"yaml":%s}\n' "$(jq -Rs . </path/to/file.yaml)" | curl -s -X POST localhost:8080/datum/validate_yaml -H 'Content-Type: application/json' -d @- | jq
138+
```
139+
48140
For more detailed tool setup instructions, refer to the official
49141
[Set Up Tools](https://docs.datum.net/docs/tasks/tools/) guide on docs.datum.net.
50142

go.mod

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ require (
1010
github.com/rodaine/table v1.3.0
1111
github.com/spf13/cobra v1.9.1
1212
github.com/zalando/go-keyring v0.2.6
13-
go.miloapis.com/milo v0.1.1
13+
go.miloapis.com/milo v0.2.0
1414
golang.org/x/oauth2 v0.30.0
15-
k8s.io/apimachinery v0.33.3
16-
k8s.io/client-go v0.33.3
17-
sigs.k8s.io/controller-runtime v0.21.0
15+
k8s.io/apiextensions-apiserver v0.32.1
16+
k8s.io/apimachinery v0.32.1
17+
k8s.io/client-go v0.32.1
18+
sigs.k8s.io/controller-runtime v0.20.4
19+
sigs.k8s.io/yaml v1.4.0
1820
)
1921

2022
require (
@@ -34,6 +36,7 @@ require (
3436
github.com/golang/protobuf v1.5.4 // indirect
3537
github.com/google/gnostic-models v0.6.9 // indirect
3638
github.com/google/go-cmp v0.7.0 // indirect
39+
github.com/google/gofuzz v1.2.0 // indirect
3740
github.com/google/uuid v1.6.0 // indirect
3841
github.com/inconshreveable/mousetrap v1.1.0 // indirect
3942
github.com/josharian/intern v1.0.0 // indirect
@@ -42,24 +45,25 @@ require (
4245
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
4346
github.com/modern-go/reflect2 v1.0.2 // indirect
4447
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
48+
github.com/pkg/errors v0.9.1 // indirect
49+
github.com/rogpeppe/go-internal v1.13.1 // indirect
4550
github.com/spf13/pflag v1.0.7 // indirect
4651
github.com/x448/float16 v0.8.4 // indirect
47-
go.yaml.in/yaml/v2 v2.4.2 // indirect
4852
golang.org/x/crypto v0.40.0 // indirect
4953
golang.org/x/net v0.42.0 // indirect
5054
golang.org/x/sys v0.34.0 // indirect
5155
golang.org/x/term v0.33.0 // indirect
5256
golang.org/x/text v0.27.0 // indirect
5357
golang.org/x/time v0.9.0 // indirect
5458
google.golang.org/protobuf v1.36.6 // indirect
59+
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
5560
gopkg.in/inf.v0 v0.9.1 // indirect
5661
gopkg.in/yaml.v3 v3.0.1 // indirect
57-
k8s.io/api v0.33.3 // indirect
62+
k8s.io/api v0.32.1 // indirect
5863
k8s.io/klog/v2 v2.130.1 // indirect
5964
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
6065
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
6166
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
6267
sigs.k8s.io/randfill v1.0.0 // indirect
6368
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
64-
sigs.k8s.io/yaml v1.5.0 // indirect
6569
)

go.sum

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
22
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
3-
github.com/coreos/go-oidc/v3 v3.14.1 h1:9ePWwfdwC4QKRlCXsJGou56adA/owXczOzwKdOumLqk=
4-
github.com/coreos/go-oidc/v3 v3.14.1/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU=
53
github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg=
64
github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU=
7-
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
85
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
96
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
107
github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=
@@ -100,12 +97,8 @@ github.com/rodaine/table v1.3.0/go.mod h1:47zRsHar4zw0jgxGxL9YtFfs7EGN6B/TaS+/Dm
10097
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
10198
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
10299
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
103-
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
104-
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
105100
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
106101
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
107-
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
108-
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
109102
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
110103
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
111104
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -128,22 +121,12 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
128121
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
129122
github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s=
130123
github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
131-
go.miloapis.com/milo v0.0.0-20250710191109-fef54cb30bb6 h1:g3Ur91+zR00RzTAcTxDe4zsUbl7UxpqR/yg7hhQyoWw=
132-
go.miloapis.com/milo v0.0.0-20250710191109-fef54cb30bb6/go.mod h1:hh74+itTatDKu88z8rOItbrn3g98jei7ecaMKjJpFds=
133-
go.miloapis.com/milo v0.0.0-20250711174448-db7176e7774a h1:LCH8o4GRxuYKCWYd9FGjSP9YjFBxSXmej8MJSkuIkjs=
134-
go.miloapis.com/milo v0.0.0-20250711174448-db7176e7774a/go.mod h1:hh74+itTatDKu88z8rOItbrn3g98jei7ecaMKjJpFds=
135-
go.miloapis.com/milo v0.1.0 h1:AYFVz1lfta/NbWSFSSKPtnkCA2rN+iegxlfQrDgEvYY=
136-
go.miloapis.com/milo v0.1.0/go.mod h1:X+DpWOchv/Vm63mwHnboW00KRGsODY2bUTS/bBbK1+E=
137-
go.miloapis.com/milo v0.1.1 h1:3NmYimeyr4ZvqQNOxeRlaDhBOf2cDtkWhLRS+8NrtjM=
138-
go.miloapis.com/milo v0.1.1/go.mod h1:X+DpWOchv/Vm63mwHnboW00KRGsODY2bUTS/bBbK1+E=
124+
go.miloapis.com/milo v0.2.0 h1:Aq8BqEoF+scrw+wE+Fo9Xx5vgZ0Eo4Q0SluO5+IU0HI=
125+
go.miloapis.com/milo v0.2.0/go.mod h1:X+DpWOchv/Vm63mwHnboW00KRGsODY2bUTS/bBbK1+E=
139126
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
140127
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
141128
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
142129
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
143-
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
144-
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
145-
go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
146-
go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
147130
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
148131
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
149132
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -157,8 +140,6 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
157140
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
158141
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
159142
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
160-
golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc=
161-
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
162143
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
163144
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
164145
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -202,22 +183,12 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
202183
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
203184
k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc=
204185
k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
205-
k8s.io/api v0.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU=
206-
k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM=
207-
k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
208-
k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
209186
k8s.io/apiextensions-apiserver v0.32.1 h1:hjkALhRUeCariC8DiVmb5jj0VjIc1N0DREP32+6UXZw=
210187
k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto=
211-
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
212-
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
213-
k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
214-
k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
188+
k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs=
189+
k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
215190
k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU=
216191
k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
217-
k8s.io/client-go v0.33.0 h1:UASR0sAYVUzs2kYuKn/ZakZlcs2bEHaizrrHUZg0G98=
218-
k8s.io/client-go v0.33.0/go.mod h1:kGkd+l/gNGg8GYWAPr0xF1rRKvVWvzh9vmZAMXtaKOg=
219-
k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
220-
k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
221192
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
222193
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
223194
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
@@ -226,15 +197,12 @@ k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8
226197
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
227198
sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU=
228199
sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY=
229-
sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8=
230-
sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM=
231200
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
232201
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
233202
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
234203
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
235204
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
236205
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
237206
sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
207+
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
238208
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
239-
sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
240-
sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=

0 commit comments

Comments
 (0)