Skip to content

Commit aec7490

Browse files
lmicciniclaude
andcommitted
Drop rabbitmq-cluster-operator dependency and manage RabbitMQ directly
Remove the dependency on the external rabbitmq-cluster-operator and have the infra-operator manage RabbitMQ StatefulSets, Services, ConfigMaps, and Secrets directly. Core controller changes: - Direct StatefulSet management with volume mounts, config generation, and TLS support (client and inter-node) - Service creation for client (AMQP/AMQPS) and headless node discovery - ConfigMap generation for server config, plugins, and config-data - Secret management for default-user credentials and Erlang cookie - PodDisruptionBudget for multi-replica deployments - Fix stale ownerReferences in volumeClaimTemplates from adopted StatefulSets (orphan-delete + recreate with annotation-based storage class preservation) - Label pods with skipPreStopChecks before StatefulSet deletion so the Downward API volume is populated when cascade deletion triggers the PreStop hook, preventing 7-day termination hangs - Set ObservedGeneration at end of reconciliation so consumers only see it after the spec has been fully processed - Add nil-safe DefaultUser checks in checkClusterReadiness and all reconcile-delete paths to prevent nil dereference during startup - Handle error from helper.NewHelper in sub-resource controllers Version upgrade workflow (3.x to 4.x): - State machine with phases: None -> DeletingResources -> WaitingForCluster -> None - Detect targetVersion changes and trigger storage wipe when crossing major versions (required by RabbitMQ for 3.x -> 4.x upgrades) - Set wipeReason=VersionUpgrade in status to track upgrade progress - Delete StatefulSet to stop all pods atomically, then recreate with a wipe-data init container that clears /var/lib/rabbitmq on the existing PVs (marker files prevent re-wipes across pod restarts) - Track currentVersion in status after successful upgrade - Reject version downgrades in validation webhook - Reject scale-down in validation webhook (both RabbitMq and SpecCore) Queue type migration (Mirrored to Quorum): - Support migrating from classic mirrored (ha-all policy) queues to quorum queues via spec.queueType change - Trigger storage wipe with wipeReason=QueueTypeMigration - Manage ha-all policy lifecycle: apply for Mirrored (replicas > 1), remove when transitioning away from Mirrored - Force queueType from Mirrored to Quorum in defaulting webhook when targetVersion is 4.x+, since mirrored queues are not supported in RabbitMQ 4.x. This enables the openstack-operator to upgrade from 3.x (Mirrored) to 4.x and have the migration handled automatically - Reject Mirrored+4.x in validation webhook as a safety net after defaulting AMQP proxy sidecar: - Python-based TCP proxy injected as a sidecar container when status.proxyRequired is true (after version upgrade or queue migration) - Rewrite AMQP queue.declare frames to force durable=True and x-queue-type=quorum, and exchange.declare frames to force durable=True - Listen on port 5672 (plain) or 5671 (TLS) depending on TLS config - Forward connections to RabbitMQ backend on port 5673 - Remove via clients-reconfigured annotation once consumers reconnect - RabbitMQProxyActive condition provides visibility into proxy state with actionable message explaining how to clear it - Include liveness/readiness probes and TLS certificate mounting Migration from rabbitmq-cluster-operator: - Detect migration by checking for an existing RabbitmqCluster CR with the same name; if none is found (or the CRD is not installed), the controller skips all migration logic and sets OldCRCleaned=True, allowing both operators to run side-by-side managing their own independent resources without conflict - Reparent existing StatefulSets, Services, and Secrets from old RabbitmqCluster owner to new RabbitMq CR - Strip old ownerReferences from PVCs before deleting old CR to prevent cascade garbage collection - Clean up old RabbitmqCluster CR after successful adoption - Fix stale volumeClaimTemplate ownerReferences that cause new PVCs to be garbage-collected when scaling up adopted StatefulSets - Migrate deprecated fields (persistence, rabbitmq, override.service) to new fields in webhook; remove CRD-level default from storage to avoid double-defaulting during migration Transport URL: - URL-encode username and password in transport URL to handle special characters in user-provided credentials Testing: - Functional tests (envtest): RabbitMQ controller reconciliation, RabbitMQPolicy lifecycle, TransportURL (plain, TLS, custom user/vhost, credential rotation), VCT fix, combined version+queue migration, proxy sidecar, operator coexistence (OldCRCleaned set when no old CR exists, unrelated RabbitmqCluster CRs not touched), webhook migration (persistence, config, override.service field migration with defaults) - Transport URL secret unit tests for password URL-encoding with special characters - Kuttl integration tests: basic cluster deployment, cluster resource ownership, credential rotation with cleanup-blocked finalizer, deletion with dependent resources, plugin enable/disable, policy enforcement via rabbitmqctl, queue migration (Mirrored to Quorum) with AMQP proxy rewrite verification (classic non-durable -> quorum durable), resource management (vhost/user/policy), scale-up with PDB, TLS configuration, TLS TransportURL, custom TransportURL, migration from old operator, version upgrades (3.9->4.2 with/without TLS, Mirrored upgrade), operator coexistence (both operators managing independent clusters without interference) - Kuttl tests use quay.io/openstack-k8s-operators/rabbitmq:3.9 for 3.x and quay.io/podified-antelope-centos9/openstack-rabbitmq:current-podified for 4.x Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e06fc1a commit aec7490

