Skip to content

Commit 683abb1

Browse files
committed
Add helm deployment & fixup generator
1 parent a1d334d commit 683abb1

39 files changed

Lines changed: 3880 additions & 468 deletions

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ coverage.*
1414
/dex
1515
/bin
1616
docs/generators/cli-doc/cli-doc
17-
dex/
1817
apiserviceexport.yaml
18+
*.prod

Makefile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,26 @@ CONTRIBS_E2E := $(patsubst %,test-e2e-contrib-%,$(CONTRIBS))
290290

291291
.PHONY: test-e2e-contribs $(CONTRIBS_E2E)
292292
test-e2e-contribs: $(CONTRIBS_E2E) ## Run e2e tests for external integrations
293+
294+
.PHONY: test-e2e-contrib-kcp
293295
test-e2e-contrib-kcp: $(DEX) $(KCP)
294296
$(CONTRIBS_E2E):
295297
cd contrib/$(patsubst test-e2e-contrib-%,%,$@) && $(GO_TEST) -race -count $(COUNT) $(E2E_PARALLELISM_FLAG) ./test/e2e/...
296298

299+
DESTROY_KIND_CLUSTER ?= true
300+
REUSE_KIND_CLUSTER_SUFFIX ?= ""
301+
KIND_CLUSTER_NAME ?= kube-bind
302+
303+
.PHONY: test-e2e-kind
304+
test-e2e-kind: build image-local
305+
echo "Running kube-bind e2e tests"
306+
KUBE_BIND_BACKEND_IMAGE=$(KO_DOCKER_REPO)/backend:$(REV) \
307+
KUBE_BIND_KONNECTOR_IMAGE=$(KO_DOCKER_REPO)/konnector:$(REV) \
308+
$(GO_TEST) -v ./test/e2e-kind/... \
309+
-destroy-kind-cluster=$(DESTROY_KIND_CLUSTER) \
310+
-collect-logs=true
311+
echo "Kube-bind e2e tests completed"
312+
297313
.PHONY: test
298314
ifdef USE_GOTESTSUM
299315
test: $(GOTESTSUM)

backend/controllers/clusterbinding/clusterbinding_controller.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,12 @@ func NewClusterBindingReconciler(
147147
return r, nil
148148
}
149149

150-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=clusterbindings,verbs=get;list;watch;create;update;patch;delete
151-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=clusterbindings/status,verbs=get;update;patch
152-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=clusterbindings/finalizers,verbs=update
153-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports,verbs=get;list;watch
150+
//+kubebuilder:rbac:groups=kube-bind.io,resources=clusterbindings,verbs=get;list;watch;create;update;patch;delete
151+
//+kubebuilder:rbac:groups=kube-bind.io,resources=clusterbindings/status,verbs=get;update;patch
152+
//+kubebuilder:rbac:groups=kube-bind.io,resources=clusterbindings/finalizers,verbs=update
153+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports,verbs=get;list;watch
154+
//+kubebuilder:rbac:groups=kube-bind.io,resources=collections,verbs=get;list;watch
155+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexporttemplates,verbs=get;list;watch
154156
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterroles,verbs=get;list;watch;create;update;patch;delete
155157
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=clusterrolebindings,verbs=get;list;watch;create;update;patch;delete
156158
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=rolebindings,verbs=get;list;watch;create;update;patch;delete

backend/controllers/rbac.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package controllers
2+
3+
// This is Core access needed for backend controllers.
4+
//+kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch;create;update;patch;delete
5+
//+kubebuilder:rbac:groups="",resources=serviceaccounts,verbs=get;list;watch;create;update;patch;delete
6+
//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;create;update;patch;delete
7+
//+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
8+
//+kubebuilder:rbac:groups="",resources=namespaces,verbs=get;list;watch;create;update;patch;delete
9+
10+
// Additional RBAC permissions for export functionality
11+
// These permissions allow the backend to grant RBAC permissions for exported resources
12+
//+kubebuilder:rbac:groups="",resources=configmaps,verbs=*
13+
//+kubebuilder:rbac:groups="",resources=secrets,verbs=*

backend/controllers/serviceexport/serviceexport_controller.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ func NewAPIServiceExportReconciler(
8282
return r, nil
8383
}
8484

85-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports,verbs=get;list;watch;create;update;patch;delete
86-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports/status,verbs=get;update;patch
87-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports/finalizers,verbs=update
88-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=boundschemas,verbs=get;list;watch
89-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=boundschemas/status,verbs=get;update;patch
85+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports,verbs=get;list;watch;create;update;patch;delete
86+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports/status,verbs=get;update;patch
87+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports/finalizers,verbs=update
88+
//+kubebuilder:rbac:groups=kube-bind.io,resources=boundschemas,verbs=get;list;watch;create;update;patch;delete
89+
//+kubebuilder:rbac:groups=kube-bind.io,resources=boundschemas/status,verbs=get;update;patch;list
9090

