Skip to content

Commit 894e1f8

Browse files
committed
feat: implement kubeadmintel provider
1 parent 5a759d2 commit 894e1f8

File tree

1 file changed

+131
-27
lines changed

1 file changed

+131
-27
lines changed

internal/providers/kubeadmintel.go

Lines changed: 131 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,164 @@ package controlplaneprovider
22

33
import (
44
"context"
5-
"errors"
5+
"encoding/json"
6+
"fmt"
67

8+
intelv1alpha1 "github.com/open-edge-platform/cluster-api-provider-intel/api/v1alpha1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
711
"k8s.io/apimachinery/pkg/types"
812
"sigs.k8s.io/cluster-api/api/v1beta1"
13+
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
14+
kubeadmcpv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1"
915
"sigs.k8s.io/controller-runtime/pkg/client"
1016
)
1117

1218
type kubeadmintel struct{}
1319

1420
// AlterClusterClass implements Provider.
1521
func (k kubeadmintel) AlterClusterClass(cc *v1beta1.ClusterClass) {
16-
}
22+
cc.Spec.ControlPlane.LocalObjectTemplate.Ref.Kind = KubeadmControlPlaneTemplate
1723

18-
// CreateClusterTemplate implements Provider.
19-
func (k kubeadmintel) CreateClusterTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
20-
return errors.New("not implemented")
24+
cc.Spec.ControlPlane.MachineInfrastructure.Ref.APIVersion = "infrastructure.cluster.x-k8s.io/v1alpha1"
25+
cc.Spec.ControlPlane.MachineInfrastructure.Ref.Kind = IntelMachineTemplate
26+
27+
cc.Spec.Infrastructure.Ref.APIVersion = "infrastructure.cluster.x-k8s.io/v1alpha1"
28+
cc.Spec.Infrastructure.Ref.Kind = IntelClusterTemplate
29+
30+
cc.Spec.Variables = []capiv1beta1.ClusterClassVariable{
31+
{
32+
Name: connectAgentManifest,
33+
Schema: capiv1beta1.VariableSchema{
34+
OpenAPIV3Schema: capiv1beta1.JSONSchemaProps{
35+
Type: "object",
36+
Properties: map[string]capiv1beta1.JSONSchemaProps{
37+
"path": {
38+
Type: "string",
39+
},
40+
"content": {
41+
Type: "string",
42+
},
43+
"owner": {
44+
Type: "string",
45+
},
46+
},
47+
},
48+
},
49+
},
50+
}
51+
52+
cc.Spec.Patches = []capiv1beta1.ClusterClassPatch{
53+
{
54+
Name: "connect-agent-manifest",
55+
Description: "This patch will add connect-agent manifest " +
56+
"injected by Cluster Connect Gateway.",
57+
EnabledIf: &enabledIf,
58+
Definitions: []capiv1beta1.PatchDefinition{
59+
{
60+
Selector: capiv1beta1.PatchSelector{
61+
APIVersion: "controlplane.cluster.x-k8s.io/v1beta1",
62+
Kind: RKE2ControlPlaneTemplate,
63+
MatchResources: capiv1beta1.PatchSelectorMatch{
64+
ControlPlane: true,
65+
},
66+
},
67+
JSONPatches: []capiv1beta1.JSONPatch{
68+
{
69+
// This patch assumes something is already at .Files array.
70+
// If not (like in vanilla baseline template), we'll need a different patch
71+
Op: "add",
72+
Path: "/spec/template/spec/files/-",
73+
ValueFrom: &capiv1beta1.JSONPatchValue{
74+
Variable: &connectAgentManifest,
75+
},
76+
},
77+
},
78+
},
79+
},
80+
},
81+
}
2182
}
2283

23-
// CreateControlPlaneMachineTemplate implements Provider.
24-
func (k kubeadmintel) CreateControlPlaneMachineTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
25-
return errors.New("not implemented")
84+
// CreatePrerequisites ensures that any prerequisites required by the kubeadmintel provider are created.
85+
// For this provider, no prerequisites are required, so this method does nothing.
86+
func (k kubeadmintel) CreatePrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
87+
return nil
2688
}
2789