190 files changed

Lines changed: 12761 additions & 2136 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,7 @@ go.work.sum
4545
.coverage
4646
__pycache__/
4747
*.pyc
48+
49+
# claude and AI tools
50+
.claude
51+
CLAUDE.md

Makefile

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,18 @@ tidy: ## Run go mod tidy on every mod file in the repo
121121
PROCS?=$(shell expr $(shell nproc --ignore 2) / 2)
122122
PROC_CMD = --procs ${PROCS}
123123

124+
# Skip instanceha tests if --focus or --skip is used (focused test run)
125+
ifeq (,$(findstring --focus,$(GINKGO_ARGS))$(findstring --skip,$(GINKGO_ARGS)))
126+
INSTANCEHA_DEP = test-instanceha
127+
else
128+
INSTANCEHA_DEP =
129+
endif
130+
124131
.PHONY: test
125-
test: manifests generate gowork fmt vet envtest ginkgo test-instanceha ## Run tests.
132+
test: manifests generate gowork fmt vet envtest ginkgo $(INSTANCEHA_DEP) ## Run tests.
126133
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) -v debug --bin-dir $(LOCALBIN) use $(ENVTEST_K8S_VERSION) -p path)" \
127134
OPERATOR_TEMPLATES="$(PWD)/templates" \
128-
$(GINKGO) --trace --cover --coverpkg=./pkg/...,./internal/...,./apis/network/v1beta1/...,./apis/rabbitmq/v1beta1/... --coverprofile cover.out --covermode=atomic ${PROC_CMD} $(GINKGO_ARGS) ./test/... ./apis/network/... ./apis/rabbitmq/... ./internal/webhook/...
135+
$(GINKGO) --trace --cover --coverpkg=./pkg/...,./internal/...,./apis/network/v1beta1/...,./apis/rabbitmq/v1beta1/... --coverprofile cover.out --covermode=atomic ${PROC_CMD} $(GINKGO_ARGS) ./test/... ./apis/network/... ./apis/rabbitmq/... ./internal/webhook/... ./internal/controller/...
129136

130137
.PHONY: test-instanceha
131138
test-instanceha: ## Run instanceha tests.

apis/bases/rabbitmq.openstack.org_rabbitmqs.yaml

Lines changed: 209 additions & 328 deletions
Large diffs are not rendered by default.

