Skip to content

Commit f79383f

Browse files
committed
[kube-controller] create api service proxy
1 parent 70a6d7d commit f79383f

File tree

9 files changed

+655
-10
lines changed

9 files changed

+655
-10
lines changed

cmd/kube-controller/main.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"os"
6+
7+
corev1 "k8s.io/api/core/v1"
8+
discoveryv1 "k8s.io/api/discovery/v1"
9+
runtime "k8s.io/apimachinery/pkg/runtime"
10+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
11+
"k8s.io/client-go/kubernetes"
12+
"k8s.io/client-go/rest"
13+
ctrl "sigs.k8s.io/controller-runtime"
14+
gwapiv1 "sigs.k8s.io/gateway-api/apis/v1"
15+
16+
corev1alpha "github.com/apoxy-dev/apoxy/api/core/v1alpha"
17+
"github.com/apoxy-dev/apoxy/pkg/kube-controller/apiregistration"
18+
"github.com/apoxy-dev/apoxy/pkg/kube-controller/apiserviceproxy"
19+
"github.com/apoxy-dev/apoxy/pkg/log"
20+
)
21+
22+
var (
23+
projectID = flag.String("project_id", "", "Project ID.")
24+
25+
// One of these must be set.
26+
bootstrapToken = flag.String("bootstrap_token", os.Getenv("APOXY_BOOTSTRAP_TOKEN"), "Token to bootstrap for Apoxy Cloud.")
27+
kubeconfigPath = flag.String("kubeconfig_path", "", "Path to kubeconfig file for a cluster to bootstrap against.")
28+
29+
clusterName = flag.String("cluster_name", "", "Name of the cluster (can be used as Location in Proxy and other objects' specs).")
30+
namespace = flag.String("namespace", os.Getenv("POD_NAMESPACE"), "Namespace to watch for Proxy resources.")
31+
svcName = flag.String("service_name", "kube-controller", "Name of the service to register.")
32+
33+
devMode = flag.Bool("dev", false, "Enable development mode.")
34+
logLevel = flag.String("log_level", "info", "Log level.")
35+
)
36+
37+
var (
38+
scheme = runtime.NewScheme()
39+
)
40+
41+
func init() {
42+
utilruntime.Must(corev1.AddToScheme(scheme))
43+
utilruntime.Must(discoveryv1.AddToScheme(scheme))
44+
utilruntime.Must(gwapiv1.AddToScheme(scheme))
45+
utilruntime.Must(corev1alpha.AddToScheme(scheme))
46+
}
47+
48+
func main() {
49+
ctx := ctrl.SetupSignalHandler()
50+
51+
flag.Parse()
52+
var lOpts []log.Option
53+
if *devMode {
54+
lOpts = append(lOpts, log.WithDevMode(), log.WithAlsoLogToStderr())
55+
} else if *logLevel != "" {
56+
lOpts = append(lOpts, log.WithLevelString(*logLevel))
57+
}
58+
log.Init(lOpts...)
59+
60+
if *projectID == "" {
61+
log.Fatalf("--project_id must be set")
62+
}
63+
if *namespace == "" {
64+
log.Fatalf("--namespace must be set")
65+
}
66+
if *bootstrapToken == "" && *kubeconfigPath == "" {
67+
log.Fatalf("one of --bootstrap_token or --kubeconfig_path must be set")
68+
}
69+
70+
log.Infof("Starting controllers...")
71+
72+
kCluster, err := rest.InClusterConfig()
73+
if err != nil {
74+
log.Fatalf("failed to create in-cluster config: %v", err)
75+
}
76+
kc := kubernetes.NewForConfigOrDie(kCluster)
77+
78+
apiReg, err := apiregistration.NewAPIRegistration(kCluster)
79+
if err != nil {
80+
log.Fatalf("failed to create api registration client: %v", err)
81+
}
82+
if err := apiReg.RegisterAPIServices(ctx, *svcName, *namespace, apiserviceproxy.DefaultPort); err != nil {
83+
log.Fatalf("failed to register api services: %v", err)
84+
}
85+
86+
log.Infof("starting api service proxy")
87+
var proxyOpts []apiserviceproxy.Option
88+
if *projectID != "" {
89+
proxyOpts = append(proxyOpts, apiserviceproxy.WithProjectID(*projectID))
90+
}
91+
if *namespace != "" {
92+
proxyOpts = append(proxyOpts, apiserviceproxy.WithNamespace(*namespace))
93+
}
94+
if *clusterName != "" {
95+
proxyOpts = append(proxyOpts, apiserviceproxy.WithClusterName(*clusterName))
96+
}
97+
if *bootstrapToken != "" {
98+
proxyOpts = append(proxyOpts, apiserviceproxy.WithToken(*bootstrapToken))
99+
}
100+
if *kubeconfigPath != "" {
101+
proxyOpts = append(proxyOpts, apiserviceproxy.WithKubeconfigPath(*kubeconfigPath))
102+
}
103+
apiSvc, err := apiserviceproxy.NewAPIServiceProxy(ctx, kc, proxyOpts...)
104+
if err != nil {
105+
log.Fatalf("unable to create api service proxy: %v", err)
106+
}
107+
go func() {
108+
if err := apiSvc.Run(ctx); err != nil {
109+
log.Fatalf("unable to run api service proxy: %v", err)
110+
}
111+
}()
112+
113+
<-ctx.Done()
114+
log.Infof("controllers shutting down")
115+
}

