From ef9112f79a6cac1f571a75e70a1f8537f13eafd8 Mon Sep 17 00:00:00 2001 From: Evan Wang Date: Fri, 12 Jun 2026 13:09:49 -0400 Subject: [PATCH] Refactored controller_test.go to use helper functions --- internal/kube/controller/controller_test.go | 396 +++++--------------- internal/utils/skupper_resources.go | 178 +++++++++ 2 files changed, 273 insertions(+), 301 deletions(-) create mode 100644 internal/utils/skupper_resources.go diff --git a/internal/kube/controller/controller_test.go b/internal/kube/controller/controller_test.go index 704ee5a7a..9b609a398 100644 --- a/internal/kube/controller/controller_test.go +++ b/internal/kube/controller/controller_test.go @@ -1044,182 +1044,82 @@ func (*factory) addUID(site *skupperv2alpha1.Site, uid string) *skupperv2alpha1. } func (*factory) site(name string, namespace string, linkAccess string, ha bool, edge bool) *skupperv2alpha1.Site { - return &skupperv2alpha1.Site{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Site", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.SiteSpec{ - HA: ha, - LinkAccess: linkAccess, - Edge: edge, - }, - } + s := utils.NewSite(name, namespace) + s.Spec.HA = ha + s.Spec.LinkAccess = linkAccess + s.Spec.Edge = edge + return s } func (*factory) listener(name string, namespace string, host string, port int) *skupperv2alpha1.Listener { - return &skupperv2alpha1.Listener{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Listener", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.ListenerSpec{ - Host: host, - Port: port, - }, - } + l := utils.NewListener(name, namespace) + l.Spec.Host = host + l.Spec.Port = port + return l } func (*factory) multiKeyListener(name string, namespace string, host string, port int) *skupperv2alpha1.MultiKeyListener { - return &skupperv2alpha1.MultiKeyListener{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "MultiKeyListener", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.MultiKeyListenerSpec{ - Host: host, - Port: port, - Strategy: skupperv2alpha1.MultiKeyListenerStrategy{ - Priority: &skupperv2alpha1.PriorityStrategySpec{ - RoutingKeys: []string{"key-a", "key-b"}, - }, - }, + l := utils.NewMultiKeyListener(name, namespace) + l.Spec.Host = host + l.Spec.Port = port + l.Spec.Strategy = skupperv2alpha1.MultiKeyListenerStrategy{ + Priority: &skupperv2alpha1.PriorityStrategySpec{ + RoutingKeys: []string{"key-a", "key-b"}, }, } + return l } func (*factory) connector(name string, namespace string, host string, port int) *skupperv2alpha1.Connector { - return &skupperv2alpha1.Connector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Connector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.ConnectorSpec{ - Host: host, - Port: port, - }, - } + c := utils.NewConnector(name, namespace) + c.Spec.Host = host + c.Spec.Port = port + return c } func (*factory) connectorWithSelector(name string, namespace string, selector string, port int) *skupperv2alpha1.Connector { - return &skupperv2alpha1.Connector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Connector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.ConnectorSpec{ - Selector: selector, - Port: port, - }, - } + c := utils.NewConnector(name, namespace) + c.Spec.Selector = selector + c.Spec.Port = port + return c } func (*factory) listenerWithExposePodsByName(name string, namespace string, key string, host string, port int) *skupperv2alpha1.Listener { - return &skupperv2alpha1.Listener{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Listener", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.ListenerSpec{ - Host: host, - Port: port, - ExposePodsByName: true, - RoutingKey: key, - }, - } + l := utils.NewListener(name, namespace) + l.Spec.Host = host + l.Spec.Port = port + l.Spec.ExposePodsByName = true + l.Spec.RoutingKey = key + return l } func (*factory) connectorWithExposePodsByName(name string, namespace string, key string, selector string, port int) *skupperv2alpha1.Connector { - return &skupperv2alpha1.Connector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Connector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.ConnectorSpec{ - Selector: selector, - Port: port, - ExposePodsByName: true, - RoutingKey: key, - }, - } + c := utils.NewConnector(name, namespace) + c.Spec.ExposePodsByName = true + c.Spec.RoutingKey = key + c.Spec.Selector = selector + c.Spec.Port = port + return c } func (*factory) attachedConnector(name string, namespace string, siteNamespace string, selector string, port int) *skupperv2alpha1.AttachedConnector { - return &skupperv2alpha1.AttachedConnector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "AttachedConnector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.AttachedConnectorSpec{ - SiteNamespace: siteNamespace, - Selector: selector, - Port: port, - }, - } + c := utils.NewAttachedConnector(name, namespace) + c.Spec.SiteNamespace = siteNamespace + c.Spec.Selector = selector + c.Spec.Port = port + return c } func (*factory) attachedConnectorBinding(name string, namespace string, connectorNamespace string) *skupperv2alpha1.AttachedConnectorBinding { - return &skupperv2alpha1.AttachedConnectorBinding{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "AttachedConnectorBinding", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.AttachedConnectorBindingSpec{ - ConnectorNamespace: connectorNamespace, - }, - } + b := utils.NewAttachedConnectorBinding(name, namespace) + b.Spec.ConnectorNamespace = connectorNamespace + return b } func (*factory) siteStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.Site { - return &skupperv2alpha1.Site{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Site", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.SiteStatus{ - Status: f.status(statusType, message, conditions...), - }, - } + s := utils.NewSite(name, namespace) + s.Status.Status = utils.NewStatus(statusType, message, conditions...) + return s } func (*factory) addControllerToStatus(site *skupperv2alpha1.Site, name string, namespace string) *skupperv2alpha1.Site { @@ -1232,102 +1132,39 @@ func (*factory) addControllerToStatus(site *skupperv2alpha1.Site, name string, n } func (*factory) listenerStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.Listener { - return &skupperv2alpha1.Listener{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Listener", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.ListenerStatus{ - Status: f.status(statusType, message, conditions...), - }, - } + l := utils.NewListener(name, namespace) + l.Status.Status = utils.NewStatus(statusType, message, conditions...) + return l } func (*factory) multiKeyListenerStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.MultiKeyListener { - return &skupperv2alpha1.MultiKeyListener{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "MultiKeyListener", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.MultiKeyListenerStatus{ - StatusType: statusType, - Message: message, - Conditions: conditions, - }, - } + l := utils.NewMultiKeyListener(name, namespace) + l.Status.StatusType = statusType + l.Status.Message = message + l.Status.Conditions = conditions + return l } func (*factory) connectorStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.Connector { - return &skupperv2alpha1.Connector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "Connector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.ConnectorStatus{ - Status: f.status(statusType, message, conditions...), - }, - } + c := utils.NewConnector(name, namespace) + c.Status.Status = utils.NewStatus(statusType, message, conditions...) + return c } func (*factory) attachedConnectorStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.AttachedConnector { - return &skupperv2alpha1.AttachedConnector{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "AttachedConnector", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.AttachedConnectorStatus{ - Status: f.status(statusType, message, conditions...), - }, - } + c := utils.NewAttachedConnector(name, namespace) + c.Status.Status = utils.NewStatus(statusType, message, conditions...) + return c } func (*factory) attachedConnectorBindingStatus(name string, namespace string, statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) *skupperv2alpha1.AttachedConnectorBinding { - return &skupperv2alpha1.AttachedConnectorBinding{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "AttachedConnectorBinding", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Status: skupperv2alpha1.AttachedConnectorBindingStatus{ - Status: f.status(statusType, message, conditions...), - }, - } -} - -func (*factory) status(statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) skupperv2alpha1.Status { - return skupperv2alpha1.Status{ - StatusType: statusType, - Message: message, - Conditions: conditions, - } + b := utils.NewAttachedConnectorBinding(name, namespace) + b.Status.Status = utils.NewStatus(statusType, message, conditions...) + return b } func (*factory) condition(conditionType string, status metav1.ConditionStatus, reason string, message string) metav1.Condition { - return metav1.Condition{ - Type: conditionType, - Status: status, - Reason: reason, - Message: message, - } + return utils.NewCondition(conditionType, status, reason, message) } func (*factory) routerSelector(application bool) map[string]string { @@ -1517,23 +1354,13 @@ func (*factory) unstructured(name string, namespace string, content map[string]i } func (*factory) routerAccess(name string, namespace string, accessType string, credentials string, generate bool, issuer string, roles ...skupperv2alpha1.RouterAccessRole) *skupperv2alpha1.RouterAccess { - return &skupperv2alpha1.RouterAccess{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "RouterAccess", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.RouterAccessSpec{ - AccessType: accessType, - TlsCredentials: credentials, - GenerateTlsCredentials: generate, - Issuer: issuer, - Roles: roles, - }, - } + ra := utils.NewRouterAccess(name, namespace) + ra.Spec.AccessType = accessType + ra.Spec.TlsCredentials = credentials + ra.Spec.GenerateTlsCredentials = generate + ra.Spec.Issuer = issuer + ra.Spec.Roles = roles + return ra } func (*factory) role(name string, port int) skupperv2alpha1.RouterAccessRole { @@ -1544,23 +1371,13 @@ func (*factory) role(name string, port int) skupperv2alpha1.RouterAccessRole { } func (*factory) securedAccess(name string, namespace string, accessType string, selector map[string]string, certificate string, issuer string, ports ...skupperv2alpha1.SecuredAccessPort) *skupperv2alpha1.SecuredAccess { - return &skupperv2alpha1.SecuredAccess{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "skupper.io/v2alpha1", - Kind: "SecuredAccess", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: skupperv2alpha1.SecuredAccessSpec{ - AccessType: accessType, - Selector: selector, - Certificate: certificate, - Issuer: issuer, - Ports: ports, - }, - } + sa := utils.NewSecuredAccess(name, namespace) + sa.Spec.AccessType = accessType + sa.Spec.Selector = selector + sa.Spec.Certificate = certificate + sa.Spec.Issuer = issuer + sa.Spec.Ports = ports + return sa } func (*factory) securedAccessPort(name string, port int) skupperv2alpha1.SecuredAccessPort { @@ -1573,16 +1390,10 @@ func (*factory) securedAccessPort(name string, port int) skupperv2alpha1.Secured } func (*factory) service(name string, namespace string, selector map[string]string, ports ...corev1.ServicePort) *corev1.Service { - return &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: corev1.ServiceSpec{ - Selector: selector, - Ports: ports, - }, - } + s := utils.NewService(name, namespace) + s.Spec.Selector = selector + s.Spec.Ports = ports + return s } func (*factory) serviceWithMetadata(svc *corev1.Service, labels map[string]string, annotations map[string]string) *corev1.Service { @@ -1611,18 +1422,9 @@ func (*factory) servicePortU(name string, port int32) corev1.ServicePort { } func (*factory) pod(name string, namespace string, labels map[string]string, ownerRefs []metav1.OwnerReference, status *corev1.PodStatus) *corev1.Pod { - pod := &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "Pod", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: labels, - OwnerReferences: ownerRefs, - }, - } + pod := utils.NewPod(name, namespace) + pod.ObjectMeta.Labels = labels + pod.ObjectMeta.OwnerReferences = ownerRefs if status != nil { pod.Status = *status } @@ -1652,15 +1454,11 @@ func (*factory) addNetworkStatus(site *skupperv2alpha1.Site, status *NetworkStat func (*factory) skupperNetworkStatus(namespace string, status *network.NetworkStatusInfo) *corev1.ConfigMap { data, _ := json.Marshal(status) - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "skupper-network-status", - Namespace: namespace, - }, - Data: map[string]string{ - "NetworkStatus": string(data), - }, + cm := utils.NewConfigMap("skupper-network-status", namespace) + cm.Data = map[string]string{ + "NetworkStatus": string(data), } + return cm } func (*factory) siteSizing(name string, namespace string, data map[string]string) *corev1.ConfigMap { @@ -1680,15 +1478,11 @@ func (*factory) siteSizing(name string, namespace string, data map[string]string } func (*factory) configmap(name string, namespace string, data map[string]string, labels map[string]string, annotations map[string]string) *corev1.ConfigMap { - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: labels, - Annotations: annotations, - }, - Data: data, - } + cm := utils.NewConfigMap(name, namespace) + cm.ObjectMeta.Labels = labels + cm.ObjectMeta.Annotations = annotations + cm.Data = data + return cm } func (f *factory) fakeNetworkStatusInfo(namespace string) *NetworkStatus { diff --git a/internal/utils/skupper_resources.go b/internal/utils/skupper_resources.go new file mode 100644 index 000000000..3f99dc118 --- /dev/null +++ b/internal/utils/skupper_resources.go @@ -0,0 +1,178 @@ +package utils + +import ( + skupperv2alpha1 "github.com/skupperproject/skupper/pkg/apis/skupper/v2alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func NewStatus(statusType skupperv2alpha1.StatusType, message string, conditions ...metav1.Condition) skupperv2alpha1.Status { + return skupperv2alpha1.Status{ + StatusType: statusType, + Message: message, + Conditions: conditions, + } +} + +func NewCondition(conditionType string, status metav1.ConditionStatus, reason string, message string) metav1.Condition { + return metav1.Condition{ + Type: conditionType, + Status: status, + Reason: reason, + Message: message, + LastTransitionTime: metav1.Now(), + } +} + +func NewPod(name string, namespace string) *corev1.Pod { + return &corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Pod", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewService(name string, namespace string) *corev1.Service { + return &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewServicePort(name string, port int32, targetPort int32) corev1.ServicePort { + return corev1.ServicePort{ + Name: name, + Port: port, + TargetPort: intstr.FromInt32(targetPort), + Protocol: corev1.ProtocolTCP, + } +} + +func NewConfigMap(name string, namespace string) *corev1.ConfigMap { + return &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewListener(name, namespace string) *skupperv2alpha1.Listener { + return &skupperv2alpha1.Listener{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "Listener", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewSite(name string, namespace string) *skupperv2alpha1.Site { + return &skupperv2alpha1.Site{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "Site", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewConnector(name string, namespace string) *skupperv2alpha1.Connector { + return &skupperv2alpha1.Connector{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "Connector", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewAttachedConnector(name string, namespace string) *skupperv2alpha1.AttachedConnector { + return &skupperv2alpha1.AttachedConnector{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "AttachedConnector", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewAttachedConnectorBinding(name string, namespace string) *skupperv2alpha1.AttachedConnectorBinding { + return &skupperv2alpha1.AttachedConnectorBinding{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "AttachedConnectorBinding", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewMultiKeyListener(name string, namespace string) *skupperv2alpha1.MultiKeyListener { + return &skupperv2alpha1.MultiKeyListener{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "MultiKeyListener", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewRouterAccess(name string, namespace string) *skupperv2alpha1.RouterAccess { + return &skupperv2alpha1.RouterAccess{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "RouterAccess", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +} + +func NewSecuredAccess(name string, namespace string) *skupperv2alpha1.SecuredAccess { + return &skupperv2alpha1.SecuredAccess{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "skupper.io/v2alpha1", + Kind: "SecuredAccess", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + } +}