Skip to content

Commit 254392f

Browse files
authored
feat: Delete CNI HelmRelease along with cluster (#23)
1 parent 7c440c3 commit 254392f

File tree

3 files changed

+126
-53
lines changed

3 files changed

+126
-53
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ require (
9393
k8s.io/apiextensions-apiserver v0.25.6
9494
k8s.io/client-go v0.25.6 // indirect
9595
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
96-
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
96+
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448
9797
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
9898
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
9999
sigs.k8s.io/yaml v1.3.0

pkg/addons/fluxhelmrelease/cni.go

Lines changed: 79 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@ import (
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1717
"k8s.io/apimachinery/pkg/runtime"
18+
"k8s.io/utils/pointer"
1819
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1920
"sigs.k8s.io/controller-runtime/pkg/client"
2021
"sigs.k8s.io/yaml"
2122
)
2223

23-
// CNIForCluster returns a complete set of Cluster API objects to describe a CNI Configuration
24-
// installable via Flux resources.
25-
func CNIForCluster(cluster *clusterv1.Cluster) ([]unstructured.Unstructured, error) {
26-
vals, _ := yaml.YAMLToJSON([]byte(`
24+
var calicoHelmReleaseValues, _ = yaml.YAMLToJSON([]byte(`
2725
installation:
2826
cni:
2927
type: Calico
@@ -40,6 +38,8 @@ installation:
4038
typhaMetricsPort: 9093
4139
`))
4240

41+
// CNIForCluster returns a set of objects to describe a CNI Configuration installable via Flux resources.
42+
func CNIForCluster(cluster *clusterv1.Cluster) ([]unstructured.Unstructured, error) {
4343
objs := []client.Object{
4444
&corev1.Namespace{
4545
TypeMeta: metav1.TypeMeta{
@@ -63,54 +63,27 @@ installation:
6363
URL: "https://docs.tigera.io/calico/charts",
6464
},
6565
},
66-
&fluxhelmv2beta1.HelmRelease{
67-
TypeMeta: metav1.TypeMeta{
68-
APIVersion: fluxhelmv2beta1.GroupVersion.String(),
69-
Kind: fluxhelmv2beta1.HelmReleaseKind,
70-
},
71-
ObjectMeta: metav1.ObjectMeta{
72-
Name: cluster.Name + "-tigera-operator",
73-
Namespace: cluster.Namespace,
74-
},
75-
Spec: fluxhelmv2beta1.HelmReleaseSpec{
76-
KubeConfig: &fluxhelmv2beta1.KubeConfig{
77-
SecretRef: meta.SecretKeyReference{
78-
Name: fmt.Sprintf("%s-kubeconfig", cluster.Name),
79-
Key: "value",
80-
},
81-
},
82-
TargetNamespace: "tigera-operator",
83-
ReleaseName: "tigera-operator",
84-
Chart: fluxhelmv2beta1.HelmChartTemplate{
85-
Spec: fluxhelmv2beta1.HelmChartTemplateSpec{
86-
SourceRef: fluxhelmv2beta1.CrossNamespaceObjectReference{
87-
APIVersion: fluxsourcev1beta2.GroupVersion.String(),
88-
Kind: fluxsourcev1beta2.HelmRepositoryKind,
89-
Namespace: "flux-helmrelease-addons",
90-
Name: "projectcalico",
91-
},
92-
Chart: "tigera-operator",
93-
Version: " v3.25.0",
94-
},
95-
},
96-
Values: &apiextensionsv1.JSON{Raw: vals},
97-
Install: &fluxhelmv2beta1.Install{
98-
CreateNamespace: true,
99-
CRDs: fluxhelmv2beta1.CreateReplace,
100-
Remediation: &fluxhelmv2beta1.InstallRemediation{
101-
Retries: 30,
102-
},
103-
},
104-
Upgrade: &fluxhelmv2beta1.Upgrade{
105-
CRDs: fluxhelmv2beta1.CreateReplace,
106-
Remediation: &fluxhelmv2beta1.UpgradeRemediation{
107-
Retries: 30,
108-
},
109-
},
110-
},
111-
},
66+
calicoHelmReleaseForCluster(cluster),
67+
}
68+
69+
unstrObjs := make([]unstructured.Unstructured, 0, len(objs))
70+
for _, obj := range objs {
71+
unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
72+
if err != nil {
73+
return nil, err
74+
}
75+
unstrObjs = append(unstrObjs, unstructured.Unstructured{Object: unstrObj})
11276
}
11377

78+
return unstrObjs, nil
79+
}
80+
81+
// CNIPatchesForClusterDelete returns a set of patches to apply before cluster deletion.
82+
func CNIPatchesForClusterDelete(cluster *clusterv1.Cluster) ([]unstructured.Unstructured, error) {
83+
hr := calicoHelmReleaseForCluster(cluster)
84+
hr.Spec.Suspend = true
85+
objs := []client.Object{hr}
86+
11487
unstrObjs := make([]unstructured.Unstructured, 0, len(objs))
11588
for _, obj := range objs {
11689
unstrObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
@@ -122,3 +95,59 @@ installation:
12295

12396
return unstrObjs, nil
12497
}
98+
99+
func calicoHelmReleaseForCluster(cluster *clusterv1.Cluster) *fluxhelmv2beta1.HelmRelease {
100+
return &fluxhelmv2beta1.HelmRelease{
101+
TypeMeta: metav1.TypeMeta{
102+
APIVersion: fluxhelmv2beta1.GroupVersion.String(),
103+
Kind: fluxhelmv2beta1.HelmReleaseKind,
104+
},
105+
ObjectMeta: metav1.ObjectMeta{
106+
Name: cluster.Name + "-tigera-operator",
107+
Namespace: cluster.Namespace,
108+
OwnerReferences: []metav1.OwnerReference{{
109+
APIVersion: cluster.APIVersion,
110+
Kind: cluster.Kind,
111+
Name: cluster.Name,
112+
UID: cluster.UID,
113+
Controller: pointer.Bool(true),
114+
}},
115+
},
116+
Spec: fluxhelmv2beta1.HelmReleaseSpec{
117+
KubeConfig: &fluxhelmv2beta1.KubeConfig{
118+
SecretRef: meta.SecretKeyReference{
119+
Name: fmt.Sprintf("%s-kubeconfig", cluster.Name),
120+
Key: "value",
121+
},
122+
},
123+
TargetNamespace: "tigera-operator",
124+
ReleaseName: "tigera-operator",
125+
Chart: fluxhelmv2beta1.HelmChartTemplate{
126+
Spec: fluxhelmv2beta1.HelmChartTemplateSpec{
127+
SourceRef: fluxhelmv2beta1.CrossNamespaceObjectReference{
128+
APIVersion: fluxsourcev1beta2.GroupVersion.String(),
129+
Kind: fluxsourcev1beta2.HelmRepositoryKind,
130+
Namespace: "flux-helmrelease-addons",
131+
Name: "projectcalico",
132+
},
133+
Chart: "tigera-operator",
134+
Version: " v3.25.0",
135+
},
136+
},
137+
Values: &apiextensionsv1.JSON{Raw: calicoHelmReleaseValues},
138+
Install: &fluxhelmv2beta1.Install{
139+
CreateNamespace: true,
140+
CRDs: fluxhelmv2beta1.CreateReplace,
141+
Remediation: &fluxhelmv2beta1.InstallRemediation{
142+
Retries: 30,
143+
},
144+
},
145+
Upgrade: &fluxhelmv2beta1.Upgrade{
146+
CRDs: fluxhelmv2beta1.CreateReplace,
147+
Remediation: &fluxhelmv2beta1.UpgradeRemediation{
148+
Retries: 30,
149+
},
150+
},
151+
},
152+
}
153+
}

pkg/handlers/lifecycle/handlers.go

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ func (m *ExtensionHandlers) DoAfterControlPlaneInitialized(
6464

6565
genericResourcesClient := k8sclient.NewGenericResourcesClient(m.client, log)
6666

67-
err := applyCNICRS(ctx, m.addonProvider, &request.Cluster, genericResourcesClient, m.client)
67+
err := applyCNIResources(
68+
ctx,
69+
m.addonProvider,
70+
&request.Cluster,
71+
genericResourcesClient,
72+
m.client,
73+
)
6874
if err != nil {
6975
response.Status = runtimehooksv1.ResponseStatusFailure
7076
response.Message = err.Error()
@@ -87,9 +93,47 @@ func (m *ExtensionHandlers) DoBeforeClusterDelete(
8793
) {
8894
log := ctrl.LoggerFrom(ctx)
8995
log.Info("BeforeClusterDelete is called")
96+
97+
genericResourcesClient := k8sclient.NewGenericResourcesClient(m.client, log)
98+
99+
err := applyCNIResourcesForDelete(
100+
ctx,
101+
m.addonProvider,
102+
&request.Cluster,
103+
genericResourcesClient,
104+
)
105+
if err != nil {
106+
response.Status = runtimehooksv1.ResponseStatusFailure
107+
response.Message = err.Error()
108+
}
109+
}
110+
111+
func applyCNIResourcesForDelete(
112+
ctx context.Context,
113+
addonProvider AddonProvider,
114+
cluster *v1beta1.Cluster,
115+
genericResourcesClient *k8sclient.GenericResourcesClient,
116+
) error {
117+
var (
118+
err error
119+
objs []unstructured.Unstructured
120+
)
121+
switch addonProvider {
122+
case ClusterResourceSetAddonProvider:
123+
// Nothing to do.
124+
case FluxHelmReleaseAddonProvider:
125+
objs, err = fluxhelmrelease.CNIPatchesForClusterDelete(cluster)
126+
default:
127+
err = fmt.Errorf("unsupported provider: %q", addonProvider)
128+
}
129+
if err != nil {
130+
return err
131+
}
132+
133+
return genericResourcesClient.Apply(ctx, objs...)
90134
}
91135

92-
func applyCNICRS(
136+
func applyCNIResources(
93137
ctx context.Context,
94138
addonProvider AddonProvider,
95139
cluster *v1beta1.Cluster,

0 commit comments

Comments
 (0)