9191
// Reconcile is part of the main kubernetes reconciliation loop which aims to
9292
// move the current state of the cluster closer to the desired state.

backend/controllers/serviceexportrequest/serviceexportrequest_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,12 @@ func getBoundSchemaMapper(clusterName string, cl cluster.Cluster) handler.TypedE
177177
})
178178
}
179179

180-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexportrequests,verbs=get;list;watch;create;update;patch;delete
181-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexportrequests/status,verbs=get;update;patch
182-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexportrequests/finalizers,verbs=update
183-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports,verbs=get;list;watch;create;update;patch;delete
184-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiresourceschemas,verbs=get;list;watch;create;update;patch;delete
185-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=resources=apiservicenamespaces,verbs=get;list;watch;create
180+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexportrequests,verbs=get;list;watch;create;update;patch;delete
181+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexportrequests/status,verbs=get;update;patch
182+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexportrequests/finalizers,verbs=update
183+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports,verbs=get;list;watch;create;update;patch;delete
184+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiresourceschemas,verbs=get;list;watch;create;update;patch;delete
185+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiservicenamespaces,verbs=get;list;watch;create
186186

187187
// Reconcile is part of the main kubernetes reconciliation loop which aims to
188188
// move the current state of the cluster closer to the desired state.

backend/controllers/servicenamespace/servicenamespace_controller.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,11 @@ func getServiceExportMapper(clusterName string, cl cluster.Cluster) handler.Type
206206
})
207207
}
208208

209-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiservicenamespaces,verbs=get;list;watch;create;update;patch;delete
210-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiservicenamespaces/status,verbs=get;update;patch
211-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiservicenamespaces/finalizers,verbs=update
212-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=clusterbindings,verbs=get;list;watch
213-
//+kubebuilder:rbac:groups=kubebind.k8s.io,resources=apiserviceexports,verbs=get;list;watch
209+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiservicenamespaces,verbs=get;list;watch;create;update;patch;delete
210+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiservicenamespaces/status,verbs=get;update;patch
211+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiservicenamespaces/finalizers,verbs=update
212+
//+kubebuilder:rbac:groups=kube-bind.io,resources=clusterbindings,verbs=get;list;watch
213+
//+kubebuilder:rbac:groups=kube-bind.io,resources=apiserviceexports,verbs=get;list;watch
214214
//+kubebuilder:rbac:groups="",resources=namespaces,verbs=get;list;watch;create;update;patch;delete
215215
//+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=rolebindings,verbs=get;list;watch;create;update;patch;delete
216216

backend/http/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func (h *handler) handleAuthorize(w http.ResponseWriter, r *http.Request) {
205205
ProviderClusterID: providerCluster, // used in multicluster-runtime providers
206206
}
207207
if callbackPort != "" && code.RedirectURL == "" {
208-
code.RedirectURL = fmt.Sprintf("http://localhost:%s/callback", callbackPort)
208+
code.RedirectURL = fmt.Sprintf("http://127.0.0.1:%s/callback", callbackPort)
209209
}
210210