apis/go.mod

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ require (
66
github.com/go-logr/logr v1.4.3
77
github.com/onsi/gomega v1.39.1
88
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260331122750-ecff41ebb61d
9-
github.com/rabbitmq/cluster-operator/v2 v2.16.0
109
k8s.io/api v0.31.14
1110
k8s.io/apiextensions-apiserver v0.33.2
1211
k8s.io/apimachinery v0.31.14
@@ -19,6 +18,7 @@ require (
1918
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2019
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
2120
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
21+
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
2222
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
2323
github.com/fsnotify/fsnotify v1.9.0 // indirect
2424
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
@@ -90,9 +90,6 @@ replace k8s.io/code-generator => k8s.io/code-generator v0.31.14 //allow-merging
9090

9191
replace k8s.io/component-base => k8s.io/component-base v0.31.14 //allow-merging
9292

93-
// custom RabbitmqClusterSpecCore for OpenStackControlplane (v2.16.0_patches)
94-
replace github.com/rabbitmq/cluster-operator/v2 => github.com/openstack-k8s-operators/rabbitmq-cluster-operator/v2 v2.6.1-0.20250929174222-a0d328fa4dec //allow-merging
95-
9693
replace k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20250627150254-e9823e99808e //allow-merging
9794

9895
replace github.com/cert-manager/cmctl/v2 => github.com/cert-manager/cmctl/v2 v2.1.2-0.20241127223932-88edb96860cf //allow-merging

apis/go.sum

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
21
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
32
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
43
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -86,8 +85,6 @@ github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e h1:E1OdwSpqWuDPCedyU
8685
github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
8786
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260331122750-ecff41ebb61d h1:qbH09BzypLy1+N133JVgfkRmDZaQKpDLwi/InqqOzGM=
8887
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260331122750-ecff41ebb61d/go.mod h1:XUUV+h1nZC4kra5oF+cXPkviWYJ3ELhccHxnVO7CvQQ=
89-
github.com/openstack-k8s-operators/rabbitmq-cluster-operator/v2 v2.6.1-0.20250929174222-a0d328fa4dec h1:saovr368HPAKHN0aRPh8h8n9s9dn3d8Frmfua0UYRlc=
90-
github.com/openstack-k8s-operators/rabbitmq-cluster-operator/v2 v2.6.1-0.20250929174222-a0d328fa4dec/go.mod h1:Nh2NEePLjovUQof2krTAg4JaAoLacqtPTZQXK6izNfg=
9188
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
9289
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
9390
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

apis/rabbitmq/v1beta1/conditions.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ import (
1919
condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
2020
)
2121

22+
// RabbitMQ Condition Types used by API objects.
23+
const (
24+
// RabbitMQProxyActiveCondition indicates that the AMQP proxy sidecar is running.
25+
// Status=True means the proxy is active and must be cleared by setting the
26+
// clients-reconfigured annotation. Status=False means no proxy is running.
27+
RabbitMQProxyActiveCondition condition.Type = "RabbitMQProxyActive"
28+
)
29+
2230
// TransportURL Condition Types used by API objects.
2331
const (
2432
// TransportURLReadyCondition Status=True condition which indicates if TransportURL is configured and operational
@@ -39,6 +47,17 @@ const ()
3947

4048
// Common Messages used by API objects.
4149
const (
50+
//
51+
// RabbitMQProxyActive condition messages
52+
//
53+
54+
// RabbitMQProxyActiveMessage is the message when the proxy is active
55+
RabbitMQProxyActiveMessage = "AMQP proxy sidecar is active for queue migration. " +
56+
"To remove it, set annotation '%s: \"true\"' on the RabbitMq CR after all clients have been reconfigured for quorum queues"
57+
58+
// RabbitMQProxyInactiveMessage is the message when the proxy is not active
59+
RabbitMQProxyInactiveMessage = "AMQP proxy sidecar is not active"
60+
4261
//
4362
// TransportURLReady condition messages
4463
//
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
/*
2+
Licensed under the Apache License, Version 2.0 (the "License");
3+
you may not use this file except in compliance with the License.
4+
You may obtain a copy of the License at
5+
6+
http://www.apache.org/licenses/LICENSE-2.0
7+
8+
Unless required by applicable law or agreed to in writing, software
9+
distributed under the License is distributed on an "AS IS" BASIS,
10+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
See the License for the specific language governing permissions and
12+
limitations under the License.
13+
*/
14+
15+
package v1beta1
16+
17+
// DEPRECATED TYPES
18+
// These types are local mirrors of the old rabbitmq-cluster-operator types,
19+
// kept only for backward compatibility with existing CRs during migration.
20+
// They will be removed in a future release once all CRs have been migrated
21+
// to use the new explicit fields in RabbitMqSpecCore.
22+
23+
import (
24+
appsv1 "k8s.io/api/apps/v1"
25+
corev1 "k8s.io/api/core/v1"
26+
"k8s.io/apimachinery/pkg/api/resource"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
)
29+
30+
// DeprecatedEmbeddedLabelsAnnotations is an embedded subset of the fields included in
31+
// k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta. Only labels and annotations are included.
32+
type DeprecatedEmbeddedLabelsAnnotations struct {
33+
// Map of string keys and values that can be used to organize and categorize (scope and select) objects.
34+
// +optional
35+
Labels map[string]string `json:"labels,omitempty"`
36+
// Annotations is an unstructured key value map stored with a resource.
37+
// +optional
38+
Annotations map[string]string `json:"annotations,omitempty"`
39+
}
40+
41+
// DeprecatedStatefulSetOverride mirrors the old rabbitmq-cluster-operator StatefulSet type.
42+
// Used for webhook validation of the override.statefulSet JSON field.
43+
type DeprecatedStatefulSetOverride struct {
44+
// +optional
45+
*DeprecatedEmbeddedLabelsAnnotations `json:"metadata,omitempty"`
46+
// +optional
47+
Spec *DeprecatedStatefulSetSpec `json:"spec,omitempty"`
48+
}
49+
50+
// DeprecatedStatefulSetSpec mirrors a subset of the old rabbitmq-cluster-operator StatefulSetSpec type.
51+
type DeprecatedStatefulSetSpec struct {
52+
// +optional
53+
Replicas *int32 `json:"replicas,omitempty"`
54+
// +optional
55+
Selector *metav1.LabelSelector `json:"selector,omitempty"`
56+
// +optional
57+
Template *DeprecatedPodTemplateSpec `json:"template,omitempty"`
58+
// +optional
59+
VolumeClaimTemplates []corev1.PersistentVolumeClaim `json:"volumeClaimTemplates,omitempty"`
60+
// +optional
61+
ServiceName string `json:"serviceName,omitempty"`
62+
// +optional
63+
PodManagementPolicy appsv1.PodManagementPolicyType `json:"podManagementPolicy,omitempty"`
64+
// +optional
65+
UpdateStrategy *appsv1.StatefulSetUpdateStrategy `json:"updateStrategy,omitempty"`
66+
// +optional
67+
MinReadySeconds int32 `json:"minReadySeconds,omitempty"`
68+
// +optional
69+
PersistentVolumeClaimRetentionPolicy *appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy `json:"persistentVolumeClaimRetentionPolicy,omitempty"`
70+
}
71+
72+
// DeprecatedPodTemplateSpec mirrors the old rabbitmq-cluster-operator PodTemplateSpec type.
73+
type DeprecatedPodTemplateSpec struct {
74+
// +optional
75+
*DeprecatedEmbeddedObjectMeta `json:"metadata,omitempty"`
76+
// +optional
77+
Spec *corev1.PodSpec `json:"spec,omitempty"`
78+
}
79+
80+
// DeprecatedEmbeddedObjectMeta mirrors the old rabbitmq-cluster-operator EmbeddedObjectMeta type.
81+
type DeprecatedEmbeddedObjectMeta struct {
82+
// +optional
83+
Name string `json:"name,omitempty"`
84+
// +optional
85+
Namespace string `json:"namespace,omitempty"`
86+
// +optional
87+
Labels map[string]string `json:"labels,omitempty"`
88+
// +optional
89+
Annotations map[string]string `json:"annotations,omitempty"`
90+
}
91+
92+
// DeprecatedPersistenceSpec mirrors the old rabbitmq-cluster-operator RabbitmqClusterPersistenceSpec type.
93+
type DeprecatedPersistenceSpec struct {
94+
// The name of the StorageClass to claim a PersistentVolume from.
95+
StorageClassName *string `json:"storageClassName,omitempty"`
96+
// The requested size of the persistent volume attached to each Pod in the RabbitmqCluster.
97+
// The format of this field matches that defined by kubernetes/apimachinery.
98+
// See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
99+
// +kubebuilder:default:="10Gi"
100+
Storage *resource.Quantity `json:"storage,omitempty"`
101+
}
102+
103+
// DeprecatedRabbitmqConfigSpec mirrors the old rabbitmq-cluster-operator RabbitmqClusterConfigurationSpec type.
104+
type DeprecatedRabbitmqConfigSpec struct {
105+
// List of plugins to enable in addition to essential plugins: rabbitmq_management,
106+
// rabbitmq_prometheus, and rabbitmq_peer_discovery_k8s.
107+
// +optional
108+
// +kubebuilder:validation:MaxItems=100
109+
AdditionalPlugins []string `json:"additionalPlugins,omitempty"`
110+
// Modify to add to the rabbitmq.conf file in addition to default configurations set by the operator.
111+
// Modifying this property on an existing RabbitmqCluster will trigger a StatefulSet rolling restart
112+
// and will cause rabbitmq downtime.
113+
// For more information on this config, see https://www.rabbitmq.com/configure.html#config-file
114+
// +optional
115+
// +kubebuilder:validation:MaxLength=100000
116+
AdditionalConfig string `json:"additionalConfig,omitempty"`
117+
// Specify any rabbitmq advanced.config configurations to apply to the cluster.
118+
// For more information on advanced config, see https://www.rabbitmq.com/configure.html#advanced-config-file
119+
// +optional
120+
// +kubebuilder:validation:MaxLength=100000
121+
AdvancedConfig string `json:"advancedConfig,omitempty"`
122+
// Modify to add to the rabbitmq-env.conf file. Modifying this property on an existing
123+
// RabbitmqCluster will trigger a StatefulSet rolling restart and will cause rabbitmq downtime.
124+
// For more information on env config, see https://www.rabbitmq.com/man/rabbitmq-env.conf.5.html
125+
// +optional
126+
// +kubebuilder:validation:MaxLength=100000
127+
EnvConfig string `json:"envConfig,omitempty"`
128+
// Erlang Inet configuration to apply to the Erlang VM running rabbit.
129+
// See also: https://www.erlang.org/doc/apps/erts/inet_cfg.html
130+
// +optional
131+
// +kubebuilder:validation:MaxLength=2000
132+
ErlangInetConfig string `json:"erlangInetConfig,omitempty"`
133+
}
134+
135+
// DeprecatedSecretBackendSpec mirrors the old rabbitmq-cluster-operator SecretBackend type.
136+
type DeprecatedSecretBackendSpec struct {
137+
// +optional
138+
ExternalSecret *corev1.LocalObjectReference `json:"externalSecret,omitempty"`
139+
// +optional
140+
Vault *DeprecatedVaultSpec `json:"vault,omitempty"`
141+
}
142+
143+
// DeprecatedVaultSpec mirrors the old rabbitmq-cluster-operator VaultSpec type.
144+
// VaultSpec will add Vault annotations (see https://www.vaultproject.io/docs/platform/k8s/injector/annotations)
145+
// to RabbitMQ Pods. It requires a Vault Agent Sidecar Injector
146+
// (https://www.vaultproject.io/docs/platform/k8s/injector) to be installed in the K8s cluster.
147+
type DeprecatedVaultSpec struct {
148+
// Role in Vault.
149+
// If vault.defaultUserPath is set, this role must have capability to read the pre-created default user
150+
// credential in Vault.
151+
// If vault.tls is set, this role must have capability to create and update certificates in the Vault PKI
152+
// engine for the domains "<namespace>" and "<namespace>.svc".
153+
// +optional
154+
Role string `json:"role,omitempty"`
155+
// Vault annotations that override the Vault annotations set by the cluster-operator.
156+
// For a list of valid Vault annotations, see
157+
// https://www.vaultproject.io/docs/platform/k8s/injector/annotations
158+
// +optional
159+
Annotations map[string]string `json:"annotations,omitempty"`
160+
// Path in Vault to access a KV (Key-Value) secret with the fields username and password
161+
// for the default user. For example "secret/data/rabbitmq/config".
162+
// +optional
163+
DefaultUserPath string `json:"defaultUserPath,omitempty"`
164+
// Sidecar container that updates the default user's password in RabbitMQ when it changes in Vault.
165+
// Additionally, it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by rabbitmqadmin CLI).
166+
// Set to empty string to disable the sidecar container.
167+
// +optional
168+
DefaultUserUpdaterImage string `json:"defaultUserUpdaterImage,omitempty"`
169+
// +optional
170+
TLS *DeprecatedVaultTLSSpec `json:"tls,omitempty"`
171+
}
172+
173+
// DeprecatedVaultTLSSpec mirrors the old rabbitmq-cluster-operator VaultSpec TLS fields.
174+
type DeprecatedVaultTLSSpec struct {
175+
// Path in Vault PKI engine. For example "pki/issue/hashicorp-com". Required.
176+
// +optional
177+
PkiIssuerPath string `json:"pkiIssuerPath,omitempty"`
178+
// Specifies an optional path to retrieve the root CA from vault.
179+
// Useful if certificates are issued by an intermediate CA.
180+
// +optional
181+
PkiRootPath string `json:"pkiRootPath,omitempty"`
182+
// Specifies the requested Subject Alternative Names (SANs), in a comma-delimited list.
183+
// These will be appended to the SANs added by the cluster-operator.
184+
// +optional
185+
AltNames string `json:"altNames,omitempty"`
186+
// Specifies the requested certificate Common Name (CN).
187+
// Defaults to <serviceName>.<namespace>.svc if not provided.
188+
// +optional
189+
CommonName string `json:"commonName,omitempty"`
190+
// Specifies the requested IP Subject Alternative Names, in a comma-delimited list.
191+
// +optional
192+
IpSans string `json:"ipSans,omitempty"`
193+
}

0 commit comments

Comments
 (0)