Skip to content

Commit 76db895

Browse files
committed
Upgrade to operator-sdk 1.41.1
Rescaffold the nova-operator to operator-sdk 1.41.1, which includes: - Reorganize project structure (pkg/ -> internal/) - Move webhook implementations to internal/webhook/v1beta1/ - Add new cmd/main.go entrypoint with updated controller initialization - Update RBAC, certmanager, and prometheus configurations - Enhance network policies for metrics and webhook traffic - Remove auto-generated test suite scaffolding - Update build workflow and Dockerfile to version 1.41.1 This upgrade modernizes the operator structure and aligns with the latest operator-sdk best practices. Jira: OSPRH-21969 Depends-On: openstack-k8s-operators/openstack-operator#1683
1 parent 0ec969e commit 76db895

File tree

144 files changed

+2549
-1033
lines changed

Some content is hidden

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

144 files changed

+2549
-1033
lines changed

.ci-operator.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
build_root_image:
22
name: tools
33
namespace: openstack-k8s-operators
4-
tag: ci-build-root-golang-1.24-sdk-1.31
4+
tag: ci-build-root-golang-1.24-sdk-1.41.1

.github/workflows/force-bump-pr-manual.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ jobs:
99
with:
1010
operator_name: nova
1111
branch_name: ${{ github.ref_name }}
12-
custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.24-sdk-1.31
12+
custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.24-sdk-1.41.1
1313
secrets:
1414
FORCE_BUMP_PULL_REQUEST_PAT: ${{ secrets.FORCE_BUMP_PULL_REQUEST_PAT }}

.github/workflows/force-bump-pr-scheduled.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ jobs:
1010
uses: openstack-k8s-operators/openstack-k8s-operators-ci/.github/workflows/force-bump-branches.yaml@main
1111
with:
1212
operator_name: nova
13-
custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.24-sdk-1.31
13+
custom_image: quay.io/openstack-k8s-operators/openstack-k8s-operators-ci-build-tools:golang-1.24-sdk-1.41.1
1414
secrets:
1515
FORCE_BUMP_PULL_REQUEST_PAT: ${{ secrets.FORCE_BUMP_PULL_REQUEST_PAT }}

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ RUN mkdir -p ${DEST_ROOT}/usr/local/bin/
2323
RUN if [ ! -f $CACHITO_ENV_FILE ]; then go mod download ; fi
2424

2525
# Build manager
26-
RUN if [ -f $CACHITO_ENV_FILE ] ; then source $CACHITO_ENV_FILE ; fi ; env ${GO_BUILD_EXTRA_ENV_ARGS} go build ${GO_BUILD_EXTRA_ARGS} -a -o ${DEST_ROOT}/manager main.go
26+
RUN if [ -f $CACHITO_ENV_FILE ] ; then source $CACHITO_ENV_FILE ; fi ; env ${GO_BUILD_EXTRA_ENV_ARGS} go build ${GO_BUILD_EXTRA_ARGS} -a -o ${DEST_ROOT}/manager cmd/main.go
2727

2828

2929
RUN cp -r templates ${DEST_ROOT}/templates

Makefile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ endif
4848

4949
# Set the Operator SDK version to use. By default, what is installed on the system is used.
5050
# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit.
51-
OPERATOR_SDK_VERSION ?= v1.31.0
51+
OPERATOR_SDK_VERSION ?= v1.41.1
5252

5353
# Image URL to use all building/pushing image targets
5454
DEFAULT_IMG ?= quay.io/openstack-k8s-operators/nova-operator:latest
@@ -150,13 +150,13 @@ PROC_CMD = --procs ${PROCS}
150150
test: manifests generate fmt vet envtest ginkgo ## Run tests.
151151
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) -v debug --bin-dir $(LOCALBIN) use $(ENVTEST_K8S_VERSION) -p path)" \
152152
OPERATOR_TEMPLATES="$(PWD)/templates" \
153-
$(GINKGO) --trace --cover --coverpkg=../../pkg/...,../../controllers,../../api/v1beta1 --coverprofile cover.out --covermode=atomic --randomize-all ${PROC_CMD} $(GINKGO_ARGS) ./test/...
153+
$(GINKGO) --trace --cover --coverpkg=../../internal/...,../../api/v1beta1 --coverprofile cover.out --covermode=atomic --randomize-all ${PROC_CMD} $(GINKGO_ARGS) ./test/...
154154

