Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions config/v1/types_infrastructure.go
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,28 @@ type OpenStackPlatformSpec struct {
// +optional
IngressIPs []IP `json:"ingressIPs"`

// additionalAPIServerIPs is a list of additional IP addresses to contact
// the Kubernetes API server on separate networks. These are used when a
// user-managed load balancer exposes the API server on multiple networks
// simultaneously. Each entry must be a valid IP address. This field is
// only valid when loadBalancer.type is set to UserManaged.
//
Comment on lines +1200 to +1202

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Missing xvalidation for loadbalancer.type 📜 Skill insight ≡ Correctness

The new OpenStack additional IP fields are documented as "only valid when loadBalancer.type is set
to UserManaged" but there is no corresponding CEL/XValidation rule enforcing that cross-field
relationship. This allows invalid combinations into the API and can expose inconsistent objects to
consumers, contradicting the documented contract.
Agent Prompt
## Issue description
Field documentation introduces a cross-field constraint: `AdditionalAPIServerIPs` / `AdditionalIngressIPs` are only valid when `loadBalancer.type` is `UserManaged`, but there is no `+kubebuilder:validation:XValidation` / CEL rule enforcing this relationship in the API schema.

## Issue Context
- PR Compliance ID 1511 requires that documented cross-field relationships be enforced with XValidation.
- The new fields currently have only size/list annotations, and the generated CRD schema has no `x-kubernetes-validations` that ties them to `loadBalancer.type`.
- A similar `loadBalancer.type`-dependent invariant is already enforced for `dnsRecordsType` via CEL/XValidation, so there is precedent for codifying these invariants.
- XValidation must be attached at a struct scope that can “see” all referenced fields (potentially the root `Infrastructure` type and/or `OpenStackPlatformStatus` for status-only enforcement).
- After adding validations, regenerate CRDs/openapi artifacts so the rules appear in the generated manifests.

## Fix Focus Areas
- config/v1/types_infrastructure.go[1161-1217]
- config/v1/types_infrastructure.go[1229-1333]
- config/v1/types_infrastructure.go[1273-1310]
- config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml[2186-2234]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

// +kubebuilder:validation:MaxItems=10
// +listType=atomic
// +optional
AdditionalAPIServerIPs []IP `json:"additionalAPIServerIPs,omitempty"`
Comment on lines +1203 to +1206

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. Additional*ips missing featuregate marker 📘 Rule violation § Compliance

New stable config/v1 API fields were added without a +openshift:enable:FeatureGate=<Name> marker
immediately above them. This violates the requirement to gate new fields in stable APIs to preserve
API compatibility expectations.
Agent Prompt
## Issue description
New stable v1 API fields were added without a `+openshift:enable:FeatureGate=<FeatureGateName>` marker directly above the field declarations.

## Issue Context
These fields are in `config/v1` (stable) API structs and must be gated per policy.

## Fix Focus Areas
- config/v1/types_infrastructure.go[1197-1217]
- config/v1/types_infrastructure.go[1273-1295]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +1205 to +1206

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Additional*ips omit behavior undocumented 📜 Skill insight ✧ Quality

The new optional fields AdditionalAPIServerIPs and AdditionalIngressIPs do not document what
happens when they are omitted. This makes API behavior unclear for clients and violates the required
omission-behavior documentation rule.
Agent Prompt
## Issue description
New optional API fields were added but their doc comments do not explain behavior when the fields are omitted.

## Issue Context
For optional fields (`+optional` and/or pointer/omitempty), documentation must explicitly state what happens when the field is not provided (e.g., "When omitted...").

## Fix Focus Areas
- config/v1/types_infrastructure.go[1197-1217]
- config/v1/types_infrastructure.go[1273-1295]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +1203 to +1206

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. maxitems=10 not documented 📜 Skill insight ✧ Quality

The new list fields include +kubebuilder:validation:MaxItems=10 but the field comments do not
mention this item-count constraint. This violates the requirement to document kubebuilder constraint
markers in field comments.
Agent Prompt
## Issue description
Fields with kubebuilder constraint markers must document those constraints in the human-readable comment text.

## Issue Context
`AdditionalAPIServerIPs` and `AdditionalIngressIPs` have `+kubebuilder:validation:MaxItems=10`, but their doc comments do not state the maximum number of items.

## Fix Focus Areas
- config/v1/types_infrastructure.go[1197-1217]
- config/v1/types_infrastructure.go[1273-1295]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


// additionalIngressIPs is a list of additional IP addresses that route to
// the default ingress controller on separate networks. These are used when
// a user-managed load balancer exposes the ingress controller on multiple
// networks simultaneously. Each entry must be a valid IP address. This
// field is only valid when loadBalancer.type is set to UserManaged.
//
// +kubebuilder:validation:MaxItems=10
// +listType=atomic
// +optional
AdditionalIngressIPs []IP `json:"additionalIngressIPs,omitempty"`

Comment on lines +1197 to +1218

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- target type and nearby declarations ---'
rg -n -C 8 'AdditionalAPIServerIPs|AdditionalIngressIPs|type OpenStackPlatformSpec|type OpenStackPlatformStatus|LoadBalancer|DNSRecordsType' config/v1/types_infrastructure.go

printf '%s\n' '--- all related validation rules and field references ---'
rg -n -C 5 'additionalAPIServerIPs|additionalIngressIPs|loadBalancer\.type|platformSpec\.openstack|platformStatus\.openstack|controlPlaneTopology must match' .

printf '%s\n' '--- Infrastructure and ControllerConfig declarations ---'
rg -n -C 12 'type Infrastructure struct|type ControllerConfig struct|x-kubernetes-validations' config/v1

Repository: openshift/api

Length of output: 50370


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- target source matches only ---'
rg -n -C 12 'AdditionalAPIServerIPs|AdditionalIngressIPs|type OpenStackPlatformSpec|type OpenStackPlatformStatus|LoadBalancer|DNSRecordsType' config/v1/types_infrastructure.go

printf '%s\n' '--- Infrastructure and ControllerConfig source declarations ---'
rg -n -C 15 'type Infrastructure struct|type ControllerConfig struct|platformSpec|platformStatus|controlPlaneTopology must match' config/v1 --glob '*.go'

printf '%s\n' '--- current change summary ---'
git diff --stat -- config/v1/types_infrastructure.go
git diff -- config/v1/types_infrastructure.go | sed -n '1,220p'

Repository: openshift/api

Length of output: 50369


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- exact change ---'
git diff --unified=8 -- config/v1/types_infrastructure.go

printf '%s\n' '--- non-generated consumers and validators ---'
rg -n -C 6 'AdditionalAPIServerIPs|AdditionalIngressIPs|additionalAPIServerIPs|additionalIngressIPs' \
  --glob '!config/v1/zz_generated.crd-manifests/**' \
  --glob '!**/vendor/**' .

printf '%s\n' '--- relevant generated schema fragments ---'
python3 - <<'PY'
from pathlib import Path

for p in Path("config/v1/zz_generated.crd-manifests").glob("*.yaml"):
    text = p.read_text(errors="replace")
    hits = []
    for needle in ("additionalAPIServerIPs:", "additionalIngressIPs:"):
        start = 0
        while True:
            i = text.find(needle, start)
            if i < 0:
                break
            line = text.count("\n", 0, i) + 1
            block = text[i:i+900].splitlines()[:18]
            hits.append((line, needle, block))
            start = i + len(needle)
    if hits:
        print(f"FILE {p}")
        for line, needle, block in hits:
            print(f"LINE {line} {needle}")
            print("\n".join(block))
PY

Repository: openshift/api

Length of output: 50370


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- target diff additions and removals ---'
git diff --unified=0 -- config/v1/types_infrastructure.go \
  | rg '^(diff|@@|[+-][^+-])' | sed -n '1,180p'

printf '%s\n' '--- consumers in Go and validation markers ---'
rg -n -C 5 'AdditionalAPIServerIPs|AdditionalIngressIPs|additionalAPIServerIPs|additionalIngressIPs' \
  config machineconfiguration --glob '*.go' --glob '!zz_generated/**' --glob '!vendor/**'

printf '%s\n' '--- ControllerConfig source shape ---'
rg -n -C 14 'type ControllerConfig struct|Infrastructure|platformSpec|platformStatus|controlPlaneTopology' \
  machineconfiguration --glob '*.go' --glob '!zz_generated/**'

printf '%s\n' '--- Infrastructure CRD files ---'
find config/v1/zz_generated.crd-manifests config/v1/zz_generated.featuregated-crd-manifests \
  -type f -iname '*infrastructures*' -print | head -20

Repository: openshift/api

Length of output: 23321


🏁 Script executed:

#!/bin/bash
set -eu

python3 - <<'PY'
from pathlib import Path
import re

source = Path("config/v1/types_infrastructure.go").read_text()

def type_body(name):
    m = re.search(r"(?m)^type " + re.escape(name) + r"\s+struct\s*\{", source)
    if not m:
        raise SystemExit(f"missing {name}")
    start = m.end()
    depth = 1
    i = start
    while depth and i < len(source):
        if source[i] == "{":
            depth += 1
        elif source[i] == "}":
            depth -= 1
        i += 1
    return source[start:i-1]

for name in ("OpenStackPlatformSpec", "OpenStackPlatformStatus"):
    body = type_body(name)
    print(f"{name}:")
    for field in ("LoadBalancer", "AdditionalAPIServerIPs", "AdditionalIngressIPs"):
        print(f"  {field}: {'yes' if re.search(r'(?m)^\\s*' + field + r'\\b', body) else 'no'}")
    print("  loadBalancer.type validation markers:",
          "yes" if "loadBalancer.type" in body else "no")

print("Infrastructure root spec/status validation markers:")
infra_head = source[source.index("type Infrastructure struct")-1000:source.index("type Infrastructure struct")]
for needle in ("self.spec.controlPlaneTopology", "self.status.controlPlaneTopology"):
    print(f"  {needle}: {'yes' if needle in infra_head else 'no'}")

print("Source validation markers mentioning additional fields:")
for line_no, line in enumerate(source.splitlines(), 1):
    if ("additionalAPIServerIPs" in line or "additionalIngressIPs" in line) and "XValidation" in line:
        print(f"  {line_no}: {line.strip()}")
PY

printf '%s\n' '--- generated validation expressions in the default Infrastructure CRD ---'
rg -n -C 3 \
  'additionalAPIServerIPs|additionalIngressIPs|spec\.controlPlaneTopology must match|self\.spec\.controlPlaneTopology|self\.status\.controlPlaneTopology' \
  config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml

Repository: openshift/api

Length of output: 428


🏁 Script executed:

#!/bin/bash
set -eu

python3 - <<'PY'
from pathlib import Path
import re

source = Path("config/v1/types_infrastructure.go").read_text()

def type_body(name):
    m = re.search(r"(?m)^type " + re.escape(name) + r"\s+struct\s*\{", source)
    if not m:
        raise SystemExit(f"missing {name}")
    start = m.end()
    depth = 1
    i = start
    while depth and i < len(source):
        if source[i] == "{":
            depth += 1
        elif source[i] == "}":
            depth -= 1
        i += 1
    return source[start:i-1]

for name in ("OpenStackPlatformSpec", "OpenStackPlatformStatus"):
    body = type_body(name)
    print(f"{name}:")
    for field in ("LoadBalancer", "AdditionalAPIServerIPs", "AdditionalIngressIPs"):
        present = bool(re.search(r"(?m)^\s*" + field + r"\b", body))
        print(f"  {field}: {'yes' if present else 'no'}")
    print("  loadBalancer.type validation markers:",
          "yes" if "loadBalancer.type" in body else "no")

print("Infrastructure root spec/status validation markers:")
infra_pos = source.index("type Infrastructure struct")
infra_head = source[max(0, infra_pos - 1200):infra_pos]
for needle in ("self.spec.controlPlaneTopology", "self.status.controlPlaneTopology"):
    print(f"  {needle}: {'yes' if needle in infra_head else 'no'}")

print("Source validation markers mentioning additional fields:")
for line_no, line in enumerate(source.splitlines(), 1):
    if ("additionalAPIServerIPs" in line or "additionalIngressIPs" in line) and "XValidation" in line:
        print(f"  {line_no}: {line.strip()}")
PY

printf '%s\n' '--- generated validation expressions in the default Infrastructure CRD ---'
rg -n -C 3 \
  'additionalAPIServerIPs|additionalIngressIPs|spec\.controlPlaneTopology must match|self\.spec\.controlPlaneTopology|self\.status\.controlPlaneTopology' \
  config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-Default.crd.yaml

Repository: openshift/api

Length of output: 3352


Enforce the loadBalancer.type prerequisite for the additional OpenStack IP fields.

OpenStackPlatformSpec has no LoadBalancer; it exists only in OpenStackPlatformStatus. The generated CRD validates only IP format and list size. It accepts these fields when loadBalancer.type is not UserManaged.

Add an Infrastructure-level CEL rule that checks both fields against status.platformStatus.openstack.loadBalancer.type, while allowing the initial object before status exists. Otherwise, document the component that enforces this prerequisite.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@config/v1/types_infrastructure.go` around lines 1197 - 1218, Add an
Infrastructure-level CEL validation rule covering AdditionalAPIServerIPs and
AdditionalIngressIPs that requires
status.platformStatus.openstack.loadBalancer.type to be UserManaged, while
permitting objects whose status or OpenStack load balancer status is not yet
present. Ensure the generated CRD enforces this prerequisite for both fields
rather than validating only IP format and list size.

// machineNetworks are IP networks used to connect all the OpenShift cluster
// nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6,
// for example "10.0.0.0/8" or "fd00::/8".
Expand Down Expand Up @@ -1248,6 +1270,30 @@ type OpenStackPlatformStatus struct {
// +listType=atomic
IngressIPs []string `json:"ingressIPs"`

// additionalAPIServerIPs is a list of additional IP addresses to contact
// the Kubernetes API server on separate networks. These are used when a
// user-managed load balancer exposes the API server on multiple networks
// simultaneously. Each entry must be a valid IP address. This field is
// only valid when loadBalancer.type is set to UserManaged.
//
// +kubebuilder:validation:Format=ip
// +kubebuilder:validation:MaxItems=10
// +listType=atomic
// +optional
AdditionalAPIServerIPs []string `json:"additionalAPIServerIPs,omitempty"`

// additionalIngressIPs is a list of additional IP addresses that route to
// the default ingress controller on separate networks. These are used when
// a user-managed load balancer exposes the ingress controller on multiple
// networks simultaneously. Each entry must be a valid IP address. This
// field is only valid when loadBalancer.type is set to UserManaged.
//
// +kubebuilder:validation:Format=ip
// +kubebuilder:validation:MaxItems=10
// +listType=atomic
// +optional
AdditionalIngressIPs []string `json:"additionalIngressIPs,omitempty"`

Comment on lines +1273 to +1296

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Add CEL enforcement for the "loadBalancer.type" constraint on the status fields.

Unlike the spec fields, loadBalancer is a real sibling field on OpenStackPlatformStatus (line 1309). The doc comments for AdditionalAPIServerIPs and AdditionalIngressIPs here state the field "is only valid when loadBalancer.type is set to UserManaged," but no x-kubernetes-validations rule enforces it, even though the same-struct pattern is already used for DNSRecordsType (dnsRecordsType may only be set to External when loadBalancer.type is UserManaged).

Add a similar +kubebuilder:validation:XValidation rule on AdditionalAPIServerIPs/AdditionalIngressIPs (or on the struct) to prevent silently-ignored values when loadBalancer.type is not UserManaged.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@config/v1/types_infrastructure.go` around lines 1273 - 1296, Add CEL
validation for OpenStackPlatformStatus so AdditionalAPIServerIPs and
AdditionalIngressIPs are accepted only when the sibling loadBalancer.type is
UserManaged, following the existing DNSRecordsType XValidation pattern. Apply
the rule to both status fields or their containing struct while preserving
current IP and item-count validations.

// nodeDNSIP is the IP address for the internal DNS used by the
// nodes. Unlike the one managed by the DNS operator, `NodeDNSIP`
// provides name resolution for the nodes themselves. There is no DNS-as-a-service for
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,44 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIPs:
description: |-
apiServerInternalIPs are the IP addresses to contact the Kubernetes API
Expand Down Expand Up @@ -2145,6 +2183,32 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIP:
description: |-
apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,44 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIPs:
description: |-
apiServerInternalIPs are the IP addresses to contact the Kubernetes API
Expand Down Expand Up @@ -2317,6 +2355,32 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIP:
description: |-
apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,44 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
items:
description: IP is an IP address (for example, "10.0.0.0"
or "fd00::").
maxLength: 39
minLength: 1
type: string
x-kubernetes-validations:
- message: value must be a valid IP address
rule: isIP(self)
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIPs:
description: |-
apiServerInternalIPs are the IP addresses to contact the Kubernetes API
Expand Down Expand Up @@ -2302,6 +2340,32 @@ spec:
description: openstack contains settings specific to the OpenStack
infrastructure provider.
properties:
additionalAPIServerIPs:
description: |-
additionalAPIServerIPs is a list of additional IP addresses to contact
the Kubernetes API server on separate networks. These are used when a
user-managed load balancer exposes the API server on multiple networks
simultaneously. Each entry must be a valid IP address. This field is
only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
additionalIngressIPs:
description: |-
additionalIngressIPs is a list of additional IP addresses that route to
the default ingress controller on separate networks. These are used when
a user-managed load balancer exposes the ingress controller on multiple
networks simultaneously. Each entry must be a valid IP address. This
field is only valid when loadBalancer.type is set to UserManaged.
format: ip
items:
type: string
maxItems: 10
type: array
x-kubernetes-list-type: atomic
apiServerInternalIP:
description: |-
apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used
Expand Down
Loading