go.mod

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/apoxy-dev/apoxy
22

3-
go 1.24
3+
go 1.24.0
44

55
toolchain go1.24.2
66

@@ -85,10 +85,10 @@ require (
8585
gopkg.in/yaml.v2 v2.4.0
8686
gopkg.in/yaml.v3 v3.0.1
8787
gvisor.dev/gvisor v0.0.0-20250314001526-eeca54973f8b
88-
k8s.io/api v0.31.1
89-
k8s.io/apimachinery v0.31.1
90-
k8s.io/apiserver v0.31.1
91-
k8s.io/client-go v0.31.1
88+
k8s.io/api v0.33.2
89+
k8s.io/apimachinery v0.33.2
90+
k8s.io/apiserver v0.33.2
91+
k8s.io/client-go v0.33.2
9292
k8s.io/klog/v2 v2.130.1
9393
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
9494
k8s.io/kubernetes v1.31.1
@@ -191,7 +191,7 @@ require (
191191
github.com/gocql/gocql v1.6.0 // indirect
192192
github.com/godbus/dbus/v5 v5.1.0 // indirect
193193
github.com/gogo/protobuf v1.3.2 // indirect
194-
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
194+
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
195195
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
196196
github.com/golang/mock v1.7.0-rc.1 // indirect
197197
github.com/golang/snappy v1.0.0 // indirect
@@ -207,7 +207,7 @@ require (
207207
github.com/googleapis/gax-go/v2 v2.14.0 // indirect
208208
github.com/gophercloud/gophercloud v0.1.0 // indirect
209209
github.com/gorilla/securecookie v1.1.1 // indirect
210-
github.com/gorilla/websocket v1.5.3 // indirect
210+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
211211
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
212212
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
213213
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
@@ -392,9 +392,10 @@ require (
392392
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
393393
gopkg.in/validator.v2 v2.0.1 // indirect
394394
k8s.io/apiextensions-apiserver v0.31.1 // indirect
395-
k8s.io/component-base v0.31.1 // indirect
395+
k8s.io/component-base v0.33.2 // indirect
396396
k8s.io/component-helpers v0.31.1 // indirect
397-
k8s.io/kms v0.32.3 // indirect
397+
k8s.io/kms v0.33.2 // indirect
398+
k8s.io/kube-aggregator v0.33.2 // indirect
398399
lukechampine.com/uint128 v1.3.0 // indirect
399400
modernc.org/cc/v3 v3.41.0 // indirect
400401
modernc.org/ccgo/v3 v3.17.0 // indirect
@@ -405,7 +406,7 @@ require (
405406
modernc.org/sqlite v1.23.1 // indirect
406407
modernc.org/strutil v1.2.0 // indirect
407408
modernc.org/token v1.1.0 // indirect
408-
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
409+
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
409410
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
410411
sigs.k8s.io/randfill v1.0.0 // indirect
411412
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect

go.sum

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,8 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw
472472
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
473473
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
474474
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
475+
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
476+
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
475477
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
476478
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
477479
github.com/golang-migrate/migrate/v4 v4.17.1 h1:4zQ6iqL6t6AiItphxJctQb3cFqWiSpMnX7wLTPnnYO4=
@@ -577,6 +579,8 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA
577579
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
578580
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
579581
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
582+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
583+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
580584
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
581585
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
582586
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -1588,6 +1592,8 @@ k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
15881592
k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4=
15891593
k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
15901594
k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
1595+
k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
1596+
k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
15911597
k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
15921598
k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio=
15931599
k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40=
@@ -1596,20 +1602,28 @@ k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftc
15961602
k8s.io/apimachinery v0.18.4/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
15971603
k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
15981604
k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
1605+
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
1606+
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
15991607
k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
16001608
k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8=
16011609
k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
16021610
k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM=
1611+
k8s.io/apiserver v0.33.2 h1:KGTRbxn2wJagJowo29kKBp4TchpO1DRO3g+dB/KOJN4=
1612+
k8s.io/apiserver v0.33.2/go.mod h1:9qday04wEAMLPWWo9AwqCZSiIn3OYSZacDyu/AcoM/M=
16031613
k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
16041614
k8s.io/client-go v0.18.4/go.mod h1:f5sXwL4yAZRkAtzOxRWUhA/N8XzGCb+nPZI8PfobZ9g=
16051615
k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
16061616
k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
1617+
k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
1618+
k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
16071619
k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
16081620
k8s.io/code-generator v0.18.4/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
16091621
k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
16101622
k8s.io/component-base v0.18.4/go.mod h1:7jr/Ef5PGmKwQhyAz/pjByxJbC58mhKAhiaDu0vXfPk=
16111623
k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8=
16121624
k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w=
1625+
k8s.io/component-base v0.33.2 h1:sCCsn9s/dG3ZrQTX/Us0/Sx2R0G5kwa0wbZFYoVp/+0=
1626+
k8s.io/component-base v0.33.2/go.mod h1:/41uw9wKzuelhN+u+/C59ixxf4tYQKW7p32ddkYNe2k=
16131627
k8s.io/component-helpers v0.31.1 h1:5hZUf3747atdgtR3gPntrG35rC2CkK7rYq2KUraz6Os=
16141628
k8s.io/component-helpers v0.31.1/go.mod h1:ye0Gi8KzFNTfpIuzvVDtxJQMP/0Owkukf1vGf22Hl6U=
16151629
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
@@ -1622,6 +1636,10 @@ k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
16221636
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
16231637
k8s.io/kms v0.32.3 h1:HhHw5+pRCzEJp3oFFJ1q5W2N6gAI7YkUg4ay4Z0dgwM=
16241638
k8s.io/kms v0.32.3/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM=
1639+
k8s.io/kms v0.33.2 h1:GFwNXX4CZGQCg9DPOaJi1/+iKidCtB9/OIAGdzRo8FI=
1640+
k8s.io/kms v0.33.2/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E=
1641+
k8s.io/kube-aggregator v0.33.2 h1:eMW63PNucP+3UxnwYcfn5Yt2w2Sj2jI+imA7UWkYHVc=
1642+
k8s.io/kube-aggregator v0.33.2/go.mod h1:qQbliLwcdmx7/8mtvkc/9QV/ON2M6ZBMcffEUmrqKFw=
16251643
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
16261644
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
16271645
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
@@ -1676,6 +1694,8 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
16761694
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
16771695
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo=
16781696
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
1697+
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
1698+
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
16791699
sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A=
16801700
sigs.k8s.io/controller-runtime v0.19.7 h1:DLABZfMr20A+AwCZOHhcbcu+TqBXnJZaVBri9K3EO48=
16811701
sigs.k8s.io/controller-runtime v0.19.7/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Package apiregistration handles Apoxy API service registration with Kubernetes API Aggregation
2+
package apiregistration
3+
4+
import (
5+
"context"
6+
"fmt"
7+
8+
apierrors "k8s.io/apimachinery/pkg/api/errors"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/client-go/rest"
11+
apiregistrationclient "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
12+
13+
"github.com/apoxy-dev/apoxy/pkg/log"
14+
)
15+
16+
// APIRegistration handles registration of Apoxy APIs with Kubernetes API Aggregation
17+
type APIRegistration struct {
18+
apiRegC apiregistrationclient.Interface
19+
}
20+
21+
// NewAPIRegistration creates a new APIRegistration with the given client-go config
22+
func NewAPIRegistration(config *rest.Config) (*APIRegistration, error) {
23+
apiRegC, err := apiregistrationclient.NewForConfig(config)
24+
if err != nil {
25+
return nil, fmt.Errorf("unable to create api registration client: %w", err)
26+
}
27+
28+
return &APIRegistration{
29+
apiRegC: apiRegC,
30+
}, nil
31+
}
32+
33+
// RegisterAPIServices registers all Apoxy API services with Kubernetes API Aggregation
34+
func (a *APIRegistration) RegisterAPIServices(ctx context.Context, serviceName, namespace string, port int) error {
35+
log.Infof("setting up API Aggregation")
36+
for _, apiSvcDef := range AllAPIServices {
37+
svc := apiSvcDef.ToAPIService(serviceName, namespace, port)
38+
if _, err := a.apiRegC.ApiregistrationV1().APIServices().Create(ctx, svc, metav1.CreateOptions{}); err != nil {
39+
if !apierrors.IsAlreadyExists(err) {
40+
return err
41+
}
42+
curSvc, err := a.apiRegC.ApiregistrationV1().APIServices().Get(ctx, svc.Name, metav1.GetOptions{})
43+
if err != nil {
44+
return fmt.Errorf("failed to get existing APIService %s: %w", svc.Name, err)
45+
}
46+
svc.ResourceVersion = curSvc.ResourceVersion
47+
if _, err := a.apiRegC.ApiregistrationV1().APIServices().Update(ctx, svc, metav1.UpdateOptions{}); err != nil {
48+
return fmt.Errorf("failed to update APIService %s: %w", svc.Name, err)
49+
}
50+
}
51+
log.Infof("Registered API service: %s", svc.Name)
52+
}
53+
return nil
54+
}

0 commit comments

Comments
 (0)