155155
##@ Build
156156

157157
.PHONY: build
158158
build: generate fmt vet ## Build manager binary.
159-
go build -o bin/manager main.go
159+
go build -o bin/manager cmd/main.go
160160

161161
.PHONY: run
162162
run: export METRICS_PORT?=24600
@@ -165,7 +165,7 @@ run: export PPROF_PORT?=8082
165165
run: export ENABLE_WEBHOOKS?=false
166166
run: manifests generate fmt vet ## Run a controller from your host.
167167
/bin/bash hack/clean_local_webhook.sh
168-
go run ./main.go -metrics-bind-address ":$(METRICS_PORT)" -health-probe-bind-address ":$(HEALTH_PORT)" -pprof-bind-address ":$(PPROF_PORT)"
168+
go run ./cmd/main.go -metrics-bind-address ":$(METRICS_PORT)" -health-probe-bind-address ":$(HEALTH_PORT)" -pprof-bind-address ":$(PPROF_PORT)"
169169

170170

171171
# Extra vars which will be passed to the Docker-build
@@ -216,7 +216,7 @@ ENVTEST ?= $(LOCALBIN)/setup-envtest
216216
GINKGO ?= $(LOCALBIN)/ginkgo
217217

218218
## Tool Versions
219-
KUSTOMIZE_VERSION ?= v3.8.7
219+
KUSTOMIZE_VERSION ?= v5.6.0
220220
CONTROLLER_TOOLS_VERSION ?= v0.18.0
221221

222222
KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"

PROJECT

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
# Code generated by tool. DO NOT EDIT.
2+
# This file is used to track the info used to scaffold your project
3+
# and allow the plugins properly work.
4+
# More info: https://book.kubebuilder.io/reference/project-config.html
15
domain: openstack.org
26
layout:
3-
- go.kubebuilder.io/v3
7+
- go.kubebuilder.io/v4
48
plugins:
59
manifests.sdk.operatorframework.io/v2: {}
610
scorecard.sdk.operatorframework.io/v2: {}

api/v1beta1/common_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ type PasswordSelector struct {
104104
PrefixMetadataCellsSecret string `json:"prefixMetadataCellsSecret"`
105105
}
106106

