@@ -2,60 +2,164 @@ package controlplaneprovider
22
33import (
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
1218type kubeadmintel struct {}
1319
1420// AlterClusterClass implements Provider.
1521func (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 .
2991func (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 .
54153func (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