Skip to content

Commit 78cf063

Browse files
committed
basic conversion
1 parent 8907c6c commit 78cf063

File tree

3 files changed

+114
-10
lines changed

3 files changed

+114
-10
lines changed

api/gateway-operator/v1beta1/controlplane_types.go

Lines changed: 111 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package v1beta1
1818

1919
import (
2020
"fmt"
21+
"strings"
2122

23+
"github.com/samber/lo"
2224
corev1 "k8s.io/api/core/v1"
2325
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426
"sigs.k8s.io/controller-runtime/pkg/conversion"
@@ -60,7 +62,7 @@ type ControlPlane struct {
6062
// +apireference:kgo:include
6163
type ControlPlaneList struct {
6264
metav1.TypeMeta `json:",inline"`
63-
metav1.ListMeta `json:"metadata,omitempty"`
65+
metav1.ListMeta `json:"metadata"`
6466
Items []ControlPlane `json:"items"`
6567
}
6668

@@ -172,21 +174,124 @@ func (c *ControlPlane) GetExtensions() []commonv1alpha1.ExtensionRef {
172174
return c.Spec.Extensions
173175
}
174176

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+
175223
// ConvertTo converts this ControlPlane (v1beta1) to the Hub version (v2alpha1).
176224
func (c *ControlPlane) ConvertTo(dstRaw conversion.Hub) error {
177225
// Proper type ensured by Kubernetes machinery.
178-
fmt.Println(">> Converting ControlPlane from v1beta1 to v2alpha1")
179226
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
181272

182273
return nil
183274
}
184275

185276
// ConvertFrom converts from the Hub version (v2alpha1) to this version (v1beta1).
186277
func (c *ControlPlane) ConvertFrom(srcRaw conversion.Hub) error {
187278
// 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+
191296
return nil
192297
}

api/gateway-operator/v2alpha1/controlplane_types.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ func init() {
4040
// +kong:channels=gateway-operator
4141
type ControlPlane struct {
4242
metav1.TypeMeta `json:",inline"`
43-
metav1.ObjectMeta `json:"metadata,omitempty"`
43+
metav1.ObjectMeta `json:"metadata"`
4444

4545
// Spec is the specification of the ControlPlane resource.
4646
Spec ControlPlaneSpec `json:"spec,omitempty"`
4747

4848
// Status is the status of the ControlPlane resource.
4949
//
5050
// +optional
51-
Status ControlPlaneStatus `json:"status,omitempty"`
51+
Status ControlPlaneStatus `json:"status"`
5252
}
5353

5454
// ControlPlaneList contains a list of ControlPlane
@@ -57,7 +57,7 @@ type ControlPlane struct {
5757
// +apireference:kgo:include
5858
type ControlPlaneList struct {
5959
metav1.TypeMeta `json:",inline"`
60-
metav1.ListMeta `json:"metadata,omitempty"`
60+
metav1.ListMeta `json:"metadata"`
6161
Items []ControlPlane `json:"items"`
6262
}
6363

api/gateway-operator/v2alpha1/groupversion_info.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
// Package v2alpha1 contains API Schema definitions for the gateway-operator.konghq.com v2alpha1 API group
1817
// +kubebuilder:object:generate=true
1918
// +groupName=gateway-operator.konghq.com
2019
package v2alpha1

0 commit comments

Comments
 (0)