diff --git a/pkg/controller/vsphere/actuator_test.go b/pkg/controller/vsphere/actuator_test.go index 82c9fc131c..3f10129b23 100644 --- a/pkg/controller/vsphere/actuator_test.go +++ b/pkg/controller/vsphere/actuator_test.go @@ -8,6 +8,8 @@ import ( "testing" "time" + testutils "github.com/openshift/machine-api-operator/pkg/util/testing" + . "github.com/onsi/gomega" configv1 "github.com/openshift/api/config/v1" machinev1 "github.com/openshift/api/machine/v1beta1" @@ -363,6 +365,11 @@ func TestMachineEvents(t *testing.T) { } gs.Eventually(getNode, timeout).Should(Succeed()) + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + taskIDCache := make(map[string]string) params := ActuatorParams{ Client: k8sClient, @@ -370,6 +377,7 @@ func TestMachineEvents(t *testing.T) { APIReader: k8sClient, TaskIDCache: taskIDCache, OpenshiftConfigNamespace: openshiftConfigNamespaceForTest, + FeatureGates: gate, } actuator := NewActuator(params) diff --git a/pkg/controller/vsphere/reconciler_test.go b/pkg/controller/vsphere/reconciler_test.go index 38983ff363..cc9c9da172 100644 --- a/pkg/controller/vsphere/reconciler_test.go +++ b/pkg/controller/vsphere/reconciler_test.go @@ -2631,8 +2631,7 @@ func TestCreate(t *testing.T) { t.Errorf("Unexpected error setting up feature gates: %v", err) } - err = gates.Set(fmt.Sprintf("%v=%v", features.FeatureGateVSphereStaticIPs, tc.staticIPFeatureGateEnabled)) - if err != nil { + if err = gates.Set(fmt.Sprintf("%v=%v", features.FeatureGateVSphereStaticIPs, tc.staticIPFeatureGateEnabled)); err != nil { t.Errorf("Unexpected error setting static IP feature gates: %v", err) } diff --git a/pkg/util/testing/testing.go b/pkg/util/testing/testing.go index 9eeef087fe..40a7ada6db 100644 --- a/pkg/util/testing/testing.go +++ b/pkg/util/testing/testing.go @@ -178,7 +178,7 @@ func NewMachineHealthCheck(name string) *machinev1.MachineHealthCheck { func NewDefaultMutableFeatureGate() (featuregate.MutableFeatureGate, error) { defaultMutableGate := feature.DefaultMutableFeatureGate - _, err := features.NewFeatureGateOptions(defaultMutableGate, openshiftfeatures.SelfManaged, openshiftfeatures.FeatureGateMachineAPIMigration) + _, err := features.NewFeatureGateOptions(defaultMutableGate, openshiftfeatures.SelfManaged, openshiftfeatures.FeatureGateMachineAPIMigration, openshiftfeatures.FeatureGateVSphereStaticIPs, openshiftfeatures.FeatureGateVSphereMultiDisk) if err != nil { return nil, fmt.Errorf("failed to set up default feature gate: %w", err) } diff --git a/pkg/webhooks/machine_webhook_test.go b/pkg/webhooks/machine_webhook_test.go index b946e9f2b1..81dc189b9f 100644 --- a/pkg/webhooks/machine_webhook_test.go +++ b/pkg/webhooks/machine_webhook_test.go @@ -8,6 +8,8 @@ import ( "reflect" "testing" + testutils "github.com/openshift/machine-api-operator/pkg/util/testing" + . "github.com/onsi/gomega" osconfigv1 "github.com/openshift/api/config/v1" machinev1 "github.com/openshift/api/machine/v1" @@ -1172,6 +1174,11 @@ func TestMachineCreation(t *testing.T) { t.Run(tc.name, func(t *testing.T) { gs := NewWithT(t) + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + mgr, err := manager.New(cfg, manager.Options{ Metrics: metricsserver.Options{ BindAddress: "0", @@ -1201,7 +1208,7 @@ func TestMachineCreation(t *testing.T) { dns.Spec.PublicZone = &osconfigv1.DNSZone{} } machineDefaulter := admission.WithCustomDefaulter(scheme.Scheme, &machinev1beta1.Machine{}, createMachineDefaulter(platformStatus, tc.clusterID)) - machineValidator := admission.WithCustomValidator(scheme.Scheme, &machinev1beta1.Machine{}, createMachineValidator(infra, c, dns)) + machineValidator := admission.WithCustomValidator(scheme.Scheme, &machinev1beta1.Machine{}, createMachineValidator(infra, c, dns, gate)) mgr.GetWebhookServer().Register(DefaultMachineMutatingHookPath, &webhook.Admission{Handler: machineDefaulter}) mgr.GetWebhookServer().Register(DefaultMachineValidatingHookPath, &webhook.Admission{Handler: machineValidator}) @@ -1974,6 +1981,11 @@ func TestMachineUpdate(t *testing.T) { t.Run(tc.name, func(t *testing.T) { gs := NewWithT(t) + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + mgr, err := manager.New(cfg, manager.Options{ Metrics: metricsserver.Options{ BindAddress: "0", @@ -1999,7 +2011,7 @@ func TestMachineUpdate(t *testing.T) { }, } machineDefaulter := admission.WithCustomDefaulter(scheme.Scheme, &machinev1beta1.Machine{}, createMachineDefaulter(platformStatus, tc.clusterID)) - machineValidator := admission.WithCustomValidator(scheme.Scheme, &machinev1beta1.Machine{}, createMachineValidator(infra, c, plainDNS)) + machineValidator := admission.WithCustomValidator(scheme.Scheme, &machinev1beta1.Machine{}, createMachineValidator(infra, c, plainDNS, gate)) mgr.GetWebhookServer().Register(DefaultMachineMutatingHookPath, &webhook.Admission{Handler: machineDefaulter}) mgr.GetWebhookServer().Register(DefaultMachineValidatingHookPath, &webhook.Admission{Handler: machineValidator}) @@ -2380,7 +2392,13 @@ func TestValidateAWSProviderSpec(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.AWSPlatformType - h := createMachineValidator(infra, c, plainDNS) + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) for _, tc := range testCases { t.Run(tc.testCase, func(t *testing.T) { @@ -3050,7 +3068,12 @@ func TestValidateAzureProviderSpec(t *testing.T) { infra.Status.PlatformStatus.Type = osconfigv1.AzurePlatformType infra.Status.PlatformStatus.Azure = tc.azurePlatformStatus - h := createMachineValidator(infra, c, plainDNS) + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) // create a valid spec that will then be 'broken' by modifySpec providerSpec := &machinev1beta1.AzureMachineProviderSpec{ @@ -3725,7 +3748,13 @@ func TestValidateGCPProviderSpec(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.GCPPlatformType - h := createMachineValidator(infra, c, plainDNS) + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) for _, tc := range testCases { providerSpec := &machinev1beta1.GCPMachineProviderSpec{ @@ -4178,7 +4207,13 @@ func TestValidateVSphereProviderSpec(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.VSpherePlatformType - h := createMachineValidator(infra, c, plainDNS) + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) for _, tc := range testCases { t.Run(tc.testCase, func(t *testing.T) { @@ -4410,7 +4445,13 @@ func TestUpdateFinalizer(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.AWSPlatformType - h := createMachineValidator(infra, c, plainDNS) + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) providerSpec := &machinev1beta1.AWSMachineProviderConfig{ AMI: machinev1beta1.AWSResourceReference{ @@ -4839,7 +4880,12 @@ func TestValidatePowerVSProviderSpec(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.PowerVSPlatformType - h := createMachineValidator(infra, c, plainDNS) + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) for _, tc := range testCases { t.Run(tc.testCase, func(t *testing.T) { @@ -5133,7 +5179,13 @@ func TestValidateNutanixProviderSpec(t *testing.T) { infra := plainInfra.DeepCopy() infra.Status.InfrastructureName = "clusterID" infra.Status.PlatformStatus.Type = osconfigv1.NutanixPlatformType - h := createMachineValidator(infra, c, plainDNS) + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + + h := createMachineValidator(infra, c, plainDNS, gate) for _, tc := range testCases { t.Run(tc.testCase, func(t *testing.T) { diff --git a/pkg/webhooks/machineset_webhook_test.go b/pkg/webhooks/machineset_webhook_test.go index 5fdfc09eed..b1bade73d9 100644 --- a/pkg/webhooks/machineset_webhook_test.go +++ b/pkg/webhooks/machineset_webhook_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + testutils "github.com/openshift/machine-api-operator/pkg/util/testing" "testing" "k8s.io/apimachinery/pkg/util/intstr" @@ -509,8 +510,14 @@ func TestMachineSetCreation(t *testing.T) { if !tc.disconnected { dns.Spec.PublicZone = &osconfigv1.DNSZone{} } + + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + machineSetDefaulter := createMachineSetDefaulter(platformStatus, tc.clusterID) - machineSetValidator := createMachineSetValidator(infra, c, dns) + machineSetValidator := createMachineSetValidator(infra, c, dns, gate) mgr.GetWebhookServer().Register(DefaultMachineSetMutatingHookPath, &webhook.Admission{Handler: machineSetDefaulter}) mgr.GetWebhookServer().Register(DefaultMachineSetValidatingHookPath, &webhook.Admission{Handler: machineSetValidator}) @@ -1193,8 +1200,13 @@ func TestMachineSetUpdate(t *testing.T) { infra.Status.InfrastructureName = tc.clusterID infra.Status.PlatformStatus = platformStatus + gate, err := testutils.NewDefaultMutableFeatureGate() + if err != nil { + t.Errorf("Unexpected error setting up feature gates: %v", err) + } + machineSetDefaulter := createMachineSetDefaulter(platformStatus, tc.clusterID) - machineSetValidator := createMachineSetValidator(infra, c, plainDNS) + machineSetValidator := createMachineSetValidator(infra, c, plainDNS, gate) mgr.GetWebhookServer().Register(DefaultMachineSetMutatingHookPath, &webhook.Admission{Handler: machineSetDefaulter}) mgr.GetWebhookServer().Register(DefaultMachineSetValidatingHookPath, &webhook.Admission{Handler: machineSetValidator}) diff --git a/pkg/webhooks/v1beta1_suite_test.go b/pkg/webhooks/v1beta1_suite_test.go index eeb86dd8dd..c5d09d5d84 100644 --- a/pkg/webhooks/v1beta1_suite_test.go +++ b/pkg/webhooks/v1beta1_suite_test.go @@ -56,6 +56,7 @@ func TestMain(m *testing.M) { CRDDirectoryPaths: []string{ filepath.Join("..", "..", "install"), filepath.Join("..", "..", "..", "..", "vendor", "github.com", "openshift", "api", "config", "v1", "zz_generated.crd-manifests"), + filepath.Join("..", "..", "..", "..", "third_party", "cluster-api", "crd"), }, WebhookInstallOptions: envtest.WebhookInstallOptions{ MutatingWebhooks: []*admissionregistrationv1.MutatingWebhookConfiguration{NewMachineMutatingWebhookConfiguration()}, diff --git a/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddressclaims.yaml b/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddressclaims.yaml new file mode 100644 index 0000000000..f05f04474d --- /dev/null +++ b/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddressclaims.yaml @@ -0,0 +1,284 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: ipaddressclaims.ipam.cluster.x-k8s.io +spec: + group: ipam.cluster.x-k8s.io + names: + categories: + - cluster-api + kind: IPAddressClaim + listKind: IPAddressClaimList + plural: ipaddressclaims + singular: ipaddressclaim + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Name of the pool to allocate an address from + jsonPath: .spec.poolRef.name + name: Pool Name + type: string + - description: Kind of the pool to allocate an address from + jsonPath: .spec.poolRef.kind + name: Pool Kind + type: string + - description: Time duration since creation of IPAdressClaim + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: IPAddressClaim is the Schema for the ipaddressclaim API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: IPAddressClaimSpec is the desired state of an IPAddressClaim. + properties: + poolRef: + description: PoolRef is a reference to the pool from which an IP address + should be created. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + required: + - poolRef + type: object + status: + description: IPAddressClaimStatus is the observed status of a IPAddressClaim. + properties: + addressRef: + description: AddressRef is a reference to the address that was created + for this claim. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + type: object + x-kubernetes-map-type: atomic + conditions: + description: Conditions summarises the current state of the IPAddressClaim + items: + description: Condition defines an observation of a Cluster API resource + operational state. + properties: + lastTransitionTime: + description: |- + Last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + A human readable message indicating details about the transition. + This field may be empty. + type: string + reason: + description: |- + The reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + type: string + severity: + description: |- + Severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: |- + Type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + type: string + required: + - lastTransitionTime + - status + - type + type: object + type: array + type: object + type: object + served: true + storage: false + subresources: + status: {} + - additionalPrinterColumns: + - description: Name of the pool to allocate an address from + jsonPath: .spec.poolRef.name + name: Pool Name + type: string + - description: Kind of the pool to allocate an address from + jsonPath: .spec.poolRef.kind + name: Pool Kind + type: string + - description: Time duration since creation of IPAdressClaim + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: IPAddressClaim is the Schema for the ipaddressclaim API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: IPAddressClaimSpec is the desired state of an IPAddressClaim. + properties: + clusterName: + description: ClusterName is the name of the Cluster this object belongs + to. + type: string + poolRef: + description: PoolRef is a reference to the pool from which an IP address + should be created. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + required: + - poolRef + type: object + status: + description: IPAddressClaimStatus is the observed status of a IPAddressClaim. + properties: + addressRef: + description: AddressRef is a reference to the address that was created + for this claim. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + type: object + x-kubernetes-map-type: atomic + conditions: + description: Conditions summarises the current state of the IPAddressClaim + items: + description: Condition defines an observation of a Cluster API resource + operational state. + properties: + lastTransitionTime: + description: |- + Last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + A human readable message indicating details about the transition. + This field may be empty. + type: string + reason: + description: |- + The reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + type: string + severity: + description: |- + Severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: |- + Type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + type: string + required: + - lastTransitionTime + - status + - type + type: object + type: array + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddresses.yaml b/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddresses.yaml new file mode 100644 index 0000000000..b25fee0ab1 --- /dev/null +++ b/third_party/cluster-api/crd/ipam.cluster.x-k8s.io_ipaddresses.yaml @@ -0,0 +1,214 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.1 + name: ipaddresses.ipam.cluster.x-k8s.io +spec: + group: ipam.cluster.x-k8s.io + names: + categories: + - cluster-api + kind: IPAddress + listKind: IPAddressList + plural: ipaddresses + singular: ipaddress + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Address + jsonPath: .spec.address + name: Address + type: string + - description: Name of the pool the address is from + jsonPath: .spec.poolRef.name + name: Pool Name + type: string + - description: Kind of the pool the address is from + jsonPath: .spec.poolRef.kind + name: Pool Kind + type: string + - description: Time duration since creation of IPAdress + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: IPAddress is the Schema for the ipaddress API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: IPAddressSpec is the desired state of an IPAddress. + properties: + address: + description: Address is the IP address. + type: string + claimRef: + description: ClaimRef is a reference to the claim this IPAddress was + created for. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + type: object + x-kubernetes-map-type: atomic + gateway: + description: Gateway is the network gateway of the network the address + is from. + type: string + poolRef: + description: PoolRef is a reference to the pool that this IPAddress + was created from. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + prefix: + description: Prefix is the prefix of the address. + type: integer + required: + - address + - claimRef + - poolRef + - prefix + type: object + type: object + served: true + storage: false + subresources: {} + - additionalPrinterColumns: + - description: Address + jsonPath: .spec.address + name: Address + type: string + - description: Name of the pool the address is from + jsonPath: .spec.poolRef.name + name: Pool Name + type: string + - description: Kind of the pool the address is from + jsonPath: .spec.poolRef.kind + name: Pool Kind + type: string + - description: Time duration since creation of IPAdress + jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + schema: + openAPIV3Schema: + description: IPAddress is the Schema for the ipaddress API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: IPAddressSpec is the desired state of an IPAddress. + properties: + address: + description: Address is the IP address. + type: string + claimRef: + description: ClaimRef is a reference to the claim this IPAddress was + created for. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. Instances of this type with an empty value here are + almost certainly wrong. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + type: object + x-kubernetes-map-type: atomic + gateway: + description: Gateway is the network gateway of the network the address + is from. + type: string + poolRef: + description: PoolRef is a reference to the pool that this IPAddress + was created from. + properties: + apiGroup: + description: |- + APIGroup is the group for the resource being referenced. + If APIGroup is not specified, the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + prefix: + description: Prefix is the prefix of the address. + type: integer + required: + - address + - claimRef + - poolRef + - prefix + type: object + type: object + served: true + storage: true + subresources: {}