@@ -18,7 +18,9 @@ package v1beta1
18
18
19
19
import (
20
20
"fmt"
21
+ "strings"
21
22
23
+ "github.com/samber/lo"
22
24
corev1 "k8s.io/api/core/v1"
23
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24
26
"sigs.k8s.io/controller-runtime/pkg/conversion"
@@ -60,7 +62,7 @@ type ControlPlane struct {
60
62
// +apireference:kgo:include
61
63
type ControlPlaneList struct {
62
64
metav1.TypeMeta `json:",inline"`
63
- metav1.ListMeta `json:"metadata,omitempty "`
65
+ metav1.ListMeta `json:"metadata"`
64
66
Items []ControlPlane `json:"items"`
65
67
}
66
68
@@ -172,21 +174,115 @@ func (c *ControlPlane) GetExtensions() []commonv1alpha1.ExtensionRef {
172
174
return c .Spec .Extensions
173
175
}
174
176
177
+ func getFeatureGates (envs []corev1.EnvVar ) ([]operatorv2alpha1.ControlPlaneFeatureGate , error ) {
178
+ fg , _ := lo .Find (envs , func (fg corev1.EnvVar ) bool {
179
+ return fg .Name == "CONTROLLER_FEATURE_GATES"
180
+ })
181
+
182
+ parts := strings .Split (fg .Value , "," )
183
+ featureGates := make ([]operatorv2alpha1.ControlPlaneFeatureGate , 0 , len (parts ))
184
+ for _ , part := range parts {
185
+ part = strings .TrimSpace (part )
186
+ if part == "" {
187
+ continue
188
+ }
189
+ parts := strings .Split (part , "=" )
190
+ if len (parts ) != 2 {
191
+ continue
192
+ }
193
+ key , value := strings .TrimSpace (parts [0 ]), strings .TrimSpace (parts [1 ])
194
+ if key == "" || value == "" {
195
+ continue
196
+ }
197
+ var state operatorv2alpha1.FeatureGateState
198
+ switch strings .ToLower (value ) {
199
+ case "true" :
200
+ state = operatorv2alpha1 .FeatureGateStateEnabled
201
+ case "false" :
202
+ state = operatorv2alpha1 .FeatureGateStateDisabled
203
+ default :
204
+ return nil , fmt .Errorf ("invalid value for feature gate %q: %q, expected 'true' or 'false'" , key , value )
205
+ }
206
+ featureGates = append (featureGates , operatorv2alpha1.ControlPlaneFeatureGate {
207
+ Name : key ,
208
+ State : state ,
209
+ })
210
+ }
211
+ return featureGates , nil
212
+ }
213
+
214
+ func getControllers (envs []corev1.EnvVar ) ([]operatorv2alpha1.ControlPlaneController , error ) { //nolint:unparam
215
+ controllersEnvs := lo .Filter (envs , func (env corev1.EnvVar , _ int ) bool {
216
+ return strings .HasPrefix (env .Name , "CONTROLLER_" ) && strings .HasSuffix (env .Name , "_ENABLED" )
217
+ })
218
+ _ = controllersEnvs
219
+ //TODO:
220
+ return nil , nil
221
+ }
222
+
175
223
// ConvertTo converts this ControlPlane (v1beta1) to the Hub version (v2alpha1).
176
224
func (c * ControlPlane ) ConvertTo (dstRaw conversion.Hub ) error {
177
225
// Proper type ensured by Kubernetes machinery.
178
- fmt .Println (">> Converting ControlPlane from v1beta1 to v2alpha1" )
179
226
dst := dstRaw .(* operatorv2alpha1.ControlPlane )
180
- _ = dst
227
+
228
+ dst .ObjectMeta = c .ObjectMeta
229
+
230
+ fgs , err := getFeatureGates (c .Spec .Deployment .PodTemplateSpec .Spec .Containers [0 ].Env )
231
+ if err != nil {
232
+ return err
233
+ }
234
+ ctrls , err := getControllers (c .Spec .Deployment .PodTemplateSpec .Spec .Containers [0 ].Env )
235
+ if err != nil {
236
+ return err
237
+ }
238
+
239
+ // Convert Spec
240
+ dst .Spec .ControlPlaneOptions = operatorv2alpha1.ControlPlaneOptions {
241
+ IngressClass : c .Spec .IngressClass ,
242
+ WatchNamespaces : c .Spec .WatchNamespaces ,
243
+ FeatureGates : fgs ,
244
+ Controllers : ctrls ,
245
+ }
246
+ dst .Spec .Extensions = c .Spec .Extensions
247
+
248
+ if dp := lo .FromPtr (c .Spec .DataPlane ); dp != "" {
249
+ dst .Spec .DataPlane = operatorv2alpha1.ControlPlaneDataPlaneTarget {
250
+ Type : operatorv2alpha1 .ControlPlaneDataPlaneTargetRefType ,
251
+ Ref : & operatorv2alpha1.ControlPlaneDataPlaneTargetRef {
252
+ Name : dp ,
253
+ },
254
+ }
255
+ } else {
256
+ dst .Spec .DataPlane = operatorv2alpha1.ControlPlaneDataPlaneTarget {
257
+ Type : operatorv2alpha1 .ControlPlaneDataPlaneTargetManagedByType ,
258
+ }
259
+ }
260
+
261
+ // Convert Status
262
+ dst .Status .Conditions = c .Status .Conditions
181
263
182
264
return nil
183
265
}
184
266
185
267
// ConvertFrom converts from the Hub version (v2alpha1) to this version (v1beta1).
186
268
func (c * ControlPlane ) ConvertFrom (srcRaw conversion.Hub ) error {
187
269
// Proper type ensured by Kubernetes machinery.
188
- fmt .Println (">> Converting ControlPlane from v2alpha1 to v1beta1" )
189
- dst := srcRaw .(* operatorv2alpha1.ControlPlane )
190
- _ = dst
270
+ src := srcRaw .(* operatorv2alpha1.ControlPlane )
271
+
272
+ c .ObjectMeta = src .ObjectMeta
273
+
274
+ // Convert Spec
275
+ c .Spec .IngressClass = src .Spec .IngressClass
276
+ c .Spec .WatchNamespaces = src .Spec .WatchNamespaces
277
+ c .Spec .Extensions = src .Spec .Extensions
278
+
279
+ // Convert DataPlane reference
280
+ if src .Spec .DataPlane .Type == operatorv2alpha1 .ControlPlaneDataPlaneTargetRefType && src .Spec .DataPlane .Ref != nil {
281
+ c .Spec .DataPlane = & src .Spec .DataPlane .Ref .Name
282
+ }
283
+
284
+ // Convert Status
285
+ c .Status .Conditions = src .Status .Conditions
286
+
191
287
return nil
192
288
}
0 commit comments