107+
// NovaImages defines container images used by top level Nova CR
107108
type NovaImages struct {
108109
// +kubebuilder:validation:Required
109110
// APIContainerImageURL
@@ -116,6 +117,7 @@ type NovaImages struct {
116117
NovaCellImages `json:",inline"`
117118
}
118119

120+
// Default sets default image URLs for NovaImages
119121
func (r *NovaImages) Default(defaults NovaDefaults) {
120122
r.NovaCellImages.Default(defaults.NovaCellDefaults)
121123
if r.APIContainerImageURL == "" {
@@ -126,6 +128,7 @@ func (r *NovaImages) Default(defaults NovaDefaults) {
126128
}
127129
}
128130

131+
// NovaCellImages defines container images used by NovaCell services
129132
type NovaCellImages struct {
130133

131134
// +kubebuilder:validation:Required
@@ -145,6 +148,7 @@ type NovaCellImages struct {
145148
NovaComputeContainerImageURL string `json:"computeContainerImageURL"`
146149
}
147150

151+
// Default sets default image URLs for NovaCellImages
148152
func (r *NovaCellImages) Default(defaults NovaCellDefaults) {
149153
if r.ConductorContainerImageURL == "" {
150154
r.ConductorContainerImageURL = defaults.ConductorContainerImageURL

api/v1beta1/nova_webhook.go

Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"k8s.io/apimachinery/pkg/runtime/schema"
3636
"k8s.io/apimachinery/pkg/util/validation/field"
3737
"k8s.io/utils/ptr"
38-
ctrl "sigs.k8s.io/controller-runtime"
3938
logf "sigs.k8s.io/controller-runtime/pkg/log"
4039
"sigs.k8s.io/controller-runtime/pkg/webhook"
4140
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -60,15 +59,6 @@ func SetupNovaDefaults(defaults NovaDefaults) {
6059
novalog.Info("Nova defaults initialized", "defaults", defaults)
6160
}
6261

63-
// SetupWebhookWithManager sets up the webhook with the Manager
64-
func (r *Nova) SetupWebhookWithManager(mgr ctrl.Manager) error {
65-
return ctrl.NewWebhookManagedBy(mgr).
66-
For(r).
67-
Complete()
68-
}
69-
70-
//+kubebuilder:webhook:path=/mutate-nova-openstack-org-v1beta1-nova,mutating=true,failurePolicy=fail,sideEffects=None,groups=nova.openstack.org,resources=nova,verbs=create;update,versions=v1beta1,name=mnova.kb.io,admissionReviewVersions=v1
71-
7262
var _ webhook.Defaulter = &Nova{}
7363

7464
// Default implements webhook.Defaulter so a webhook will be registered for the type
@@ -121,15 +111,13 @@ func (spec *NovaSpecCore) Default() {
121111
}
122112
}
123113

124-
// NOTE: change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
125-
//+kubebuilder:webhook:path=/validate-nova-openstack-org-v1beta1-nova,mutating=false,failurePolicy=fail,sideEffects=None,groups=nova.openstack.org,resources=nova,verbs=create;update,versions=v1beta1,name=vnova.kb.io,admissionReviewVersions=v1
126-
127114
var _ webhook.Validator = &Nova{}
128115

129-
func (r *NovaSpecCore) ValidateCellTemplates(basePath *field.Path, namespace string) field.ErrorList {
116+
// ValidateCellTemplates validates cell templates configuration
117+
func (spec *NovaSpecCore) ValidateCellTemplates(basePath *field.Path, namespace string) field.ErrorList {
130118
var errors field.ErrorList
131119

132-
if _, ok := r.CellTemplates[Cell0Name]; !ok {
120+
if _, ok := spec.CellTemplates[Cell0Name]; !ok {
133121
errors = append(
134122
errors,
135123
field.Required(basePath.Child("cellTemplates"),
@@ -139,7 +127,7 @@ func (r *NovaSpecCore) ValidateCellTemplates(basePath *field.Path, namespace str
139127

140128
cellMessageBusNames := make(map[string]string)
141129

142-
for name, cell := range r.CellTemplates {
130+
for name, cell := range spec.CellTemplates {
143131
cellPath := basePath.Child("cellTemplates").Key(name)
144132
errors = append(
145133
errors,
@@ -163,7 +151,7 @@ func (r *NovaSpecCore) ValidateCellTemplates(basePath *field.Path, namespace str
163151

164152
cellMessageBusNames[cell.CellMessageBusInstance] = name
165153
}
166-
if *cell.MetadataServiceTemplate.Enabled && *r.MetadataServiceTemplate.Enabled {
154+
if *cell.MetadataServiceTemplate.Enabled && *spec.MetadataServiceTemplate.Enabled {
167155
errors = append(
168156
errors,
169157
field.Invalid(
@@ -239,67 +227,67 @@ func (r *NovaSpecCore) ValidateCellTemplates(basePath *field.Path, namespace str
239227
}
240228

241229
// ValidateAPIServiceTemplate -
242-
func (r *NovaSpecCore) ValidateAPIServiceTemplate(basePath *field.Path, namespace string) field.ErrorList {
230+
func (spec *NovaSpecCore) ValidateAPIServiceTemplate(basePath *field.Path, namespace string) field.ErrorList {
243231
errors := field.ErrorList{}
244232

245233
// validate the service override key is valid
246234
errors = append(errors,
247235
service.ValidateRoutedOverrides(
248236
basePath.Child("apiServiceTemplate").Child("override").Child("service"),
249-
r.APIServiceTemplate.Override.Service)...)
237+
spec.APIServiceTemplate.Override.Service)...)
250238

251239
errors = append(errors,
252240
ValidateAPIDefaultConfigOverwrite(
253241
basePath.Child("apiServiceTemplate").Child("defaultConfigOverwrite"),
254-
r.APIServiceTemplate.DefaultConfigOverwrite)...)
242+
spec.APIServiceTemplate.DefaultConfigOverwrite)...)
255243

256244
errors = append(errors,
257-
r.APIServiceTemplate.ValidateTopology(
245+
spec.APIServiceTemplate.ValidateTopology(
258246
basePath.Child("apiServiceTemplate"),
259247
namespace)...)
260248

261249
return errors
262250
}
263251

264252
// ValidateSchedulerServiceTemplate -
265-
func (r *NovaSpecCore) ValidateSchedulerServiceTemplate(basePath *field.Path, namespace string) field.ErrorList {
253+
func (spec *NovaSpecCore) ValidateSchedulerServiceTemplate(basePath *field.Path, namespace string) field.ErrorList {
266254
errors := field.ErrorList{}
267255
// validate the referenced TopologyRef
268256
errors = append(errors,
269-
r.SchedulerServiceTemplate.ValidateTopology(
257+
spec.SchedulerServiceTemplate.ValidateTopology(
270258
basePath.Child("schedulerServiceTemplate"),
271259
namespace)...)
272260
return errors
273261
}
274262

275263
// ValidateCreate validates the NovaSpec during the webhook invocation.
276-
func (r *NovaSpec) ValidateCreate(basePath *field.Path, namespace string) field.ErrorList {
277-
return r.NovaSpecCore.ValidateCreate(basePath, namespace)
264+
func (spec *NovaSpec) ValidateCreate(basePath *field.Path, namespace string) field.ErrorList {
265+
return spec.NovaSpecCore.ValidateCreate(basePath, namespace)
278266
}
279267

280268
// ValidateCreate validates the NovaSpecCore during the webhook invocation. It is
281269
// expected to be called by the validation webhook in the higher level meta
282270
// operator
283-
func (r *NovaSpecCore) ValidateCreate(basePath *field.Path, namespace string) field.ErrorList {
284-
errors := r.ValidateCellTemplates(basePath, namespace)
285-
errors = append(errors, r.ValidateAPIServiceTemplate(basePath, namespace)...)
286-
errors = append(errors, r.ValidateSchedulerServiceTemplate(basePath, namespace)...)
271+
func (spec *NovaSpecCore) ValidateCreate(basePath *field.Path, namespace string) field.ErrorList {
272+
errors := spec.ValidateCellTemplates(basePath, namespace)
273+
errors = append(errors, spec.ValidateAPIServiceTemplate(basePath, namespace)...)
274+
errors = append(errors, spec.ValidateSchedulerServiceTemplate(basePath, namespace)...)
287275

288276
// validate TopologyRef override for top-level MetadataServiceTemplate
289277
errors = append(errors,
290-
r.MetadataServiceTemplate.ValidateTopology(
278+
spec.MetadataServiceTemplate.ValidateTopology(
291279
basePath.Child("metadataServiceTemplate"),
292280
namespace)...)
293281

294282
errors = append(
295283
errors,
296-
r.MetadataServiceTemplate.ValidateDefaultConfigOverwrite(
284+
spec.MetadataServiceTemplate.ValidateDefaultConfigOverwrite(
297285
basePath.Child("metadataServiceTemplate"))...)
298286

299287
// validate top-level topology
300288
errors = append(errors,
301289
topologyv1.ValidateTopologyRef(
302-
r.TopologyRef, *basePath.Child("topologyRef"), namespace)...)
290+
spec.TopologyRef, *basePath.Child("topologyRef"), namespace)...)
303291

304292
return errors
305293
}
@@ -319,31 +307,31 @@ func (r *Nova) ValidateCreate() (admission.Warnings, error) {
319307
}
320308

321309
// ValidateUpdate validates the NovaSpec during the webhook invocation.
322-
func (r *NovaSpec) ValidateUpdate(old NovaSpec, basePath *field.Path, namespace string) field.ErrorList {
323-
return r.NovaSpecCore.ValidateUpdate(old.NovaSpecCore, basePath, namespace)
310+
func (spec *NovaSpec) ValidateUpdate(old NovaSpec, basePath *field.Path, namespace string) field.ErrorList {
311+
return spec.NovaSpecCore.ValidateUpdate(old.NovaSpecCore, basePath, namespace)
324312
}
325313

326314
// ValidateUpdate validates the NovaSpecCore during the webhook invocation. It is
327315
// expected to be called by the validation webhook in the higher level meta
328316
// operator
329-
func (r *NovaSpecCore) ValidateUpdate(old NovaSpecCore, basePath *field.Path, namespace string) field.ErrorList {
330-
errors := r.ValidateCellTemplates(basePath, namespace)
317+
func (spec *NovaSpecCore) ValidateUpdate(old NovaSpecCore, basePath *field.Path, namespace string) field.ErrorList {
318+
errors := spec.ValidateCellTemplates(basePath, namespace)
331319
// Validate top-level TopologyRef
332320
errors = append(errors, topologyv1.ValidateTopologyRef(
333-
r.TopologyRef, *basePath.Child("topologyRef"), namespace)...)
321+
spec.TopologyRef, *basePath.Child("topologyRef"), namespace)...)
334322

335-
errors = append(errors, r.ValidateAPIServiceTemplate(basePath, namespace)...)
336-
errors = append(errors, r.ValidateSchedulerServiceTemplate(basePath, namespace)...)
323+
errors = append(errors, spec.ValidateAPIServiceTemplate(basePath, namespace)...)
324+
errors = append(errors, spec.ValidateSchedulerServiceTemplate(basePath, namespace)...)
337325

338326
// validate TopologyRef override for top-level MetadataServiceTemplate
339327
errors = append(errors,
340-
r.MetadataServiceTemplate.ValidateTopology(
328+
spec.MetadataServiceTemplate.ValidateTopology(
341329
basePath.Child("metadataServiceTemplate"),
342330
namespace)...)
343331

344332
errors = append(
345333
errors,
346-
r.MetadataServiceTemplate.ValidateDefaultConfigOverwrite(
334+
spec.MetadataServiceTemplate.ValidateDefaultConfigOverwrite(
347335
basePath.Child("metadataServiceTemplate"))...)
348336

349337
return errors
@@ -379,7 +367,7 @@ func (r *Nova) ValidateDelete() (admission.Warnings, error) {
379367

380368
// SetDefaultRouteAnnotations sets HAProxy timeout values of the route
381369
// NOTE: it is used by ctlplane webhook on openstack-operator
382-
func (r *NovaSpecCore) SetDefaultRouteAnnotations(annotations map[string]string) {
370+
func (spec *NovaSpecCore) SetDefaultRouteAnnotations(annotations map[string]string) {
383371
const haProxyAnno = "haproxy.router.openshift.io/timeout"
384372
// Use a custom annotation to flag when the operator has set the default HAProxy timeout
385373
// With the annotation func determines when to overwrite existing HAProxy timeout with the APITimeout
@@ -399,7 +387,7 @@ func (r *NovaSpecCore) SetDefaultRouteAnnotations(annotations map[string]string)
399387
return
400388
}
401389

402-
timeout := fmt.Sprintf("%ds", r.APITimeout)
390+
timeout := fmt.Sprintf("%ds", spec.APITimeout)
403391
annotations[novaAnno] = timeout
404392
annotations[haProxyAnno] = timeout
405393
}

api/v1beta1/novaapi_types.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,16 @@ func (n NovaAPI) GetSecret() string {
240240
}
241241

242242
// GetSpecTopologyRef - Returns the LastAppliedTopology Set in the Status
243-
func (instance *NovaAPI) GetSpecTopologyRef() *topologyv1.TopoRef {
244-
return instance.Spec.TopologyRef
243+
func (n *NovaAPI) GetSpecTopologyRef() *topologyv1.TopoRef {
244+
return n.Spec.TopologyRef
245245
}
246246

247247
// GetLastAppliedTopology - Returns the LastAppliedTopology Set in the Status
248-
func (instance *NovaAPI) GetLastAppliedTopology() *topologyv1.TopoRef {
249-
return instance.Status.LastAppliedTopology
248+
func (n *NovaAPI) GetLastAppliedTopology() *topologyv1.TopoRef {
249+
return n.Status.LastAppliedTopology
250250
}
251251

252252
// SetLastAppliedTopology - Sets the LastAppliedTopology value in the Status
253-
func (instance *NovaAPI) SetLastAppliedTopology(topologyRef *topologyv1.TopoRef) {
254-
instance.Status.LastAppliedTopology = topologyRef
253+
func (n *NovaAPI) SetLastAppliedTopology(topologyRef *topologyv1.TopoRef) {
254+
n.Status.LastAppliedTopology = topologyRef
255255
}

api/v1beta1/novaapi_webhook.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import (
3030
"k8s.io/apimachinery/pkg/runtime"
3131
"k8s.io/apimachinery/pkg/runtime/schema"
3232
"k8s.io/apimachinery/pkg/util/validation/field"
33-
ctrl "sigs.k8s.io/controller-runtime"
3433
logf "sigs.k8s.io/controller-runtime/pkg/log"
3534
"sigs.k8s.io/controller-runtime/pkg/webhook"
3635
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -55,15 +54,6 @@ func SetupNovaAPIDefaults(defaults NovaAPIDefaults) {
5554
novaapilog.Info("NovaAPI defaults initialized", "defaults", defaults)
5655
}
5756

58-
// SetupWebhookWithManager sets up the webhook with the Manager
59-
func (r *NovaAPI) SetupWebhookWithManager(mgr ctrl.Manager) error {
60-
return ctrl.NewWebhookManagedBy(mgr).
61-
For(r).
62-
Complete()
63-
}
64-
65-
//+kubebuilder:webhook:path=/mutate-nova-openstack-org-v1beta1-novaapi,mutating=true,failurePolicy=fail,sideEffects=None,groups=nova.openstack.org,resources=novaapis,verbs=create;update,versions=v1beta1,name=mnovaapi.kb.io,admissionReviewVersions=v1
66-
6757
var _ webhook.Defaulter = &NovaAPI{}
6858

6959
// Default implements webhook.Defaulter so a webhook will be registered for the type
@@ -80,9 +70,6 @@ func (spec *NovaAPISpec) Default() {
8070
}
8171
}
8272

83-
// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
84-
//+kubebuilder:webhook:path=/validate-nova-openstack-org-v1beta1-novaapi,mutating=false,failurePolicy=fail,sideEffects=None,groups=nova.openstack.org,resources=novaapis,verbs=create;update,versions=v1beta1,name=vnovaapi.kb.io,admissionReviewVersions=v1
85-
8673
var _ webhook.Validator = &NovaAPI{}
8774

8875
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
@@ -153,6 +140,7 @@ func (r *NovaAPI) ValidateDelete() (admission.Warnings, error) {
153140
return nil, nil
154141
}
155142

143+
// ValidateAPIDefaultConfigOverwrite validates the defaultConfigOverwrite for NovaAPI
156144
func ValidateAPIDefaultConfigOverwrite(
157145
basePath *field.Path,
158146
defaultConfigOverwrite map[string]string,

0 commit comments

Comments
 (0)