Skip to content

Commit 5d43eb0

Browse files
authored
Merge pull request #29 from kcp-dev/openapi-crds
✨ Use OpenAPI schema to handle publishing non-CRD based resources
2 parents 52642f9 + 6999810 commit 5d43eb0

File tree

9 files changed

+441
-44
lines changed

9 files changed

+441
-44
lines changed

cmd/crd-puller/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# CRD Puller
2+
3+
The `crd-puller` can be used for testing and development in order to export a
4+
CustomResourceDefinition for any Group/Version/Kind (GVK) in a Kubernetes cluster.
5+
6+
The main difference between this and kcp's own `crd-puller` is that this one
7+
works based on GVKs and not resources (i.e. on `apps/v1 Deployment` instead of
8+
`apps.deployments`). This is more useful since a PublishedResource publishes a
9+
specific Kind and version.
10+
11+
## Usage
12+
13+
```shell
14+
export KUBECONFIG=/path/to/kubeconfig
15+
16+
./crd-puller Deployment.v1.apps.k8s.io
17+
```

cmd/crd-puller/main.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
Copyright 2025 The KCP Authors.
3+
4+
Licensed under the Apache License, Version 2.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+
http://www.apache.org/licenses/LICENSE-2.0
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 main
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"log"
23+
24+
"github.com/spf13/pflag"
25+
26+
"github.com/kcp-dev/api-syncagent/internal/discovery"
27+
28+
"k8s.io/apimachinery/pkg/runtime/schema"
29+
"k8s.io/client-go/tools/clientcmd"
30+
"sigs.k8s.io/yaml"
31+
)
32+
33+
var (
34+
kubeconfigPath string
35+
)
36+
37+
func main() {
38+
ctx := context.Background()
39+
40+
pflag.StringVar(&kubeconfigPath, "kubeconfig", "", "Path to the kubeconfig file to use (defaults to $KUBECONFIG)")
41+
pflag.Parse()
42+
43+
if pflag.NArg() == 0 {
44+
log.Fatal("No argument given. Please specify a GVK in the form 'Kind.version.apigroup.com' to pull.")
45+
}
46+
47+
gvk, _ := schema.ParseKindArg(pflag.Arg(0))
48+
if gvk == nil {
49+
log.Fatal("Invalid GVK, please use the format 'Kind.version.apigroup.com'.")
50+
}
51+
52+
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
53+
loadingRules.ExplicitPath = kubeconfigPath
54+
55+
startingConfig, err := loadingRules.GetStartingConfig()
56+
if err != nil {
57+
log.Fatalf("Failed to load Kubernetes configuration: %v.", err)
58+
}
59+
60+
config, err := clientcmd.NewDefaultClientConfig(*startingConfig, nil).ClientConfig()
61+
if err != nil {
62+
log.Fatalf("Failed to load Kubernetes configuration: %v.", err)
63+
}
64+
65+
discoveryClient, err := discovery.NewClient(config)
66+
if err != nil {
67+
log.Fatalf("Failed to create discovery client: %v.", err)
68+
}
69+
70+
crd, err := discoveryClient.RetrieveCRD(ctx, *gvk)
71+
if err != nil {
72+
log.Fatalf("Failed to pull CRD: %v.", err)
73+
}
74+
75+
enc, err := yaml.Marshal(crd)
76+
if err != nil {
77+
log.Fatalf("Failed to encode CRD as YAML: %v.", err)
78+
}
79+
80+
fmt.Println(string(enc))
81+
}

go.mod

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
github.com/kcp-dev/apimachinery/v2 v2.0.1-0.20240817110845-a9eb9752bfeb
1212
github.com/kcp-dev/client-go v0.0.0-20240912145314-f5949d81732a
1313
github.com/kcp-dev/code-generator/v2 v2.3.1
14+
github.com/kcp-dev/kcp v0.26.1
1415
github.com/kcp-dev/kcp/sdk v0.26.1
1516
github.com/kcp-dev/logicalcluster/v3 v3.0.5
1617
github.com/openshift-eng/openshift-goimports v0.0.0-20230304234052-c70783e636f2
@@ -23,39 +24,59 @@ require (
2324
k8s.io/api v0.31.2
2425
k8s.io/apiextensions-apiserver v0.31.2
2526
k8s.io/apimachinery v0.31.2
27+
k8s.io/apiserver v0.31.2
2628
k8s.io/client-go v0.31.2
2729
k8s.io/code-generator v0.31.2
30+
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340
2831
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
2932
sigs.k8s.io/controller-runtime v0.18.3
3033
sigs.k8s.io/controller-tools v0.16.5
3134
sigs.k8s.io/structured-merge-diff/v4 v4.5.0
3235
sigs.k8s.io/yaml v1.4.0
3336
)
3437