211211
if code.RedirectURL == "" || code.SessionID == "" || code.ClusterID == "" {

backend/template/resources.gohtml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<!-- Bootstrap Icons -->
1111
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
1212

13-
<title>Modules - Kube Bind</title>
13+
<title>Services - Kube Bind</title>
1414
<style>
1515
body {
1616
background: #f8f9fa;
@@ -36,25 +36,25 @@
3636
margin: 0;
3737
}
3838

39-
.module-card {
39+
.service-card {
4040
border: 1px solid #dee2e6;
4141
border-radius: 6px;
4242
background: white;
4343
transition: border-color 0.15s ease-in-out;
4444
margin-bottom: 1rem;
4545
}
4646

47-
.module-card:hover {
47+
.service-card:hover {
4848
border-color: #007bff;
4949
}
5050

51-
.module-card .card-header {
51+
.service-card .card-header {
5252
background: #f8f9fa;
5353
border-bottom: 1px solid #dee2e6;
5454
padding: 0.75rem 1rem;
5555
}
5656

57-
.module-card .card-header h5 {
57+
.service-card .card-header h5 {
5858
margin: 0;
5959
font-size: 1.1rem;
6060
font-weight: 500;
@@ -135,14 +135,14 @@
135135
<body>
136136
<div class="container">
137137
<div class="page-header">
138-
<h2>Available Modules</h2>
139-
<p>Select a module to bind its resources and permissions</p>
138+
<h2>Available Services</h2>
139+
<p>Select a service to bind its resources and permissions</p>
140140
</div>
141141

142142
<div class="row">
143-
{{range $moduleIdx, $schema := .Schemas}}
143+
{{range $serviceIdx, $schema := .Schemas}}
144144
<div class="col-lg-6 col-md-12 mb-3">
145-
<div class="card module-card">
145+
<div class="card service-card">
146146
<div class="card-header">
147147
<h5>{{$schema.Name}}</h5>
148148
{{if $schema.Description}}<small class="text-muted">{{$schema.Description}}</small>{{end}}
@@ -171,10 +171,10 @@
171171
</span>
172172
{{if or $claim.Selector.NamedResources $claim.Selector.LabelSelector}}
173173
<br>
174-
<a class="btn details-btn mt-1" data-toggle="collapse" href="#claim-{{$moduleIdx}}-{{$i}}" role="button" aria-expanded="false">
174+
<a class="btn details-btn mt-1" data-toggle="collapse" href="#claim-{{$serviceIdx}}-{{$i}}" role="button" aria-expanded="false">
175175
Details
176176
</a>
177-
<div class="collapse mt-2" id="claim-{{$moduleIdx}}-{{$i}}">
177+
<div class="collapse mt-2" id="claim-{{$serviceIdx}}-{{$i}}">
178178
{{if $claim.Selector.NamedResources}}
179179
<div class="detail-card p-2 mb-2">
180180
<strong>Named:</strong>
@@ -217,7 +217,7 @@
217217
</ul>
218218
<div class="card-body">
219219
<a href="{{if $.Cluster}}/clusters/{{$.Cluster}}{{end}}/bind?s={{$schema.SessionID}}&template={{$schema.Name}}" class="btn bind-btn {{$schema.Name}}">
220-
Bind Module
220+
Bind Service
221221
</a>
222222
</div>
223223
</div>

cli/pkg/kubectl/bind-apiservice/plugin/bind.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,39 +143,72 @@ func (b *BindAPIServiceOptions) Validate() error {
143143

144144
// Run starts the binding process.
145145
func (b *BindAPIServiceOptions) Run(ctx context.Context) error {
146+
fmt.Fprintf(b.Options.ErrOut, "🔧 Starting binding process...\n")
147+
148+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 1: Getting client config...\n")
146149
config, err := b.Options.ClientConfig.ClientConfig()
147150
if err != nil {
151+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to get client config: %v\n", err)
148152
return err
149153
}
154+
fmt.Fprintf(b.Options.ErrOut, "✅ Client config obtained successfully\n")
150155

156+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 2: Getting remote kubeconfig...\n")
151157
remoteKubeconfig, remoteNamespace, remoteConfig, err := b.getRemoteKubeconfig(ctx, config)
152158
if err != nil {
159+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to get remote kubeconfig: %v\n", err)
153160
return err
154161
}
162+
fmt.Fprintf(b.Options.ErrOut, "✅ Remote kubeconfig obtained, namespace: %s\n", remoteNamespace)
163+
164+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 3: Getting request manifest...\n")
155165
bs, err := b.getRequestManifest()
156166
if err != nil {
167+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to get request manifest: %v\n", err)
157168
return err
158169
}
170+
fmt.Fprintf(b.Options.ErrOut, "✅ Request manifest obtained (%d bytes)\n", len(bs))
171+
172+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 4: Unmarshaling manifest...\n")
159173
request, err := b.unmarshalManifest(bs)
160174
if err != nil {
175+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to unmarshal manifest: %v\n", err)
161176
return err
162177
}
178+
fmt.Fprintf(b.Options.ErrOut, "✅ Manifest unmarshaled successfully\n")
179+
180+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 5: Creating service export request...\n")
163181
result, err := b.createServiceExportRequest(ctx, remoteConfig, remoteNamespace, request)
164182
if err != nil {
183+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to create service export request: %v\n", err)
165184
return err
166185
}
186+
fmt.Fprintf(b.Options.ErrOut, "✅ Service export request created successfully\n")
187+
188+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 6: Deploying konnector...\n")
167189
if err := b.deployKonnector(ctx, config); err != nil {
190+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to deploy konnector: %v\n", err)
168191
return err
169192
}
193+
fmt.Fprintf(b.Options.ErrOut, "✅ Konnector deployed successfully\n")
194+
195+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 7: Creating kubeconfig secret...\n")
170196
secretName, err := b.createKubeconfigSecret(ctx, config, remoteConfig.Host, remoteNamespace, remoteKubeconfig)
171197
if err != nil {
198+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to create kubeconfig secret: %v\n", err)
172199
return err
173200
}
201+
fmt.Fprintf(b.Options.ErrOut, "✅ Kubeconfig secret created: %s\n", secretName)
202+
203+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 8: Creating API service bindings...\n")
174204
bindings, err := b.createAPIServiceBindings(ctx, config, result, secretName)
175205
if err != nil {
206+
fmt.Fprintf(b.Options.ErrOut, "❌ Failed to create API service bindings: %v\n", err)
176207
return err
177208
}
209+
fmt.Fprintf(b.Options.ErrOut, "✅ API service bindings created (%d bindings)\n", len(bindings))
178210

211+
fmt.Fprintf(b.Options.ErrOut, "📋 Step 9: Printing results table...\n")
179212
fmt.Fprintln(b.Options.ErrOut)
180213
return b.printTable(ctx, config, bindings)
181214
}

0 commit comments

Comments
 (0)