diff --git a/internal/cmd/egctl/testdata/translate/out/backend-endpoint.all.yaml b/internal/cmd/egctl/testdata/translate/out/backend-endpoint.all.yaml index a4a50d9e86..e9816d3458 100644 --- a/internal/cmd/egctl/testdata/translate/out/backend-endpoint.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/backend-endpoint.all.yaml @@ -1,5 +1,6 @@ backendTLSPolicies: -- kind: BackendTLSPolicy +- apiVersion: gateway.networking.k8s.io/v1alpha3 + kind: BackendTLSPolicy metadata: creationTimestamp: null name: example-com-tls-policy @@ -26,7 +27,8 @@ backendTLSPolicies: type: Accepted controllerName: gateway.envoyproxy.io/gatewayclass-controller backends: -- kind: Backend +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: Backend metadata: creationTimestamp: null name: backend @@ -45,7 +47,8 @@ backends: status: "True" type: Accepted envoyExtensionPolicies: -- kind: EnvoyExtensionPolicy +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: EnvoyExtensionPolicy metadata: creationTimestamp: null name: ext-proc-example @@ -82,6 +85,7 @@ envoyExtensionPolicies: type: Accepted controllerName: gateway.envoyproxy.io/gatewayclass-controller gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -96,7 +100,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -136,7 +141,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/default-namespace.all.yaml b/internal/cmd/egctl/testdata/translate/out/default-namespace.all.yaml index be03058a57..28520ce31f 100644 --- a/internal/cmd/egctl/testdata/translate/out/default-namespace.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/default-namespace.all.yaml @@ -1,5 +1,6 @@ backends: -- kind: Backend +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: Backend metadata: creationTimestamp: null name: backend @@ -18,6 +19,7 @@ backends: status: "True" type: Accepted gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -32,7 +34,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -72,7 +75,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/default-resources.all.yaml b/internal/cmd/egctl/testdata/translate/out/default-resources.all.yaml index ae9d9a5f5a..cb7f656639 100644 --- a/internal/cmd/egctl/testdata/translate/out/default-resources.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/default-resources.all.yaml @@ -1,4 +1,6 @@ envoyProxyForGatewayClass: + apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: EnvoyProxy metadata: creationTimestamp: null name: default-envoy-proxy @@ -176,6 +178,7 @@ envoyProxyForGatewayClass: logging: {} status: {} gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -195,7 +198,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -350,7 +354,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute grpcRoutes: -- kind: GRPCRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: GRPCRoute metadata: creationTimestamp: null name: backend @@ -395,7 +400,8 @@ grpcRoutes: name: eg sectionName: grpc httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend @@ -437,7 +443,8 @@ httpRoutes: kind: Gateway name: eg tcpRoutes: -- kind: TCPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TCPRoute metadata: creationTimestamp: null name: backend @@ -475,7 +482,8 @@ tcpRoutes: name: eg sectionName: tcp tlsRoutes: -- kind: TLSRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TLSRoute metadata: creationTimestamp: null name: backend @@ -513,7 +521,8 @@ tlsRoutes: name: eg sectionName: tls-passthrough udpRoutes: -- kind: UDPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: UDPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.cluster.yaml b/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.cluster.yaml index f7ee047801..d04f71dc7c 100644 --- a/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.cluster.yaml +++ b/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.cluster.yaml @@ -1,4 +1,5 @@ gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -13,7 +14,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -53,7 +55,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.route.json b/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.route.json index dc69ded7bd..5d8d8bf1ea 100644 --- a/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.route.json +++ b/internal/cmd/egctl/testdata/translate/out/echo-gateway-api.route.json @@ -1,6 +1,7 @@ { "gatewayClass": { "kind": "GatewayClass", + "apiVersion": "gateway.networking.k8s.io/v1", "metadata": { "name": "eg", "creationTimestamp": null @@ -23,6 +24,7 @@ "gateways": [ { "kind": "Gateway", + "apiVersion": "gateway.networking.k8s.io/v1", "metadata": { "name": "eg", "namespace": "envoy-gateway-system", @@ -89,6 +91,7 @@ "httpRoutes": [ { "kind": "HTTPRoute", + "apiVersion": "gateway.networking.k8s.io/v1", "metadata": { "name": "backend", "namespace": "envoy-gateway-system", diff --git a/internal/cmd/egctl/testdata/translate/out/invalid-envoyproxy.all.yaml b/internal/cmd/egctl/testdata/translate/out/invalid-envoyproxy.all.yaml index 5131313557..7fe4d68370 100644 --- a/internal/cmd/egctl/testdata/translate/out/invalid-envoyproxy.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/invalid-envoyproxy.all.yaml @@ -1,4 +1,5 @@ envoyProxyForGatewayClass: + apiVersion: gateway.envoyproxy.io/v1alpha1 kind: EnvoyProxy metadata: creationTimestamp: null @@ -23,6 +24,7 @@ envoyProxyForGatewayClass: default: warn status: {} gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -42,7 +44,8 @@ gatewayClass: status: "False" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -197,7 +200,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute grpcRoutes: -- kind: GRPCRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: GRPCRoute metadata: creationTimestamp: null name: backend @@ -242,7 +246,8 @@ grpcRoutes: name: eg sectionName: grpc httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend @@ -284,7 +289,8 @@ httpRoutes: kind: Gateway name: eg tcpRoutes: -- kind: TCPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TCPRoute metadata: creationTimestamp: null name: backend @@ -322,7 +328,8 @@ tcpRoutes: name: eg sectionName: tcp tlsRoutes: -- kind: TLSRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TLSRoute metadata: creationTimestamp: null name: backend @@ -360,7 +367,8 @@ tlsRoutes: name: eg sectionName: tls-passthrough udpRoutes: -- kind: UDPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: UDPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/quickstart.all.yaml b/internal/cmd/egctl/testdata/translate/out/quickstart.all.yaml index e456e3a234..f0de18e42f 100644 --- a/internal/cmd/egctl/testdata/translate/out/quickstart.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/quickstart.all.yaml @@ -1,5 +1,6 @@ gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -39,7 +40,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/rejected-http-route.route.yaml b/internal/cmd/egctl/testdata/translate/out/rejected-http-route.route.yaml index 4749934fd2..0f56e88d30 100644 --- a/internal/cmd/egctl/testdata/translate/out/rejected-http-route.route.yaml +++ b/internal/cmd/egctl/testdata/translate/out/rejected-http-route.route.yaml @@ -1,4 +1,5 @@ gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -13,7 +14,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -48,7 +50,8 @@ gateways: - group: gateway.networking.k8s.io kind: TLSRoute httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/cmd/egctl/testdata/translate/out/valid-envoyproxy.all.yaml b/internal/cmd/egctl/testdata/translate/out/valid-envoyproxy.all.yaml index 182d48f306..c798702335 100644 --- a/internal/cmd/egctl/testdata/translate/out/valid-envoyproxy.all.yaml +++ b/internal/cmd/egctl/testdata/translate/out/valid-envoyproxy.all.yaml @@ -1,4 +1,5 @@ envoyProxyForGatewayClass: + apiVersion: gateway.envoyproxy.io/v1alpha1 kind: EnvoyProxy metadata: creationTimestamp: null @@ -18,6 +19,7 @@ envoyProxyForGatewayClass: type: Kubernetes status: {} gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -37,7 +39,8 @@ gatewayClass: status: "True" type: Accepted gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -192,7 +195,8 @@ gateways: - group: gateway.networking.k8s.io kind: GRPCRoute grpcRoutes: -- kind: GRPCRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: GRPCRoute metadata: creationTimestamp: null name: backend @@ -237,7 +241,8 @@ grpcRoutes: name: eg sectionName: grpc httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend @@ -279,7 +284,8 @@ httpRoutes: kind: Gateway name: eg tcpRoutes: -- kind: TCPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TCPRoute metadata: creationTimestamp: null name: backend @@ -317,7 +323,8 @@ tcpRoutes: name: eg sectionName: tcp tlsRoutes: -- kind: TLSRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TLSRoute metadata: creationTimestamp: null name: backend @@ -355,7 +362,8 @@ tlsRoutes: name: eg sectionName: tls-passthrough udpRoutes: -- kind: UDPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: UDPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/gatewayapi/resource/load.go b/internal/gatewayapi/resource/load.go index a176849393..47e6367c51 100644 --- a/internal/gatewayapi/resource/load.go +++ b/internal/gatewayapi/resource/load.go @@ -22,6 +22,7 @@ import ( gwapiv1 "sigs.k8s.io/gateway-api/apis/v1" gwapiv1a2 "sigs.k8s.io/gateway-api/apis/v1alpha2" gwapiv1a3 "sigs.k8s.io/gateway-api/apis/v1alpha3" + gwapiv1b1 "sigs.k8s.io/gateway-api/apis/v1beta1" "sigs.k8s.io/yaml" egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1" @@ -45,9 +46,6 @@ func LoadResourcesFromYAMLBytes(yamlBytes []byte, addMissingResources bool) (*Re } // loadKubernetesYAMLToResources converts a Kubernetes YAML string into GatewayAPI Resources. -// TODO: add support for kind: -// - BackendLPPolicy (gateway.networking.k8s.io/v1alpha2) -// - ReferenceGrant (gateway.networking.k8s.io/v1alpha2) func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Resources, error) { resources := NewResources() var useDefaultNamespace bool @@ -92,6 +90,7 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res return err } + gv := gvk.GroupVersion().String() objType := reflect.TypeOf(kobj) if objType.Kind() != reflect.Ptr { return fmt.Errorf("expected pointer type, but got %s", objType.Kind().String()) @@ -106,7 +105,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() envoyProxy := &egv1a1.EnvoyProxy{ TypeMeta: metav1.TypeMeta{ - Kind: KindEnvoyProxy, + Kind: KindEnvoyProxy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -120,7 +120,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() gatewayClass := &gwapiv1.GatewayClass{ TypeMeta: metav1.TypeMeta{ - Kind: KindGatewayClass, + Kind: KindGatewayClass, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -137,7 +138,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() gateway := &gwapiv1.Gateway{ TypeMeta: metav1.TypeMeta{ - Kind: KindGateway, + Kind: KindGateway, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -150,7 +152,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() tcpRoute := &gwapiv1a2.TCPRoute{ TypeMeta: metav1.TypeMeta{ - Kind: KindTCPRoute, + Kind: KindTCPRoute, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -163,7 +166,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() udpRoute := &gwapiv1a2.UDPRoute{ TypeMeta: metav1.TypeMeta{ - Kind: KindUDPRoute, + Kind: KindUDPRoute, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -176,7 +180,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() tlsRoute := &gwapiv1a2.TLSRoute{ TypeMeta: metav1.TypeMeta{ - Kind: KindTLSRoute, + Kind: KindTLSRoute, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -189,7 +194,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() httpRoute := &gwapiv1.HTTPRoute{ TypeMeta: metav1.TypeMeta{ - Kind: KindHTTPRoute, + Kind: KindHTTPRoute, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -202,7 +208,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() grpcRoute := &gwapiv1.GRPCRoute{ TypeMeta: metav1.TypeMeta{ - Kind: KindGRPCRoute, + Kind: KindGRPCRoute, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -213,6 +220,10 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res resources.GRPCRoutes = append(resources.GRPCRoutes, grpcRoute) case KindNamespace: namespace := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + Kind: KindNamespace, + APIVersion: gv, + }, ObjectMeta: metav1.ObjectMeta{ Name: name, }, @@ -222,6 +233,10 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res case KindService: typedSpec := spec.Interface() service := &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: KindService, + APIVersion: gv, + }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, @@ -237,7 +252,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() envoyPatchPolicy := &egv1a1.EnvoyPatchPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: egv1a1.KindEnvoyPatchPolicy, + Kind: egv1a1.KindEnvoyPatchPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -250,7 +266,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() clientTrafficPolicy := &egv1a1.ClientTrafficPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: KindClientTrafficPolicy, + Kind: KindClientTrafficPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -263,7 +280,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() backendTrafficPolicy := &egv1a1.BackendTrafficPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: KindBackendTrafficPolicy, + Kind: KindBackendTrafficPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -276,7 +294,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() securityPolicy := &egv1a1.SecurityPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: KindSecurityPolicy, + Kind: KindSecurityPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -290,7 +309,7 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res httpRouteFilter := &egv1a1.HTTPRouteFilter{ TypeMeta: metav1.TypeMeta{ Kind: KindHTTPRouteFilter, - APIVersion: egv1a1.GroupVersion.String(), + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, @@ -303,7 +322,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() backend := &egv1a1.Backend{ TypeMeta: metav1.TypeMeta{ - Kind: KindBackend, + Kind: KindBackend, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -319,7 +339,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res secret := &corev1.Secret{ TypeMeta: metav1.TypeMeta{ - Kind: KindSecret, + Kind: KindSecret, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -334,7 +355,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedData := data.Interface() configMap := &corev1.ConfigMap{ TypeMeta: metav1.TypeMeta{ - Kind: KindConfigMap, + Kind: KindConfigMap, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -347,7 +369,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() backendTLSPolicy := &gwapiv1a3.BackendTLSPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: KindBackendTLSPolicy, + Kind: KindBackendTLSPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -360,7 +383,8 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res typedSpec := spec.Interface() envoyExtensionPolicy := &egv1a1.EnvoyExtensionPolicy{ TypeMeta: metav1.TypeMeta{ - Kind: KindEnvoyExtensionPolicy, + Kind: KindEnvoyExtensionPolicy, + APIVersion: gv, }, ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -369,6 +393,20 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res Spec: typedSpec.(egv1a1.EnvoyExtensionPolicySpec), } resources.EnvoyExtensionPolicies = append(resources.EnvoyExtensionPolicies, envoyExtensionPolicy) + case KindReferenceGrant: + typedSpec := spec.Interface() + referenceGrant := &gwapiv1b1.ReferenceGrant{ + TypeMeta: metav1.TypeMeta{ + Kind: KindReferenceGrant, + APIVersion: gv, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Spec: typedSpec.(gwapiv1b1.ReferenceGrantSpec), + } + resources.ReferenceGrants = append(resources.ReferenceGrants, referenceGrant) } return nil @@ -378,11 +416,16 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res // The namespace will not be treated as the missing resources in order to improve the user experience // when using the file provider, since namespaces are crucial but easily overlooked. + corev1gv := corev1.SchemeGroupVersion.String() // Add user provided and resource required namespaces. if useDefaultNamespace { if !providedNamespaceMap.Has(config.DefaultNamespace) { namespace := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + Kind: KindNamespace, + APIVersion: corev1gv, + }, ObjectMeta: metav1.ObjectMeta{ Name: config.DefaultNamespace, }, @@ -397,6 +440,10 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res for _, ns := range sortedRequiredNamespace { if !providedNamespaceMap.Has(ns) { namespace := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + Kind: KindNamespace, + APIVersion: corev1gv, + }, ObjectMeta: metav1.ObjectMeta{ Name: ns, }, @@ -473,6 +520,7 @@ func loadKubernetesYAMLToResources(input []byte, addMissingResources bool) (*Res func addMissingServices(requiredServices map[string]*corev1.Service, obj interface{}) { var objNamespace string protocol := ir.TCPProtocolType + gv := corev1.SchemeGroupVersion.String() var refs []gwapiv1.BackendRef switch route := obj.(type) { @@ -528,6 +576,10 @@ func addMissingServices(requiredServices map[string]*corev1.Service, obj interfa } if service, found := requiredServices[key]; !found { service := &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: KindService, + APIVersion: gv, + }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: ns, @@ -565,7 +617,12 @@ func addDefaultEnvoyProxy(resources *Resources, namespace string) error { if err != nil { return err } + gv := egv1a1.GroupVersion ep := &egv1a1.EnvoyProxy{ + TypeMeta: metav1.TypeMeta{ + Kind: KindEnvoyProxy, + APIVersion: gv.String(), + }, ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, Name: defaultEnvoyProxyName, @@ -579,7 +636,7 @@ func addDefaultEnvoyProxy(resources *Resources, namespace string) error { resources.EnvoyProxyForGatewayClass = ep ns := gwapiv1.Namespace(namespace) resources.GatewayClass.Spec.ParametersRef = &gwapiv1.ParametersReference{ - Group: gwapiv1.Group(egv1a1.GroupVersion.Group), + Group: gwapiv1.Group(gv.Group), Kind: KindEnvoyProxy, Name: defaultEnvoyProxyName, Namespace: &ns, diff --git a/internal/gatewayapi/resource/supported_kind.go b/internal/gatewayapi/resource/supported_kind.go index e9d76e66c3..293c53bdff 100644 --- a/internal/gatewayapi/resource/supported_kind.go +++ b/internal/gatewayapi/resource/supported_kind.go @@ -27,4 +27,5 @@ const ( KindServiceImport = "ServiceImport" KindSecret = "Secret" KindHTTPRouteFilter = "HTTPRouteFilter" + KindReferenceGrant = "ReferenceGrant" ) diff --git a/internal/gatewayapi/resource/testdata/all-resources.in.yaml b/internal/gatewayapi/resource/testdata/all-resources.in.yaml index f5cba5ff61..68c63c24ad 100644 --- a/internal/gatewayapi/resource/testdata/all-resources.in.yaml +++ b/internal/gatewayapi/resource/testdata/all-resources.in.yaml @@ -275,3 +275,57 @@ data: game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 +--- +apiVersion: gateway.networking.k8s.io/v1alpha3 +kind: BackendTLSPolicy +metadata: + name: example-tls-policy +spec: + targetRefs: + - group: 'gateway.envoyproxy.io' + kind: Backend + name: backend + validation: + wellKnownCACertificates: "System" + hostname: www.example.com +--- +apiVersion: gateway.envoyproxy.io/v1alpha1 +kind: EnvoyExtensionPolicy +metadata: + name: ext-proc-example +spec: + targetRefs: + - group: gateway.networking.k8s.io + kind: HTTPRoute + name: backend + extProc: + - backendRefs: + - name: grpc-ext-proc + port: 9002 + processingMode: + request: {} + response: + body: Streamed +--- +apiVersion: gateway.networking.k8s.io/v1beta1 +kind: ReferenceGrant +metadata: + name: refg-example + namespace: default +spec: + from: + - group: gateway.networking.k8s.io + kind: HTTPRoute + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: TCPRoute + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: Gateway + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: BackendTLSPolicy + namespace: default + to: + - group: "" + kind: Service diff --git a/internal/gatewayapi/resource/testdata/all-resources.out.yaml b/internal/gatewayapi/resource/testdata/all-resources.out.yaml index 5210fa05c9..612090f674 100644 --- a/internal/gatewayapi/resource/testdata/all-resources.out.yaml +++ b/internal/gatewayapi/resource/testdata/all-resources.out.yaml @@ -1,5 +1,23 @@ +backendTLSPolicies: +- apiVersion: gateway.networking.k8s.io/v1alpha3 + kind: BackendTLSPolicy + metadata: + creationTimestamp: null + name: example-tls-policy + namespace: envoy-gateway-system + spec: + targetRefs: + - group: gateway.envoyproxy.io + kind: Backend + name: backend + validation: + hostname: www.example.com + wellKnownCACertificates: System + status: + ancestors: null backendTrafficPolicies: -- kind: BackendTrafficPolicy +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: BackendTrafficPolicy metadata: creationTimestamp: null name: cookie-lb-policy @@ -44,7 +62,8 @@ backendTrafficPolicies: status: ancestors: null backends: -- kind: Backend +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: Backend metadata: creationTimestamp: null name: backend @@ -57,7 +76,8 @@ backends: type: Endpoints status: {} clientTrafficPolicies: -- kind: ClientTrafficPolicy +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: ClientTrafficPolicy metadata: creationTimestamp: null name: client-timeout @@ -73,7 +93,8 @@ clientTrafficPolicies: status: ancestors: null configMaps: -- data: +- apiVersion: v1 + data: game.properties: | enemy.types=aliens,monsters player.maximum-lives=5 @@ -83,8 +104,33 @@ configMaps: creationTimestamp: null name: configmap namespace: default +envoyExtensionPolicies: +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: EnvoyExtensionPolicy + metadata: + creationTimestamp: null + name: ext-proc-example + namespace: envoy-gateway-system + spec: + extProc: + - backendRefs: + - group: "" + kind: Service + name: grpc-ext-proc + port: 9002 + processingMode: + request: {} + response: + body: Streamed + targetRefs: + - group: gateway.networking.k8s.io + kind: HTTPRoute + name: backend + status: + ancestors: null envoyPatchPolicies: -- kind: EnvoyPatchPolicy +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: EnvoyPatchPolicy metadata: creationTimestamp: null name: ratelimit-patch-policy @@ -116,6 +162,7 @@ envoyPatchPolicies: status: ancestors: null envoyProxyForGatewayClass: + apiVersion: gateway.envoyproxy.io/v1alpha1 kind: EnvoyProxy metadata: creationTimestamp: null @@ -135,6 +182,7 @@ envoyProxyForGatewayClass: type: Kubernetes status: {} gatewayClass: + apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: creationTimestamp: null @@ -143,7 +191,8 @@ gatewayClass: controllerName: gateway.envoyproxy.io/gatewayclass-controller status: {} gateways: -- kind: Gateway +- apiVersion: gateway.networking.k8s.io/v1 + kind: Gateway metadata: creationTimestamp: null name: eg @@ -159,7 +208,8 @@ gateways: protocol: HTTP status: {} grpcRoutes: -- kind: GRPCRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: GRPCRoute metadata: creationTimestamp: null name: backend @@ -204,7 +254,8 @@ httpFilters: type: Inline contentType: text/plain httpRoutes: -- kind: HTTPRoute +- apiVersion: gateway.networking.k8s.io/v1 + kind: HTTPRoute metadata: creationTimestamp: null name: backend @@ -230,23 +281,54 @@ httpRoutes: status: parents: null namespaces: -- metadata: +- apiVersion: v1 + kind: Namespace + metadata: creationTimestamp: null name: envoy-gateway-system spec: {} status: {} -- metadata: +- apiVersion: v1 + kind: Namespace + metadata: creationTimestamp: null name: default spec: {} status: {} -- metadata: +- apiVersion: v1 + kind: Namespace + metadata: creationTimestamp: null name: gateway-conformance-infra spec: {} status: {} +referenceGrants: +- apiVersion: gateway.networking.k8s.io/v1beta1 + kind: ReferenceGrant + metadata: + creationTimestamp: null + name: refg-example + namespace: default + spec: + from: + - group: gateway.networking.k8s.io + kind: HTTPRoute + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: TCPRoute + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: Gateway + namespace: envoy-gateway + - group: gateway.networking.k8s.io + kind: BackendTLSPolicy + namespace: default + to: + - group: "" + kind: Service secrets: -- data: +- apiVersion: v1 + data: .secret-file: dmFsdWUtMg0KDQo= kind: Secret metadata: @@ -255,21 +337,24 @@ secrets: namespace: default stringData: secret: literal value -- data: +- apiVersion: v1 + data: .secret-file: dmFsdWUtMg0KDQo= kind: Secret metadata: creationTimestamp: null name: secret-with-data namespace: default -- kind: Secret +- apiVersion: v1 + kind: Secret metadata: creationTimestamp: null name: secret-with-string-data namespace: default stringData: secret: literal value -- data: +- apiVersion: v1 + data: .secret-file: dmFsdWUtMg0KDQo= kind: Secret metadata: @@ -278,7 +363,8 @@ secrets: namespace: default type: type value securityPolicies: -- kind: SecurityPolicy +- apiVersion: gateway.envoyproxy.io/v1alpha1 + kind: SecurityPolicy metadata: creationTimestamp: null name: jwt-example @@ -304,7 +390,9 @@ securityPolicies: status: ancestors: null services: -- metadata: +- apiVersion: v1 + kind: Service + metadata: creationTimestamp: null name: backend namespace: default @@ -321,7 +409,9 @@ services: targetPort: 0 status: loadBalancer: {} -- metadata: +- apiVersion: v1 + kind: Service + metadata: creationTimestamp: null name: providedBackend namespace: default @@ -339,7 +429,8 @@ services: status: loadBalancer: {} tcpRoutes: -- kind: TCPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TCPRoute metadata: creationTimestamp: null name: backend @@ -360,7 +451,8 @@ tcpRoutes: status: parents: null tlsRoutes: -- kind: TLSRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: TLSRoute metadata: creationTimestamp: null name: backend @@ -381,7 +473,8 @@ tlsRoutes: status: parents: null udpRoutes: -- kind: UDPRoute +- apiVersion: gateway.networking.k8s.io/v1alpha2 + kind: UDPRoute metadata: creationTimestamp: null name: backend diff --git a/internal/provider/file/testdata/resources.all.yaml b/internal/provider/file/testdata/resources.all.yaml index 00b6956570..989ae8025a 100644 --- a/internal/provider/file/testdata/resources.all.yaml +++ b/internal/provider/file/testdata/resources.all.yaml @@ -1,5 +1,6 @@ backends: - kind: Backend + apiVersion: gateway.envoyproxy.io/v1alpha1 metadata: creationTimestamp: null name: backend @@ -13,6 +14,7 @@ backends: status: {} gatewayClass: kind: GatewayClass + apiVersion: gateway.networking.k8s.io/v1 metadata: creationTimestamp: null name: eg @@ -21,6 +23,7 @@ gatewayClass: status: {} gateways: - kind: Gateway + apiVersion: gateway.networking.k8s.io/v1 metadata: creationTimestamp: null name: eg @@ -37,6 +40,7 @@ gateways: status: {} httpRoutes: - kind: HTTPRoute + apiVersion: gateway.networking.k8s.io/v1 metadata: creationTimestamp: null name: backend @@ -61,7 +65,9 @@ httpRoutes: status: parents: null namespaces: -- metadata: +- kind: Namespace + apiVersion: v1 + metadata: creationTimestamp: null name: envoy-gateway-system spec: {}