35-
replace sigs.k8s.io/controller-runtime => github.com/kcp-dev/controller-runtime v0.19.0-kcp.1
38+
replace (
39+
k8s.io/apiextensions-apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiextensions-apiserver v0.0.0-20250125214723-819c32dd4b3d
40+
k8s.io/apiserver => github.com/kcp-dev/kubernetes/staging/src/k8s.io/apiserver v0.0.0-20250125214723-819c32dd4b3d
41+
k8s.io/kms => github.com/kcp-dev/kubernetes/staging/src/k8s.io/kms v0.0.0-20250125214723-819c32dd4b3d
42+
sigs.k8s.io/controller-runtime => github.com/kcp-dev/controller-runtime v0.19.0-kcp.1
43+
)
3644

3745
require (
3846
dario.cat/mergo v1.0.1 // indirect
3947
github.com/Masterminds/goutils v1.1.1 // indirect
4048
github.com/Masterminds/semver/v3 v3.3.0 // indirect
49+
github.com/NYTimes/gziphandler v1.1.1 // indirect
50+
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
51+
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
4152
github.com/beorn7/perks v1.0.1 // indirect
53+
github.com/blang/semver/v4 v4.0.0 // indirect
54+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
4255
github.com/cespare/xxhash/v2 v2.3.0 // indirect
56+
github.com/coreos/go-semver v0.3.1 // indirect
57+
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
4358
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
59+
github.com/distribution/reference v0.5.0 // indirect
4460
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
4561
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
4662
github.com/fatih/color v1.18.0 // indirect
63+
github.com/felixge/httpsnoop v1.0.4 // indirect
4764
github.com/fsnotify/fsnotify v1.7.0 // indirect
4865
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
66+
github.com/go-logr/stdr v1.2.2 // indirect
4967
github.com/go-openapi/jsonpointer v0.19.6 // indirect
5068
github.com/go-openapi/jsonreference v0.20.2 // indirect
5169
github.com/go-openapi/swag v0.22.4 // indirect
5270
github.com/gobuffalo/flect v1.0.3 // indirect
5371
github.com/gogo/protobuf v1.3.2 // indirect
5472
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
5573
github.com/golang/protobuf v1.5.4 // indirect
74+
github.com/google/cel-go v0.20.1 // indirect
5675
github.com/google/gnostic-models v0.6.8 // indirect
5776
github.com/google/gofuzz v1.2.1-0.20210504230335-f78f29fc09ea // indirect
5877
github.com/google/uuid v1.6.0 // indirect
78+
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
79+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
5980
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
6081
github.com/hashicorp/hcl v1.0.0 // indirect
6182
github.com/huandu/xstrings v1.5.0 // indirect
@@ -75,6 +96,7 @@ require (
7596
github.com/modern-go/reflect2 v1.0.2 // indirect
7697
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
7798
github.com/onsi/gomega v1.34.2 // indirect
99+
github.com/opencontainers/go-digest v1.0.0 // indirect
78100
github.com/pelletier/go-toml v1.8.1 // indirect
79101
github.com/pkg/errors v0.9.1 // indirect
80102
github.com/prometheus/client_golang v1.19.1 // indirect
@@ -92,6 +114,18 @@ require (
92114
github.com/tidwall/match v1.1.1 // indirect
93115
github.com/tidwall/pretty v1.2.0 // indirect
94116
github.com/x448/float16 v0.8.4 // indirect
117+
go.etcd.io/etcd/api/v3 v3.5.14 // indirect
118+
go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect
119+
go.etcd.io/etcd/client/v3 v3.5.14 // indirect
120+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
121+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
122+
go.opentelemetry.io/otel v1.28.0 // indirect
123+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
124+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect
125+
go.opentelemetry.io/otel/metric v1.28.0 // indirect
126+
go.opentelemetry.io/otel/sdk v1.28.0 // indirect
127+
go.opentelemetry.io/otel/trace v1.28.0 // indirect
128+
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
95129
go.uber.org/multierr v1.11.0 // indirect
96130
golang.org/x/crypto v0.32.0 // indirect
97131
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
@@ -105,14 +139,19 @@ require (
105139
golang.org/x/time v0.3.0 // indirect
106140
golang.org/x/tools v0.29.0 // indirect
107141
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
142+
google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect
143+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
144+
google.golang.org/grpc v1.65.0 // indirect
108145
google.golang.org/protobuf v1.34.2 // indirect
109146
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
110147
gopkg.in/inf.v0 v0.9.1 // indirect
111148
gopkg.in/ini.v1 v1.62.0 // indirect
112149
gopkg.in/yaml.v2 v2.4.0 // indirect
113150
gopkg.in/yaml.v3 v3.0.1 // indirect
151+
k8s.io/component-base v0.31.2 // indirect
114152
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 // indirect
115153
k8s.io/klog/v2 v2.130.1 // indirect
116-
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
154+
k8s.io/kubernetes v1.31.0 // indirect
155+
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect
117156
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
118157
)

0 commit comments

Comments
 (0)