From fb75b1eacd9d7bac180bef70388126645971d537 Mon Sep 17 00:00:00 2001 From: Jordi Fernandez Date: Thu, 4 Dec 2025 10:28:30 +0100 Subject: [PATCH 1/4] feat: add global labels to KongClusterPlugin and update integration tests for Gateway resources --- kong2kic/global_plugin.go | 1 + kong2kic/kong2kic_integration_test.go | 109 ++++++++++++++++-- .../global-plugin-output-expected.yaml | 2 + kong2kic/utils.go | 2 + utils/utils.go | 2 +- 5 files changed, 108 insertions(+), 8 deletions(-) diff --git a/kong2kic/global_plugin.go b/kong2kic/global_plugin.go index 0dfbc6c93..feda9ca71 100644 --- a/kong2kic/global_plugin.go +++ b/kong2kic/global_plugin.go @@ -29,6 +29,7 @@ func populateKICKongClusterPlugins(content *file.Content, file *KICContent) erro kongClusterPlugin.APIVersion = ConfigurationKongHQv1 kongClusterPlugin.Kind = KongClusterPluginKind kongClusterPlugin.Annotations = map[string]string{IngressClass: ClassName} + kongClusterPlugin.Labels = map[string]string{GlobalLabel: GlobalLabelValue} if plugin.Name != nil { kongClusterPlugin.PluginName = *plugin.Name kongClusterPlugin.Name = calculateSlug(*plugin.Name) diff --git a/kong2kic/kong2kic_integration_test.go b/kong2kic/kong2kic_integration_test.go index b6df6a354..4b25132f0 100644 --- a/kong2kic/kong2kic_integration_test.go +++ b/kong2kic/kong2kic_integration_test.go @@ -33,7 +33,7 @@ import ( ) func Test_deployManifests(t *testing.T) { - versions := []string{"2.12", "3.0", "3.1", "3.2", "3.3"} + versions := []string{"2.12", "3.0", "3.1", "3.2", "3.3", "3.4", "3.5"} for _, version := range versions { t.Run("KIC Version "+version, func(t *testing.T) { t.Parallel() @@ -71,13 +71,36 @@ func Test_deployManifests(t *testing.T) { kindToResource, err := getKindToResourceMap(clientset) require.NoError(t, err) - t.Log("creating a dynamic client for Kubernetes resources") - dynamicClient, err := dynamic.NewForConfig(config) - require.NoError(t, err) + t.Log("creating a dynamic client for Kubernetes resources") + dynamicClient, err := dynamic.NewForConfig(config) + require.NoError(t, err) + + t.Log("creating Gateway resource for HTTPRoutes") + gatewayGVR, gatewayClassGVR, err := createGatewayResources(t, dynamicClient, kindToResource) + require.NoError(t, err) + defer func() { + // Delete Gateway first + err := dynamicClient.Resource(gatewayGVR). + Namespace(apiv1.NamespaceDefault). + Delete(context.TODO(), "kong", metav1.DeleteOptions{}) + if err != nil { + t.Logf("failed to delete Gateway: %v", err) + } else { + t.Log("deleted Gateway: kong") + } + // Then delete GatewayClass + err = dynamicClient.Resource(gatewayClassGVR). + Delete(context.TODO(), "kong", metav1.DeleteOptions{}) + if err != nil { + t.Logf("failed to delete GatewayClass: %v", err) + } else { + t.Log("deleted GatewayClass: kong") + } + }() - t.Log("deploying manifests to the cluster") - err = deployManifestsToClusterForVersion(t, dynamicClient, kindToResource, version) - require.NoError(t, err) + t.Log("deploying manifests to the cluster") + err = deployManifestsToClusterForVersion(t, dynamicClient, kindToResource, version) + require.NoError(t, err) }) } } @@ -194,6 +217,78 @@ func deployGatewayAPICRDs(t *testing.T, config *rest.Config) (*clientset.Clients return clientset, nil } +// Helper function to create Gateway and GatewayClass resources +func createGatewayResources( + t *testing.T, + dynamicClient dynamic.Interface, + kindToResource map[string]string, +) (schema.GroupVersionResource, schema.GroupVersionResource, error) { + // Create GatewayClass first + gatewayClassManifest := ` +apiVersion: gateway.networking.k8s.io/v1 +kind: GatewayClass +metadata: + name: kong +spec: + controllerName: konghq.com/kic-gateway-controller +` + gatewayClass := &unstructured.Unstructured{} + err := yaml.Unmarshal([]byte(gatewayClassManifest), gatewayClass) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + + gatewayClassGVR, err := getGroupVersionResource(gatewayClass, kindToResource) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + + _, err = dynamicClient.Resource(gatewayClassGVR). + Create(context.TODO(), gatewayClass, metav1.CreateOptions{}) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + t.Logf("created GatewayClass: %s", gatewayClass.GetName()) + + // Then create Gateway + gatewayManifest := ` +apiVersion: gateway.networking.k8s.io/v1 +kind: Gateway +metadata: + name: kong +spec: + gatewayClassName: kong + listeners: + - name: proxy + port: 80 + protocol: HTTP +` + gateway := &unstructured.Unstructured{} + err = yaml.Unmarshal([]byte(gatewayManifest), gateway) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + + gatewayGVR, err := getGroupVersionResource(gateway, kindToResource) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + + setNamespaceIfNeeded(gateway) + + _, err = dynamicClient.Resource(gatewayGVR). + Namespace(gateway.GetNamespace()). + Create(context.TODO(), gateway, metav1.CreateOptions{}) + if err != nil { + return schema.GroupVersionResource{}, schema.GroupVersionResource{}, err + } + t.Logf("created Gateway: %s in Namespace: %s", gateway.GetName(), gateway.GetNamespace()) + + // Wait for the Gateway to be ready + time.Sleep(5 * time.Second) + return gatewayGVR, gatewayClassGVR, nil +} + // Helper function to get Kind to Resource mapping func getKindToResourceMap(clientset *clientset.Clientset) (map[string]string, error) { kindToResource := make(map[string]string) diff --git a/kong2kic/testdata/global-plugin-output-expected.yaml b/kong2kic/testdata/global-plugin-output-expected.yaml index 2ecdc5fb1..659133a73 100644 --- a/kong2kic/testdata/global-plugin-output-expected.yaml +++ b/kong2kic/testdata/global-plugin-output-expected.yaml @@ -10,6 +10,8 @@ metadata: annotations: konghq.com/tags: cloudops-managed,metrics kubernetes.io/ingress.class: kong + labels: + global: "true" name: prometheus plugin: prometheus --- \ No newline at end of file diff --git a/kong2kic/utils.go b/kong2kic/utils.go index 28be4e350..88f1db4d5 100644 --- a/kong2kic/utils.go +++ b/kong2kic/utils.go @@ -47,6 +47,8 @@ const ( ConfigurationKongHQv1beta1 = "configuration.konghq.com/v1beta1" GatewayAPIVersionV1 = "gateway.networking.k8s.io/v1" GatewayAPIVersionV1Beta1 = "gateway.networking.k8s.io/v1beta1" + GlobalLabel = "global" + GlobalLabelValue = "true" HTTPRouteKind = "HTTPRoute" IngressAPIVersion = "networking.k8s.io/v1" IngressClass = "kubernetes.io/ingress.class" diff --git a/utils/utils.go b/utils/utils.go index a2af55875..9d22080c0 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,4 +1,4 @@ -package utils //nolint:revive +package utils const ( DefaultFormatVersion = "1.1" From d6930fc762a768a526efe3910bdf9e5a8fcab4aa Mon Sep 17 00:00:00 2001 From: Jordi Fernandez Date: Thu, 4 Dec 2025 10:51:17 +0100 Subject: [PATCH 2/4] chore: fix lint issues - remove stray fences and unused nolint directives --- kong2kic/kong2kic_integration_test.go | 14 +++++++------- kong2kic/route.go | 2 +- kong2kic/service.go | 1 - utils/utils.go | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/kong2kic/kong2kic_integration_test.go b/kong2kic/kong2kic_integration_test.go index 4b25132f0..9aef2233c 100644 --- a/kong2kic/kong2kic_integration_test.go +++ b/kong2kic/kong2kic_integration_test.go @@ -71,14 +71,14 @@ func Test_deployManifests(t *testing.T) { kindToResource, err := getKindToResourceMap(clientset) require.NoError(t, err) - t.Log("creating a dynamic client for Kubernetes resources") - dynamicClient, err := dynamic.NewForConfig(config) - require.NoError(t, err) + t.Log("creating a dynamic client for Kubernetes resources") + dynamicClient, err := dynamic.NewForConfig(config) + require.NoError(t, err) - t.Log("creating Gateway resource for HTTPRoutes") - gatewayGVR, gatewayClassGVR, err := createGatewayResources(t, dynamicClient, kindToResource) - require.NoError(t, err) - defer func() { + t.Log("creating Gateway resource for HTTPRoutes") + gatewayGVR, gatewayClassGVR, err := createGatewayResources(t, dynamicClient, kindToResource) + require.NoError(t, err) + defer func() { // Delete Gateway first err := dynamicClient.Resource(gatewayGVR). Namespace(apiv1.NamespaceDefault). diff --git a/kong2kic/route.go b/kong2kic/route.go index b162acc7a..1f71ad577 100644 --- a/kong2kic/route.go +++ b/kong2kic/route.go @@ -352,7 +352,7 @@ func addBackendRefs(httpRoute *k8sgwapiv1.HTTPRoute, service file.FService, rout }, } if service.Port != nil { - portNumber := k8sgwapiv1.PortNumber(*service.Port) //nolint:gosec + portNumber := k8sgwapiv1.PortNumber(*service.Port) backendRef.Port = &portNumber } diff --git a/kong2kic/service.go b/kong2kic/service.go index d82be7b27..6d921dc73 100644 --- a/kong2kic/service.go +++ b/kong2kic/service.go @@ -71,7 +71,6 @@ func createK8sService(service *file.FService, upstreams []file.FUpstream) *k8sco } servicePort := k8scorev1.ServicePort{ Protocol: protocol, - //nolint: gosec Port: int32(*service.Port), TargetPort: intstr.FromInt(*service.Port), } diff --git a/utils/utils.go b/utils/utils.go index 9d22080c0..536353bec 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,6 +1,6 @@ package utils const ( - DefaultFormatVersion = "1.1" - FormatVersion30 = "3.0" +DefaultFormatVersion = "1.1" +FormatVersion30 = "3.0" ) From 0be24ab421c3d657f9c98ea668ef5da0bb5e174f Mon Sep 17 00:00:00 2001 From: Jordi Fernandez Date: Thu, 4 Dec 2025 11:09:13 +0100 Subject: [PATCH 3/4] fix: add nolint directives to suppress lint warnings in integration tests and service definitions --- kong2kic/kong2kic_integration_test.go | 44 +++++++++++++-------------- kong2kic/route.go | 2 +- kong2kic/service.go | 1 + utils/utils.go | 6 ++-- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/kong2kic/kong2kic_integration_test.go b/kong2kic/kong2kic_integration_test.go index 9aef2233c..6f1dc3a19 100644 --- a/kong2kic/kong2kic_integration_test.go +++ b/kong2kic/kong2kic_integration_test.go @@ -79,28 +79,28 @@ func Test_deployManifests(t *testing.T) { gatewayGVR, gatewayClassGVR, err := createGatewayResources(t, dynamicClient, kindToResource) require.NoError(t, err) defer func() { - // Delete Gateway first - err := dynamicClient.Resource(gatewayGVR). - Namespace(apiv1.NamespaceDefault). - Delete(context.TODO(), "kong", metav1.DeleteOptions{}) - if err != nil { - t.Logf("failed to delete Gateway: %v", err) - } else { - t.Log("deleted Gateway: kong") - } - // Then delete GatewayClass - err = dynamicClient.Resource(gatewayClassGVR). - Delete(context.TODO(), "kong", metav1.DeleteOptions{}) - if err != nil { - t.Logf("failed to delete GatewayClass: %v", err) - } else { - t.Log("deleted GatewayClass: kong") - } - }() - - t.Log("deploying manifests to the cluster") - err = deployManifestsToClusterForVersion(t, dynamicClient, kindToResource, version) - require.NoError(t, err) + // Delete Gateway first + err := dynamicClient.Resource(gatewayGVR). + Namespace(apiv1.NamespaceDefault). + Delete(context.TODO(), "kong", metav1.DeleteOptions{}) + if err != nil { + t.Logf("failed to delete Gateway: %v", err) + } else { + t.Log("deleted Gateway: kong") + } + // Then delete GatewayClass + err = dynamicClient.Resource(gatewayClassGVR). + Delete(context.TODO(), "kong", metav1.DeleteOptions{}) + if err != nil { + t.Logf("failed to delete GatewayClass: %v", err) + } else { + t.Log("deleted GatewayClass: kong") + } + }() + + t.Log("deploying manifests to the cluster") + err = deployManifestsToClusterForVersion(t, dynamicClient, kindToResource, version) + require.NoError(t, err) }) } } diff --git a/kong2kic/route.go b/kong2kic/route.go index 1f71ad577..b162acc7a 100644 --- a/kong2kic/route.go +++ b/kong2kic/route.go @@ -352,7 +352,7 @@ func addBackendRefs(httpRoute *k8sgwapiv1.HTTPRoute, service file.FService, rout }, } if service.Port != nil { - portNumber := k8sgwapiv1.PortNumber(*service.Port) + portNumber := k8sgwapiv1.PortNumber(*service.Port) //nolint:gosec backendRef.Port = &portNumber } diff --git a/kong2kic/service.go b/kong2kic/service.go index 6d921dc73..d82be7b27 100644 --- a/kong2kic/service.go +++ b/kong2kic/service.go @@ -71,6 +71,7 @@ func createK8sService(service *file.FService, upstreams []file.FUpstream) *k8sco } servicePort := k8scorev1.ServicePort{ Protocol: protocol, + //nolint: gosec Port: int32(*service.Port), TargetPort: intstr.FromInt(*service.Port), } diff --git a/utils/utils.go b/utils/utils.go index 536353bec..a2af55875 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,6 +1,6 @@ -package utils +package utils //nolint:revive const ( -DefaultFormatVersion = "1.1" -FormatVersion30 = "3.0" + DefaultFormatVersion = "1.1" + FormatVersion30 = "3.0" ) From 1eb44f487ed894df4fc305a7a41a21fd31473c52 Mon Sep 17 00:00:00 2001 From: Jordi Fernandez Date: Thu, 4 Dec 2025 12:16:49 +0100 Subject: [PATCH 4/4] fix: reduce sleep duration in deployGatewayAPICRDs and Gateway readiness checks --- kong2kic/kong2kic_integration_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kong2kic/kong2kic_integration_test.go b/kong2kic/kong2kic_integration_test.go index 6f1dc3a19..3ceb40d21 100644 --- a/kong2kic/kong2kic_integration_test.go +++ b/kong2kic/kong2kic_integration_test.go @@ -213,7 +213,7 @@ func deployGatewayAPICRDs(t *testing.T, config *rest.Config) (*clientset.Clients } // Wait for CRDs to be available - time.Sleep(2 * time.Second) + time.Sleep(1 * time.Second) return clientset, nil } @@ -285,7 +285,7 @@ spec: t.Logf("created Gateway: %s in Namespace: %s", gateway.GetName(), gateway.GetNamespace()) // Wait for the Gateway to be ready - time.Sleep(5 * time.Second) + time.Sleep(1 * time.Second) return gatewayGVR, gatewayClassGVR, nil }