28-
// CreateControlPlaneTemplate implements Provider.
90+
// CreateControlPlaneTemplate creates a new KubeadmControlPlaneTemplate.
2991
func (k kubeadmintel) CreateControlPlaneTemplate(ctx context.Context, c client.Client, name types.NamespacedName, config string) error {
30-
return errors.New("not implemented")
92+
var cpt kubeadmcpv1beta1.KubeadmControlPlaneTemplate
93+
if err := json.Unmarshal([]byte(config), &cpt); err != nil {
94+
return fmt.Errorf("failed to unmarshal control plane template: %w", err)
95+
}
96+
97+
cpt.ObjectMeta = metav1.ObjectMeta{
98+
Name: name.Name,
99+
Namespace: name.Namespace,
100+
}
101+
102+
return c.Create(ctx, &cpt)
31103
}
32104

33-
// CreatePrerequisites implements Provider.
34-
func (k kubeadmintel) CreatePrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
35-
return errors.New("not implemented")
105+
// CreateControlPlaneMachineTemplate creates a new IntelMachineTemplate with the name <name>-controlplane.
106+
func (k kubeadmintel) CreateControlPlaneMachineTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
107+
cpmt := intelv1alpha1.IntelMachineTemplate{
108+
ObjectMeta: metav1.ObjectMeta{
109+
Name: fmt.Sprintf("%s-controlplane", name.Name),
110+
Namespace: name.Namespace,
111+
},
112+
Spec: intelv1alpha1.IntelMachineTemplateSpec{
113+
Template: intelv1alpha1.IntelMachineTemplateSpecTemplate{},
114+
},
115+
}
116+
return c.Create(ctx, &cpmt)
36117
}
37118

38-
// DeletePrerequisites implements Provider.
39-
func (k kubeadmintel) DeletePrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
40-
return errors.New("not implemented")
119+
// CreateClusterTemplate creates IntelClusterTemplate for the kubeadmintel provider.
120+
func (k kubeadmintel) CreateClusterTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
121+
uct := unstructured.Unstructured{
122+
Object: map[string]interface{}{
123+
"apiVersion": intelv1alpha1.GroupVersion.String(),
124+
"kind": "IntelClusterTemplate",
125+
"metadata": map[string]interface{}{
126+
"name": name.Name,
127+
"namespace": name.Namespace,
128+
},
129+
"spec": map[string]interface{}{
130+
"template": map[string]interface{}{
131+
"metadata": map[string]interface{}{},
132+
"spec": map[string]interface{}{},
133+
},
134+
},
135+
},
136+
}
137+
return c.Create(ctx, &uct)
41138
}
42139

43-
// GetClusterTemplate implements Provider.
44-
func (k kubeadmintel) GetClusterTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
45-
return errors.New("not implemented")
140+
// DeletePrerequisites deletes the prerequisites for the kubeadmintel provider.
141+
// For this provider, no prerequisites are required, so this method does nothing.
142+
func (k kubeadmintel) DeletePrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
143+
return nil
46144
}
47145

48-
// GetControlPlaneMachineTemplate implements Provider.
49-
func (k kubeadmintel) GetControlPlaneMachineTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
50-
return errors.New("not implemented")
146+
// GetPrerequisites gets the prerequisites for the kubeadmintel provider.
147+
// For this provider, no prerequisites are required, so this method does nothing.
148+
func (k kubeadmintel) GetPrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
149+
return nil
51150
}
52151

53-
// GetControlPlaneTemplate implements Provider.
152+
// GetControlPlaneTemplate gets KubeadmControlPlaneTemplate for the kubeadmintel provider.
54153
func (k kubeadmintel) GetControlPlaneTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
55-
return errors.New("not implemented")
154+
return c.Get(ctx, name, &kubeadmcpv1beta1.KubeadmControlPlaneTemplate{})
56155
}
57156

58-
// GetPrerequisites implements Provider.
59-
func (k kubeadmintel) GetPrerequisites(ctx context.Context, c client.Client, name types.NamespacedName) error {
60-
return errors.New("not implemented")
157+
// GetControlPlaneMachineTemplate gets IntelMachineTemplate for the kubeadmintel provider.
158+
func (k kubeadmintel) GetControlPlaneMachineTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
159+
return c.Get(ctx, types.NamespacedName{Name: name.Name + "-controlplane", Namespace: name.Namespace}, &intelv1alpha1.IntelMachineTemplate{})
160+
}
161+
162+
// GetClusterTemplate gets IntelClusterTemplate for the kubeadmintel provider.
163+
func (k kubeadmintel) GetClusterTemplate(ctx context.Context, c client.Client, name types.NamespacedName) error {
164+
return c.Get(ctx, name, &intelv1alpha1.IntelClusterTemplate{})
61165
}

0 commit comments

Comments
 (0)