From 6a10ec57de3b05331cafd82612ad1449bd5c77db Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 20 Nov 2024 16:13:22 +0100 Subject: [PATCH 1/4] Add validation and tests for hc.spec.dns input --- api/hypershift/v1beta1/hostedcluster_types.go | 4 +- test/e2e/create_cluster_test.go | 96 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/api/hypershift/v1beta1/hostedcluster_types.go b/api/hypershift/v1beta1/hostedcluster_types.go index 866447eb0c..37a9e3e388 100644 --- a/api/hypershift/v1beta1/hostedcluster_types.go +++ b/api/hypershift/v1beta1/hostedcluster_types.go @@ -773,7 +773,7 @@ type NodePortPublishingStrategy struct { type LoadBalancerPublishingStrategy struct { // hostname is the name of the DNS record that will be created pointing to the LoadBalancer and passed through to consumers of the service. // If ommited, the value will be infered from the corev1.Service Load balancer type .status. - // +kubebuilder:validation:XValidation:rule=`self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$')`,message="baseDomain must be a valid base domain (e.g., example.com)" + // +kubebuilder:validation:XValidation:rule=`self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$')`,message="hostname must be a valid base domain (e.g., example.com)" // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:MinLength=1 // +optional @@ -798,6 +798,7 @@ type DNSSpec struct { // If baseDomainPrefix is ommitted, the hostedCluster.name will be used as the subdomain. // Once set, this field is immutable. // When the value is the empty string "", the controller might default to a value depending on the platform. + // +kubebuilder:validation:XValidation:rule=`self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$')`,message="baseDomain must be a valid domain (e.g., example, example.com, sub.example.com)" // +kubebuilder:validation:XValidation:rule=`oldSelf == "" || self == oldSelf`, message="baseDomain is immutable" // +kubebuilder:validation:MaxLength=253 // +immutable @@ -808,6 +809,7 @@ type DNSSpec struct { // It will be used to confgure ingress in the hosted cluster through the subdomain baseDomainPrefix.baseDomain. // If baseDomainPrefix is ommitted, the hostedCluster.name will be used as the subdomain. // Set baseDomainPrefix to an empty string "", if you don't want a prefix at all (not even hostedCluster.name) to be prepended to baseDomain. + // +kubebuilder:validation:XValidation:rule=`self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$')`,message="baseDomainPrefix must be a valid domain (e.g., example, example.com, sub.example.com)" // This field is immutable. // +kubebuilder:validation:XValidation:rule="self == oldSelf", message="baseDomainPrefix is immutable" // +kubebuilder:validation:MaxLength=253 diff --git a/test/e2e/create_cluster_test.go b/test/e2e/create_cluster_test.go index d571eb90ad..0bd7ff5f5c 100644 --- a/test/e2e/create_cluster_test.go +++ b/test/e2e/create_cluster_test.go @@ -43,6 +43,102 @@ func TestOnCreateAPIUX(t *testing.T) { expectedErrorSubstring string } }{ + { + name: "when based domain is not valid it should fail", + file: "hostedcluster-base.yaml", + validations: []struct { + name string + mutateInput func(*hyperv1.HostedCluster) + expectedErrorSubstring string + }{ + { + name: "when baseDomain has invalid chars it should fail", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomain = "@foo" + }, + expectedErrorSubstring: "baseDomain must be a valid domain (e.g., example, example.com, sub.example.com)", + }, + { + name: "when baseDomain is a valid hierarchical domain with two levels it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomain = "foo.bar" + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomain is a valid hierarchical domain it with 3 levels should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomain = "123.foo.bar" + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomain is a single subdomain it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomain = "foo" + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomain is empty it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomain = "" + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomainPrefix has invalid chars it should fail", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomainPrefix = ptr.To("@foo") + }, + expectedErrorSubstring: "baseDomainPrefix must be a valid domain (e.g., example, example.com, sub.example.com)", + }, + { + name: "when baseDomainPrefix is a valid hierarchical domain with two levels it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomainPrefix = ptr.To("foo.bar") + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomainPrefix is a valid hierarchical domain it with 3 levels should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomainPrefix = ptr.To("123.foo.bar") + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomainPrefix is a single subdomain it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomainPrefix = ptr.To("foo") + }, + expectedErrorSubstring: "", + }, + { + name: "when baseDomainPrefix is empty it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.BaseDomainPrefix = ptr.To("") + }, + expectedErrorSubstring: "", + }, + { + name: "when publicZoneID and privateZoneID are empty it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.PublicZoneID = "" + hc.Spec.DNS.PrivateZoneID = "" + }, + expectedErrorSubstring: "", + }, + { + name: "when publicZoneID and privateZoneID are set it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.DNS.PublicZoneID = "123" + hc.Spec.DNS.PrivateZoneID = "123" + }, + expectedErrorSubstring: "", + }, + }, + }, { name: "when feature gated fields are used it should fail", file: "hostedcluster-base.yaml", From f4f0e54e6dff6d3f49f646025cefab43292c43a9 Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 20 Nov 2024 16:13:44 +0100 Subject: [PATCH 2/4] Run make update --- .../AAA_ungated.yaml | 8 +++++++- .../AROHCPManagedIdentities.yaml | 8 +++++++- .../DynamicResourceAllocation.yaml | 8 +++++++- .../ExternalOIDC.yaml | 8 +++++++- .../NetworkDiagnosticsConfig.yaml | 8 +++++++- .../hostedclusters.hypershift.openshift.io/OpenStack.yaml | 8 +++++++- .../AAA_ungated.yaml | 8 +++++++- .../AROHCPManagedIdentities.yaml | 8 +++++++- .../DynamicResourceAllocation.yaml | 8 +++++++- .../ExternalOIDC.yaml | 8 +++++++- .../NetworkDiagnosticsConfig.yaml | 8 +++++++- .../OpenStack.yaml | 8 +++++++- .../hostedclusters-CustomNoUpgrade.crd.yaml | 8 +++++++- .../hostedclusters-Default.crd.yaml | 8 +++++++- .../hostedclusters-TechPreviewNoUpgrade.crd.yaml | 8 +++++++- .../hostedcontrolplanes-CustomNoUpgrade.crd.yaml | 8 +++++++- .../hostedcontrolplanes-Default.crd.yaml | 8 +++++++- .../hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml | 8 +++++++- .../api/hypershift/v1beta1/hostedcluster_types.go | 4 +++- 19 files changed, 129 insertions(+), 19 deletions(-) diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml index 789ad0b43a..536c1053c1 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml @@ -2073,6 +2073,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2085,6 +2088,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3892,7 +3898,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml index c2b9114a50..35d52f0106 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml @@ -2069,6 +2069,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2081,6 +2084,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4137,7 +4143,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml index f570a82378..2cfa928f9b 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml @@ -2090,6 +2090,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2102,6 +2105,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3901,7 +3907,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml index b09e739b8c..f817374fb9 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml @@ -2311,6 +2311,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2323,6 +2326,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4122,7 +4128,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml index 6166efbd99..593fcfd8f9 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml @@ -2221,6 +2221,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2233,6 +2236,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4032,7 +4038,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml index 6455b02e75..51655ad95a 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml @@ -2069,6 +2069,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2081,6 +2084,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4354,7 +4360,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml index 3da95dde02..a2fd98a2fc 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml @@ -2014,6 +2014,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2026,6 +2029,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3748,7 +3754,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml index 8c3c71658f..830ce07969 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml @@ -2010,6 +2010,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2022,6 +2025,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3993,7 +3999,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml index cb2f9d1183..cdb04f4564 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml @@ -2031,6 +2031,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2043,6 +2046,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3757,7 +3763,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml index eb083ccc0d..bcd0e3042b 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml @@ -2252,6 +2252,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2264,6 +2267,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3978,7 +3984,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml index 9dae5c9d82..e248518aba 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml @@ -2162,6 +2162,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2174,6 +2177,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -3888,7 +3894,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml index 3299555f5e..8b9fa0ba88 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml @@ -2010,6 +2010,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2022,6 +2025,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4210,7 +4216,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml index 17a537879a..d12ce7eb95 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml @@ -2487,6 +2487,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2499,6 +2502,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -5027,7 +5033,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml index b8334443c1..499a76bf91 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml @@ -2487,6 +2487,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2499,6 +2502,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4306,7 +4312,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml index 3e61cf042a..e0886f6543 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml @@ -2487,6 +2487,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2499,6 +2502,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -5027,7 +5033,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml index 3dbdcaa17f..9780a162cf 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml @@ -2428,6 +2428,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2440,6 +2443,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4883,7 +4889,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml index 3a85b8d639..91d4388543 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml @@ -2428,6 +2428,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2440,6 +2443,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4162,7 +4168,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml index c4a4df35c2..76b7c0e9dc 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml @@ -2428,6 +2428,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomain must be a valid domain (e.g., example, example.com, + sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomain is immutable rule: oldSelf == "" || self == oldSelf baseDomainPrefix: @@ -2440,6 +2443,9 @@ spec: maxLength: 253 type: string x-kubernetes-validations: + - message: baseDomainPrefix must be a valid domain (e.g., example, + example.com, sub.example.com) + rule: self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$') - message: baseDomainPrefix is immutable rule: self == oldSelf privateZoneID: @@ -4883,7 +4889,7 @@ spec: minLength: 1 type: string x-kubernetes-validations: - - message: baseDomain must be a valid base domain (e.g., + - message: hostname must be a valid base domain (e.g., example.com) rule: self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$') type: object diff --git a/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go b/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go index 866447eb0c..37a9e3e388 100644 --- a/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go +++ b/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go @@ -773,7 +773,7 @@ type NodePortPublishingStrategy struct { type LoadBalancerPublishingStrategy struct { // hostname is the name of the DNS record that will be created pointing to the LoadBalancer and passed through to consumers of the service. // If ommited, the value will be infered from the corev1.Service Load balancer type .status. - // +kubebuilder:validation:XValidation:rule=`self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$')`,message="baseDomain must be a valid base domain (e.g., example.com)" + // +kubebuilder:validation:XValidation:rule=`self.matches('^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$')`,message="hostname must be a valid base domain (e.g., example.com)" // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:MinLength=1 // +optional @@ -798,6 +798,7 @@ type DNSSpec struct { // If baseDomainPrefix is ommitted, the hostedCluster.name will be used as the subdomain. // Once set, this field is immutable. // When the value is the empty string "", the controller might default to a value depending on the platform. + // +kubebuilder:validation:XValidation:rule=`self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$')`,message="baseDomain must be a valid domain (e.g., example, example.com, sub.example.com)" // +kubebuilder:validation:XValidation:rule=`oldSelf == "" || self == oldSelf`, message="baseDomain is immutable" // +kubebuilder:validation:MaxLength=253 // +immutable @@ -808,6 +809,7 @@ type DNSSpec struct { // It will be used to confgure ingress in the hosted cluster through the subdomain baseDomainPrefix.baseDomain. // If baseDomainPrefix is ommitted, the hostedCluster.name will be used as the subdomain. // Set baseDomainPrefix to an empty string "", if you don't want a prefix at all (not even hostedCluster.name) to be prepended to baseDomain. + // +kubebuilder:validation:XValidation:rule=`self == "" || self.matches('^(?:(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}|[a-zA-Z0-9-]+)$')`,message="baseDomainPrefix must be a valid domain (e.g., example, example.com, sub.example.com)" // This field is immutable. // +kubebuilder:validation:XValidation:rule="self == oldSelf", message="baseDomainPrefix is immutable" // +kubebuilder:validation:MaxLength=253 From c2796bcf6288a7d1f7d80973f840f9a7c623ff11 Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 20 Nov 2024 16:32:09 +0100 Subject: [PATCH 3/4] Use isIp to validate nodePort.address --- api/hypershift/v1beta1/hostedcluster_types.go | 2 +- test/e2e/create_cluster_test.go | 88 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/api/hypershift/v1beta1/hostedcluster_types.go b/api/hypershift/v1beta1/hostedcluster_types.go index 37a9e3e388..767a3594cb 100644 --- a/api/hypershift/v1beta1/hostedcluster_types.go +++ b/api/hypershift/v1beta1/hostedcluster_types.go @@ -760,7 +760,7 @@ type NodePortPublishingStrategy struct { // address is the host/ip that the NodePort service is exposed over. // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:XValidation:rule=`self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')`, message="address must be a valid hostname, IPv4, or IPv6 address" + // +kubebuilder:validation:XValidation:rule=`isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')`, message="address must be a valid hostname, IPv4, or IPv6 address" // +required Address string `json:"address"` diff --git a/test/e2e/create_cluster_test.go b/test/e2e/create_cluster_test.go index 0bd7ff5f5c..3590d20b27 100644 --- a/test/e2e/create_cluster_test.go +++ b/test/e2e/create_cluster_test.go @@ -392,6 +392,94 @@ func TestOnCreateAPIUX(t *testing.T) { mutateInput func(*hyperv1.HostedCluster) expectedErrorSubstring string }{ + { + name: "when servicePublishingStrategy is nodePort and addresses valid hostname, IPv4 and IPv6 it should pass", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.Services = []hyperv1.ServicePublishingStrategyMapping{ + { + Service: hyperv1.APIServer, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "kas.example.com", + }, + }, + }, + { + Service: hyperv1.Ignition, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "127.0.0.1", + }, + }, + }, + { + Service: hyperv1.Konnectivity, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "fd2e:6f44:5dd8:c956::14", + }, + }, + }, + { + Service: hyperv1.OAuthServer, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "fd2e:6f44:5dd8:c956:0000:0000:0000:0014", + }, + }, + }, + } + }, + expectedErrorSubstring: "", + }, + { + name: "when servicePublishingStrategy is nodePort and addresses is invalid it should fail", + mutateInput: func(hc *hyperv1.HostedCluster) { + hc.Spec.Services = []hyperv1.ServicePublishingStrategyMapping{ + { + Service: hyperv1.APIServer, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "@foo", + }, + }, + }, + { + Service: hyperv1.Ignition, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "127.0.0.1", + }, + }, + }, + { + Service: hyperv1.Konnectivity, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "fd2e:6f44:5dd8:c956::14", + }, + }, + }, + { + Service: hyperv1.OAuthServer, + ServicePublishingStrategy: hyperv1.ServicePublishingStrategy{ + Type: hyperv1.NodePort, + NodePort: &hyperv1.NodePortPublishingStrategy{ + Address: "fd2e:6f44:5dd8:c956:0000:0000:0000:0014", + }, + }, + }, + } + }, + expectedErrorSubstring: "address must be a valid hostname, IPv4, or IPv6 address", + }, // { // name: "when serviceType is 'APIServer' and publishing strategy is 'Route' and hostname is not set it should fail", // mutateInput: func(hc *hyperv1.HostedCluster) { From a21c7a68986037ef643871a47b31a1e8c3139b2e Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 20 Nov 2024 16:33:36 +0100 Subject: [PATCH 4/4] Run make update --- .../hostedclusters.hypershift.openshift.io/AAA_ungated.yaml | 2 +- .../AROHCPManagedIdentities.yaml | 2 +- .../DynamicResourceAllocation.yaml | 2 +- .../hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml | 2 +- .../NetworkDiagnosticsConfig.yaml | 2 +- .../hostedclusters.hypershift.openshift.io/OpenStack.yaml | 2 +- .../AAA_ungated.yaml | 2 +- .../AROHCPManagedIdentities.yaml | 2 +- .../DynamicResourceAllocation.yaml | 2 +- .../ExternalOIDC.yaml | 2 +- .../NetworkDiagnosticsConfig.yaml | 2 +- .../hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml | 2 +- .../hostedclusters-CustomNoUpgrade.crd.yaml | 2 +- .../zz_generated.crd-manifests/hostedclusters-Default.crd.yaml | 2 +- .../hostedclusters-TechPreviewNoUpgrade.crd.yaml | 2 +- .../hostedcontrolplanes-CustomNoUpgrade.crd.yaml | 2 +- .../hostedcontrolplanes-Default.crd.yaml | 2 +- .../hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml | 2 +- .../hypershift/api/hypershift/v1beta1/hostedcluster_types.go | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml index 536c1053c1..f92d8ca9a8 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml @@ -3915,7 +3915,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml index 35d52f0106..0b07ebda25 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AROHCPManagedIdentities.yaml @@ -4160,7 +4160,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml index 2cfa928f9b..49e183e4d9 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/DynamicResourceAllocation.yaml @@ -3924,7 +3924,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml index f817374fb9..650ad6fe2a 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml @@ -4145,7 +4145,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml index 593fcfd8f9..10441c6f2b 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml @@ -4055,7 +4055,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml index 51655ad95a..b25ae40f70 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml @@ -4377,7 +4377,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml index a2fd98a2fc..8d12e8be2e 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml @@ -3771,7 +3771,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml index 830ce07969..c5c268e1d0 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AROHCPManagedIdentities.yaml @@ -4016,7 +4016,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml index cdb04f4564..70d40507d3 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/DynamicResourceAllocation.yaml @@ -3780,7 +3780,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml index bcd0e3042b..039cdb7171 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml @@ -4001,7 +4001,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml index e248518aba..cdc864cc9c 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkDiagnosticsConfig.yaml @@ -3911,7 +3911,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml index 8b9fa0ba88..0a39adef4b 100644 --- a/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml +++ b/api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml @@ -4233,7 +4233,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml index d12ce7eb95..b61c969ea0 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-CustomNoUpgrade.crd.yaml @@ -5050,7 +5050,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml index 499a76bf91..9f35af6525 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Default.crd.yaml @@ -4329,7 +4329,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml index e0886f6543..254f56a81c 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedclusters-TechPreviewNoUpgrade.crd.yaml @@ -5050,7 +5050,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml index 9780a162cf..d17884e713 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-CustomNoUpgrade.crd.yaml @@ -4906,7 +4906,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml index 91d4388543..50716e4819 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Default.crd.yaml @@ -4185,7 +4185,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml index 76b7c0e9dc..d89263527a 100644 --- a/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml +++ b/cmd/install/assets/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-TechPreviewNoUpgrade.crd.yaml @@ -4906,7 +4906,7 @@ spec: x-kubernetes-validations: - message: address must be a valid hostname, IPv4, or IPv6 address - rule: self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') + rule: isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$') port: diff --git a/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go b/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go index 37a9e3e388..767a3594cb 100644 --- a/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go +++ b/vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_types.go @@ -760,7 +760,7 @@ type NodePortPublishingStrategy struct { // address is the host/ip that the NodePort service is exposed over. // +kubebuilder:validation:MaxLength=253 // +kubebuilder:validation:MinLength=1 - // +kubebuilder:validation:XValidation:rule=`self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')`, message="address must be a valid hostname, IPv4, or IPv6 address" + // +kubebuilder:validation:XValidation:rule=`isIP(self) || self.matches('^(([a-zA-Z0-9][-a-zA-Z0-9]*\\.)+[a-zA-Z]{2,}|localhost)$') || self.matches('^((\\d{1,3}\\.){3}\\d{1,3})$') || self.matches('^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$')`, message="address must be a valid hostname, IPv4, or IPv6 address" // +required Address string `json:"address"`