@@ -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,124 @@ 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
+ var (
231
+ fgs []operatorv2alpha1.ControlPlaneFeatureGate
232
+ ctrls []operatorv2alpha1.ControlPlaneController
233
+ )
234
+ if pts := c .Spec .Deployment .PodTemplateSpec ; pts != nil {
235
+ if len (pts .Spec .Containers ) > 0 {
236
+ var err error
237
+ fgs , err = getFeatureGates (c .Spec .Deployment .PodTemplateSpec .Spec .Containers [0 ].Env )
238
+ if err != nil {
239
+ return err
240
+ }
241
+ ctrls , err = getControllers (c .Spec .Deployment .PodTemplateSpec .Spec .Containers [0 ].Env )
242
+ if err != nil {
243
+ return err
244
+ }
245
+ }
246
+ }
247
+
248
+ // Convert Spec
249
+ dst .Spec .ControlPlaneOptions = operatorv2alpha1.ControlPlaneOptions {
250
+ IngressClass : c .Spec .IngressClass ,
251
+ WatchNamespaces : c .Spec .WatchNamespaces ,
252
+ FeatureGates : fgs ,
253
+ Controllers : ctrls ,
254
+ }
255
+ dst .Spec .Extensions = c .Spec .Extensions
256
+
257
+ if dp := lo .FromPtr (c .Spec .DataPlane ); dp != "" {
258
+ dst .Spec .DataPlane = operatorv2alpha1.ControlPlaneDataPlaneTarget {
259
+ Type : operatorv2alpha1 .ControlPlaneDataPlaneTargetRefType ,
260
+ Ref : & operatorv2alpha1.ControlPlaneDataPlaneTargetRef {
261
+ Name : dp ,
262
+ },
263
+ }
264
+ } else {
265
+ dst .Spec .DataPlane = operatorv2alpha1.ControlPlaneDataPlaneTarget {
266
+ Type : operatorv2alpha1 .ControlPlaneDataPlaneTargetManagedByType ,
267
+ }
268
+ }
269
+
270
+ // Convert Status
271
+ dst .Status .Conditions = c .Status .Conditions
181
272
182
273
return nil
183
274
}
184
275
185
276
// ConvertFrom converts from the Hub version (v2alpha1) to this version (v1beta1).
186
277
func (c * ControlPlane ) ConvertFrom (srcRaw conversion.Hub ) error {
187
278
// Proper type ensured by Kubernetes machinery.
188
- fmt .Println (">> Converting ControlPlane from v2alpha1 to v1beta1" )
189
- dst := srcRaw .(* operatorv2alpha1.ControlPlane )
190
- _ = dst
279
+ src := srcRaw .(* operatorv2alpha1.ControlPlane )
280
+
281
+ c .ObjectMeta = src .ObjectMeta
282
+
283
+ // Convert Spec
284
+ c .Spec .IngressClass = src .Spec .IngressClass
285
+ c .Spec .WatchNamespaces = src .Spec .WatchNamespaces
286
+ c .Spec .Extensions = src .Spec .Extensions
287
+
288
+ // Convert DataPlane reference
289
+ if src .Spec .DataPlane .Type == operatorv2alpha1 .ControlPlaneDataPlaneTargetRefType && src .Spec .DataPlane .Ref != nil {
290
+ c .Spec .DataPlane = & src .Spec .DataPlane .Ref .Name
291
+ }
292
+
293
+ // Convert Status
294
+ c .Status .Conditions = src .Status .Conditions
295
+
191
296
return nil
192
297
}
0 commit comments