Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 481b282

Browse files
committed
doing some refactoring and code cleanup
1 parent c915bbe commit 481b282

16 files changed

+147
-264
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,8 @@ CAPI_KIND_CLUSTER_NAME ?= capi-test
230230

231231
# It is set by Prow GIT_TAG, a git-based tag of the form vYYYYMMDD-hash, e.g., v20210120-v0.3.10-308-gc61521971
232232

233-
TAG ?= v0.3.0-alpha
233+
# Next release is: v0.3.1-alpha
234+
TAG ?= v0.3.1-preview
234235
ARCH ?= $(shell go env GOARCH)
235236
ALL_ARCH = amd64 arm arm64
236237

README.md

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88

99
# Cluster API Add-on Provider for Cdk8s
1010

11-
### 👋 Welcome! Here are some links to help you get started:
12-
13-
- [Project design outline](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20220712-cluster-api-addon-orchestration.md)
14-
1511
## ✨ What is Cluster API Add-on Provider for Cdk8s?
1612

1713
Cluster API Add-on Provider for Cdk8s extends Cluster API by managing the installation, configuration, upgrade, and deletion of cluster add-ons using cdk8s applications. This provider is based on the [Cluster API Add-on Orchestration Proposal](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20220712-cluster-api-addon-orchestration.md), a larger effort to bring orchestration for add-ons to CAPI by using existing package management tools.
@@ -47,14 +43,30 @@ apiVersion: addons.cluster.x-k8s.io/v1alpha1
4743
kind: Cdk8sAppProxy
4844
metadata:
4945
name: cdk8s-sample-app
50-
namespace: caapc-system
46+
namespace: default
5147
spec:
5248
gitRepository:
53-
url: https://github.com/PatrickLaabs/cdk8s-sample-deployment
54-
# reference: main # Optional: specify a branch, tag, or commit
55-
# path: "" # Optional: specify a path within the repository if cdk8s app is not at root
56-
clusterSelector:
57-
matchLabels: {}
49+
url: "https://github.com/PatrickLaabs/cluster-api-addon-provider-cdk8s/examples/cdk8s-sample-deployment"
50+
reference: "main"
51+
path: "."
52+
# authSecretRef:
53+
# name: git-credentials
54+
clusterSelector: {}
55+
# matchLabels:
56+
# environment: development
57+
# ---
58+
# apiVersion: v1
59+
# kind: Secret
60+
# metadata:
61+
# name: git-credentials
62+
# namespace: default
63+
# type: Opaque
64+
# data:
65+
# # Base64 encoded username
66+
# username: <base64-encoded-username>
67+
# # Base64 encoded password/token
68+
# password: <base64-encoded-password-or-token>
69+
5870
```
5971

6072
### Cdk8sAppProxySpec Fields

api/v1alpha1/cdk8sappproxy_types.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@ type Cdk8sAppProxySpec struct {
5656
// +kubebuilder:validation:Optional
5757
GitRepository *GitRepositorySpec `json:"gitRepository,omitempty"`
5858

59-
// Values is a string containing the values to be passed to the cdk8s app
60-
// +kubebuilder:validation:Optional
61-
Values string `json:"values,omitempty"`
62-
6359
// ClusterSelector selects the clusters to deploy the cdk8s app to.
6460
// +kubebuilder:validation:Required
6561
ClusterSelector metav1.LabelSelector `json:"clusterSelector"`

config/crd/bases/addons.cluster.x-k8s.io_cdk8sappproxies.yaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,6 @@ spec:
140140
LocalPath is the local filesystem path to the cdk8s app.
141141
One of LocalPath or GitRepository must be specified.
142142
type: string
143-
values:
144-
description: Values is a string containing the values to be passed
145-
to the cdk8s app
146-
type: string
147143
required:
148144
- clusterSelector
149145
type: object

config/default/manager_image_patch.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ spec:
77
template:
88
spec:
99
containers:
10-
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller-amd64:v0.3.0-alpha
10+
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v0.3.1-preview
1111
name: manager

config/default/manager_image_patch.yaml-e

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ spec:
77
template:
88
spec:
99
containers:
10-
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v0.2.11-preview
10+
- image: ghcr.io/patricklaabs/cluster-api-addon-provider-cdk8s/cluster-api-cdk8s-controller:v0.3.1-preview
1111
name: manager

config/default/manager_pull_policy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ spec:
88
spec:
99
containers:
1010
- name: manager
11-
imagePullPolicy: Always
11+
imagePullPolicy: IfNotPresent

config/default/manager_pull_policy.yaml-e

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ spec:
88
spec:
99
containers:
1010
- name: manager
11-
imagePullPolicy: IfNotPresent
11+
imagePullPolicy: Always

controllers/cdk8sappproxy/cdk8sappproxy_controller.go

Lines changed: 100 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -186,57 +186,46 @@ func (r *Reconciler) parseManifestFiles(manifestFiles []string, logger logr.Logg
186186
var parsedResources []*unstructured.Unstructured
187187

188188
for _, manifestFile := range manifestFiles {
189-
resources, err := r.parseManifestFile(manifestFile, logger, operation)
190-
if err != nil {
191-
return nil, err
192-
}
193-
parsedResources = append(parsedResources, resources...)
194-
}
189+
logger.Info("Processing manifest file", "file", manifestFile, "operation", operation)
195190

196-
logger.Info("Total resources parsed", "count", len(parsedResources), "operation", operation)
191+
fileContent, readErr := os.ReadFile(manifestFile)
192+
if readErr != nil {
193+
logger.Error(readErr, "Failed to read manifest file", "file", manifestFile, "operation", operation)
197194

198-
return parsedResources, nil
199-
}
200-
201-
func (r *Reconciler) parseManifestFile(manifestFile string, logger logr.Logger, operation string) ([]*unstructured.Unstructured, error) {
202-
logger.Info("Processing manifest file", "file", manifestFile, "operation", operation)
203-
204-
fileContent, readErr := os.ReadFile(manifestFile)
205-
if readErr != nil {
206-
logger.Error(readErr, "Failed to read manifest file", "file", manifestFile, "operation", operation)
195+
return nil, readErr
196+
}
207197

208-
return nil, readErr
209-
}
198+
yamlDecoder := k8syaml.NewYAMLOrJSONDecoder(bytes.NewReader(fileContent), 100)
210199

211-
var parsedResources []*unstructured.Unstructured
212-
yamlDecoder := k8syaml.NewYAMLOrJSONDecoder(bytes.NewReader(fileContent), 100)
200+
for {
201+
var rawObj runtime.RawExtension
202+
if err := yamlDecoder.Decode(&rawObj); err != nil {
203+
if err.Error() == "EOF" {
204+
break
205+
}
206+
logger.Error(err, "Failed to decode YAML from manifest file", "file", manifestFile, "operation", operation)
213207

214-
for {
215-
var rawObj runtime.RawExtension
216-
if err := yamlDecoder.Decode(&rawObj); err != nil {
217-
if err.Error() == "EOF" {
218-
break
208+
return nil, err
219209
}
220-
logger.Error(err, "Failed to decode YAML from manifest file", "file", manifestFile, "operation", operation)
221210

222-
return nil, err
223-
}
211+
if rawObj.Raw == nil {
212+
continue
213+
}
224214

225-
if rawObj.Raw == nil {
226-
continue
227-
}
215+
u := &unstructured.Unstructured{}
216+
if _, _, err := unstructured.UnstructuredJSONScheme.Decode(rawObj.Raw, nil, u); err != nil {
217+
logger.Error(err, "Failed to decode RawExtension to Unstructured", "file", manifestFile, "operation", operation)
228218

229-
u := &unstructured.Unstructured{}
230-
if _, _, err := unstructured.UnstructuredJSONScheme.Decode(rawObj.Raw, nil, u); err != nil {
231-
logger.Error(err, "Failed to decode RawExtension to Unstructured", "file", manifestFile, "operation", operation)
219+
return nil, err
220+
}
232221

233-
return nil, err
222+
parsedResources = append(parsedResources, u)
223+
logger.Info("Parsed resource", "GVK", u.GroupVersionKind().String(), "Name", u.GetName(), "Namespace", u.GetNamespace(), "operation", operation)
234224
}
235-
236-
parsedResources = append(parsedResources, u)
237-
logger.Info("Parsed resource", "GVK", u.GroupVersionKind().String(), "Name", u.GetName(), "Namespace", u.GetNamespace(), "operation", operation)
238225
}
239226

227+
logger.Info("Total resources parsed", "count", len(parsedResources), "operation", operation)
228+
240229
return parsedResources, nil
241230
}
242231

@@ -258,6 +247,39 @@ func (r *Reconciler) deleteResourcesFromClusters(ctx context.Context, cdk8sAppPr
258247
return nil
259248
}
260249

250+
func (r *Reconciler) deleteResourcesFromSingleCluster(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, cluster clusterv1.Cluster, parsedResources []*unstructured.Unstructured, logger logr.Logger) error {
251+
clusterLogger := logger.WithValues("targetCluster", cluster.Name)
252+
clusterLogger.Info("Deleting resources from cluster")
253+
254+
dynamicClient, err := r.getDynamicClientForCluster(ctx, cdk8sAppProxy.Namespace, cluster.Name)
255+
if err != nil {
256+
clusterLogger.Error(err, "Failed to get dynamic client for cluster during deletion, skipping this cluster")
257+
258+
return err
259+
}
260+
261+
clusterLogger.Info("Successfully created dynamic client for cluster deletion")
262+
263+
for _, resource := range parsedResources {
264+
gvr := resource.GroupVersionKind().GroupVersion().WithResource(getPluralFromKind(resource.GetKind()))
265+
clusterLogger.Info("Deleting resource from cluster", "GVK", resource.GroupVersionKind().String(), "Name", resource.GetName(), "Namespace", resource.GetNamespace())
266+
267+
err := dynamicClient.Resource(gvr).Namespace(resource.GetNamespace()).Delete(ctx, resource.GetName(), metav1.DeleteOptions{})
268+
269+
switch {
270+
case err != nil && !apierrors.IsNotFound(err):
271+
clusterLogger.Error(err, "Failed to delete resource from cluster", "resourceName", resource.GetName())
272+
// Log but continue with other resources
273+
case apierrors.IsNotFound(err):
274+
clusterLogger.Info("Resource already deleted from cluster", "resourceName", resource.GetName())
275+
case err == nil:
276+
clusterLogger.Info("Successfully deleted resource from cluster", "resourceName", resource.GetName())
277+
}
278+
}
279+
280+
return nil
281+
}
282+
261283
func (r *Reconciler) getTargetClustersForDeletion(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, logger logr.Logger) (*clusterv1.ClusterList, error) {
262284
clusterList := &clusterv1.ClusterList{}
263285
selector, err := metav1.LabelSelectorAsSelector(&cdk8sAppProxy.Spec.ClusterSelector)
@@ -283,83 +305,77 @@ func (r *Reconciler) getTargetClustersForDeletion(ctx context.Context, cdk8sAppP
283305
return clusterList, nil
284306
}
285307

286-
func (r *Reconciler) deleteResourcesFromSingleCluster(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, cluster clusterv1.Cluster, parsedResources []*unstructured.Unstructured, logger logr.Logger) error {
287-
clusterLogger := logger.WithValues("targetCluster", cluster.Name)
288-
clusterLogger.Info("Deleting resources from cluster")
289-
290-
dynamicClient, err := r.getDynamicClientForCluster(ctx, cdk8sAppProxy.Namespace, cluster.Name)
291-
if err != nil {
292-
clusterLogger.Error(err, "Failed to get dynamic client for cluster during deletion, skipping this cluster")
308+
// func (r *Reconciler) deleteResourcesFromSingleCluster(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, cluster clusterv1.Cluster, parsedResources []*unstructured.Unstructured, logger logr.Logger) error {
309+
// clusterLogger := logger.WithValues("targetCluster", cluster.Name)
310+
// clusterLogger.Info("Deleting resources from cluster")
293311

294-
return err
295-
}
312+
// dynamicClient, err := r.getDynamicClientForCluster(ctx, cdk8sAppProxy.Namespace, cluster.Name)
313+
// if err != nil {
314+
// clusterLogger.Error(err, "Failed to get dynamic client for cluster during deletion, skipping this cluster")
296315

297-
clusterLogger.Info("Successfully created dynamic client for cluster deletion")
316+
// return err
317+
// }
298318

299-
for _, resource := range parsedResources {
300-
if err := r.deleteResourceFromCluster(ctx, dynamicClient, resource, clusterLogger); err != nil {
301-
// Log but continue with other resources
302-
clusterLogger.Error(err, "Failed to delete resource from cluster", "resourceName", resource.GetName())
303-
}
304-
}
319+
// clusterLogger.Info("Successfully created dynamic client for cluster deletion")
305320

306-
return nil
307-
}
321+
// for _, resource := range parsedResources {
322+
// if err := r.deleteResourceFromCluster(ctx, dynamicClient, resource, clusterLogger); err != nil {
323+
// // Log but continue with other resources
324+
// clusterLogger.Error(err, "Failed to delete resource from cluster", "resourceName", resource.GetName())
325+
// }
326+
// }
308327

309-
func (r *Reconciler) deleteResourceFromCluster(ctx context.Context, dynamicClient dynamic.Interface, resource *unstructured.Unstructured, logger logr.Logger) error {
310-
gvr := resource.GroupVersionKind().GroupVersion().WithResource(getPluralFromKind(resource.GetKind()))
311-
logger.Info("Deleting resource from cluster", "GVK", resource.GroupVersionKind().String(), "Name", resource.GetName(), "Namespace", resource.GetNamespace())
328+
// return nil
329+
// }
312330

313-
err := dynamicClient.Resource(gvr).Namespace(resource.GetNamespace()).Delete(ctx, resource.GetName(), metav1.DeleteOptions{})
331+
// func (r *Reconciler) deleteResourceFromCluster(ctx context.Context, dynamicClient dynamic.Interface, resource *unstructured.Unstructured, logger logr.Logger) error {
332+
// gvr := resource.GroupVersionKind().GroupVersion().WithResource(getPluralFromKind(resource.GetKind()))
333+
// logger.Info("Deleting resource from cluster", "GVK", resource.GroupVersionKind().String(), "Name", resource.GetName(), "Namespace", resource.GetNamespace())
314334

315-
switch {
316-
case err != nil && !apierrors.IsNotFound(err):
317-
logger.Error(err, "Failed to delete resource from cluster", "resourceName", resource.GetName())
335+
// err := dynamicClient.Resource(gvr).Namespace(resource.GetNamespace()).Delete(ctx, resource.GetName(), metav1.DeleteOptions{})
318336

319-
return err
320-
case apierrors.IsNotFound(err):
321-
logger.Info("Resource already deleted from cluster", "resourceName", resource.GetName())
322-
case err == nil:
323-
logger.Info("Successfully deleted resource from cluster", "resourceName", resource.GetName())
324-
}
337+
// switch {
338+
// case err != nil && !apierrors.IsNotFound(err):
339+
// logger.Error(err, "Failed to delete resource from cluster", "resourceName", resource.GetName())
325340

326-
return nil
327-
}
341+
// return err
342+
// case apierrors.IsNotFound(err):
343+
// logger.Info("Resource already deleted from cluster", "resourceName", resource.GetName())
344+
// case err == nil:
345+
// logger.Info("Successfully deleted resource from cluster", "resourceName", resource.GetName())
346+
// }
328347

329-
func (r *Reconciler) finalizeDeletion(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, proxyNamespacedName types.NamespacedName, logger logr.Logger) (ctrl.Result, error) {
330-
// Cancel any active watches for this Cdk8sAppProxy
331-
r.cancelActiveWatches(proxyNamespacedName, logger)
348+
// return nil
349+
// }
332350

333-
// Remove finalizer
334-
return r.removeFinalizer(ctx, cdk8sAppProxy, logger)
335-
}
351+
func (r *Reconciler) finalizeDeletion(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, proxyNamespacedName types.NamespacedName, logger logr.Logger) error {
352+
logger.Info("Starting finalization process")
336353

337-
func (r *Reconciler) cancelActiveWatches(proxyNamespacedName types.NamespacedName, logger logr.Logger) {
354+
// Cancel any active watches for this Cdk8sAppProxy
338355
if watchesForProxy, ok := r.ActiveWatches[proxyNamespacedName]; ok {
339356
logger.Info("Cancelling active watches for Cdk8sAppProxy before deletion", "count", len(watchesForProxy))
340357
for watchKey, cancelFunc := range watchesForProxy {
341358
logger.Info("Cancelling watch", "watchKey", watchKey)
342359
cancelFunc() // Stop the goroutine and its associated Kubernetes watch
343360
}
344-
// After all, watches for this proxy are canceled, remove its entry from the main map
361+
// After all watches for this proxy are canceled, remove its entry from the main map
345362
delete(r.ActiveWatches, proxyNamespacedName)
346363
logger.Info("Removed Cdk8sAppProxy entry from ActiveWatches map")
347364
} else {
348-
logger.Info("No active watches found for this Cdk8sAppProxy to cancel.")
365+
logger.Info("No active watches found for this Cdk8sAppProxy to cancel")
349366
}
350-
}
351367

352-
func (r *Reconciler) removeFinalizer(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy, logger logr.Logger) (ctrl.Result, error) {
368+
// Remove finalizer
353369
logger.Info("Finished deletion logic, removing finalizer")
354370
controllerutil.RemoveFinalizer(cdk8sAppProxy, Finalizer)
355371
if err := r.Update(ctx, cdk8sAppProxy); err != nil {
356372
logger.Error(err, "Failed to remove finalizer")
357373

358-
return ctrl.Result{}, err
374+
return err
359375
}
360376
logger.Info("Finalizer removed successfully")
361377

362-
return ctrl.Result{}, nil
378+
return nil
363379
}
364380

365381
func (r *Reconciler) getDynamicClientForCluster(ctx context.Context, secretNamespace, clusterName string) (dynamic.Interface, error) {

controllers/cdk8sappproxy/cdk8sappproxy_reconciler.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cdk8sAppProxy *addonsv
103103
}
104104

105105
// Clean up watches and remove finalizer
106-
return r.finalizeDeletion(ctx, cdk8sAppProxy, proxyNamespacedName, logger)
106+
if err := r.finalizeDeletion(ctx, cdk8sAppProxy, proxyNamespacedName, logger); err != nil {
107+
return ctrl.Result{}, err
108+
}
109+
110+
return ctrl.Result{}, nil
107111
}
108112

109113
func (r *Reconciler) reconcileNormal(ctx context.Context, cdk8sAppProxy *addonsv1alpha1.Cdk8sAppProxy) (ctrl.Result, error) {

0 commit comments

Comments
 (0)