Skip to content

Commit dc30a72

Browse files
committed
Fix tests
1 parent 9c8bb50 commit dc30a72

16 files changed

Lines changed: 195 additions & 405 deletions

api/core/v1beta1/openstackcontrolplane_webhook.go

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ import (
3434
"k8s.io/apimachinery/pkg/runtime/schema"
3535
"k8s.io/apimachinery/pkg/util/validation/field"
3636
"k8s.io/utils/ptr"
37-
ctrl "sigs.k8s.io/controller-runtime"
3837
"sigs.k8s.io/controller-runtime/pkg/client"
3938
logf "sigs.k8s.io/controller-runtime/pkg/log"
40-
"sigs.k8s.io/controller-runtime/pkg/webhook"
4139
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
4240

4341
barbicanv1 "github.com/openstack-k8s-operators/barbican-operator/api/v1beta1"
@@ -60,28 +58,11 @@ import (
6058
telemetryv1 "github.com/openstack-k8s-operators/telemetry-operator/api/v1beta1"
6159
)
6260

63-
var ctlplaneWebhookClient client.Client
64-
6561
// log is for logging in this package.
6662
var openstackcontrolplanelog = logf.Log.WithName("openstackcontrolplane-resource")
6763

68-
// SetupWebhookWithManager sets up the Webhook with the Manager.
69-
func (r *OpenStackControlPlane) SetupWebhookWithManager(mgr ctrl.Manager) error {
70-
if ctlplaneWebhookClient == nil {
71-
ctlplaneWebhookClient = mgr.GetClient()
72-
}
73-
74-
return ctrl.NewWebhookManagedBy(mgr).
75-
For(r).
76-
Complete()
77-
}
78-
79-
// +kubebuilder:webhook:path=/validate-core-openstack-org-v1beta1-openstackcontrolplane,mutating=false,failurePolicy=Fail,sideEffects=None,groups=core.openstack.org,resources=openstackcontrolplanes,verbs=create;update,versions=v1beta1,name=vopenstackcontrolplane.kb.io,admissionReviewVersions=v1
80-
81-
var _ webhook.Validator = &OpenStackControlPlane{}
82-
83-
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
84-
func (r *OpenStackControlPlane) ValidateCreate() (admission.Warnings, error) {
64+
// ValidateCreate validates the OpenStackControlPlane on creation
65+
func (r *OpenStackControlPlane) ValidateCreate(ctx context.Context, c client.Client) (admission.Warnings, error) {
8566
openstackcontrolplanelog.Info("validate create", "name", r.Name)
8667

8768
var allWarn []string
@@ -91,7 +72,7 @@ func (r *OpenStackControlPlane) ValidateCreate() (admission.Warnings, error) {
9172
listOpts := []client.ListOption{
9273
client.InNamespace(r.Namespace),
9374
}
94-
if err := ctlplaneWebhookClient.List(context.TODO(), ctlplaneList, listOpts...); err != nil {
75+
if err := c.List(ctx, ctlplaneList, listOpts...); err != nil {
9576
return nil, apierrors.NewForbidden(
9677
schema.GroupResource{
9778
Group: GroupVersion.WithKind("OpenStackControlPlane").Group,
@@ -118,7 +99,7 @@ func (r *OpenStackControlPlane) ValidateCreate() (admission.Warnings, error) {
11899
)
119100
}
120101

121-
allErrs, err := r.ValidateVersion()
102+
allErrs, err := r.ValidateVersion(ctx, c)
122103

123104
// Version validation can generate non-field errors, so we consider those first
124105
if err != nil {
@@ -145,8 +126,8 @@ func (r *OpenStackControlPlane) ValidateCreate() (admission.Warnings, error) {
145126
return allWarn, nil
146127
}
147128

148-
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
149-
func (r *OpenStackControlPlane) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
129+
// ValidateUpdate validates the OpenStackControlPlane on update
130+
func (r *OpenStackControlPlane) ValidateUpdate(ctx context.Context, old runtime.Object, c client.Client) (admission.Warnings, error) {
150131
openstackcontrolplanelog.Info("validate update", "name", r.Name)
151132

152133
oldControlPlane, ok := old.(*OpenStackControlPlane)
@@ -178,8 +159,8 @@ func (r *OpenStackControlPlane) ValidateUpdate(old runtime.Object) (admission.Wa
178159
return allWarn, nil
179160
}
180161

181-
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
182-
func (r *OpenStackControlPlane) ValidateDelete() (admission.Warnings, error) {
162+
// ValidateDelete validates the OpenStackControlPlane on deletion
163+
func (r *OpenStackControlPlane) ValidateDelete(ctx context.Context, c client.Client) (admission.Warnings, error) {
183164
openstackcontrolplanelog.Info("validate delete", "name", r.Name)
184165

185166
return nil, nil
@@ -734,10 +715,10 @@ func (r *OpenStackControlPlane) ValidateServiceDependencies(basePath *field.Path
734715
return allErrs
735716
}
736717

737-
func (r *OpenStackControlPlane) ValidateVersion() (field.ErrorList, error) {
718+
func (r *OpenStackControlPlane) ValidateVersion(ctx context.Context, c client.Client) (field.ErrorList, error) {
738719
var allErrs field.ErrorList
739720

740-
openStackVersionList, err := GetOpenStackVersions(r.Namespace, ctlplaneWebhookClient)
721+
openStackVersionList, err := GetOpenStackVersions(r.Namespace, c)
741722

742723
if err != nil {
743724
return allErrs, apierrors.NewForbidden(
@@ -784,11 +765,7 @@ func (r *OpenStackControlPlane) ValidateVersion() (field.ErrorList, error) {
784765
return allErrs, nil
785766
}
786767

787-
// +kubebuilder:webhook:path=/mutate-core-openstack-org-v1beta1-openstackcontrolplane,mutating=true,failurePolicy=fail,sideEffects=None,groups=core.openstack.org,resources=openstackcontrolplanes,verbs=create;update,versions=v1beta1,name=mopenstackcontrolplane.kb.io,admissionReviewVersions=v1
788-
789-
var _ webhook.Defaulter = &OpenStackControlPlane{}
790-
791-
// Default implements webhook.Defaulter so a webhook will be registered for the type
768+
// Default sets default values for the OpenStackControlPlane
792769
func (r *OpenStackControlPlane) Default() {
793770
openstackcontrolplanelog.Info("default", "name", r.Name)
794771

api/core/v1beta1/openstackversion_webhook.go

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"os"
2223
"reflect"
@@ -26,15 +27,11 @@ import (
2627
"k8s.io/apimachinery/pkg/util/validation/field"
2728

2829
"k8s.io/apimachinery/pkg/runtime"
29-
ctrl "sigs.k8s.io/controller-runtime"
3030
goClient "sigs.k8s.io/controller-runtime/pkg/client"
3131
logf "sigs.k8s.io/controller-runtime/pkg/log"
32-
"sigs.k8s.io/controller-runtime/pkg/webhook"
3332
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
3433
)
3534

36-
var versionWebhookClient goClient.Client
37-
3835
// OpenStackVersionDefaults -
3936
type OpenStackVersionDefaults struct {
4037
AvailableVersion string
@@ -51,39 +48,16 @@ func SetupOpenStackVersionDefaults(defaults OpenStackVersionDefaults) {
5148
openstackversionlog.Info("OpenStackVersion defaults initialized", "defaults", defaults)
5249
}
5350

54-
// SetupWebhookWithManager - register OpenStackVersion with the controller manager
55-
func (r *OpenStackVersion) SetupWebhookWithManager(mgr ctrl.Manager) error {
56-
57-
if versionWebhookClient == nil {
58-
versionWebhookClient = mgr.GetClient()
59-
}
60-
61-
return ctrl.NewWebhookManagedBy(mgr).
62-
For(r).
63-
Complete()
64-
}
65-
66-
// +kubebuilder:webhook:path=/mutate-core-openstack-org-v1beta1-openstackversion,mutating=true,failurePolicy=fail,sideEffects=None,groups=core.openstack.org,resources=openstackversions,verbs=create;update,versions=v1beta1,name=mopenstackversion.kb.io,admissionReviewVersions=v1
67-
68-
var _ webhook.Defaulter = &OpenStackVersion{}
69-
70-
// Default implements webhook.Defaulter so a webhook will be registered for the type
51+
// Default sets default values for the OpenStackVersion
7152
func (r *OpenStackVersion) Default() {
7253
openstackversionlog.Info("default", "name", r.Name)
7354
if r.Spec.TargetVersion == "" {
7455
r.Spec.TargetVersion = openstackVersionDefaults.AvailableVersion
7556
}
76-
77-
// TODO(user): fill in your defaulting logic.
7857
}
7958

80-
// TODO(user): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
81-
// +kubebuilder:webhook:path=/validate-core-openstack-org-v1beta1-openstackversion,mutating=false,failurePolicy=fail,sideEffects=None,groups=core.openstack.org,resources=openstackversions,verbs=create;update,versions=v1beta1,name=vopenstackversion.kb.io,admissionReviewVersions=v1
82-
83-
var _ webhook.Validator = &OpenStackVersion{}
84-
85-
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
86-
func (r *OpenStackVersion) ValidateCreate() (admission.Warnings, error) {
59+
// ValidateCreate validates the OpenStackVersion on creation
60+
func (r *OpenStackVersion) ValidateCreate(ctx context.Context, c goClient.Client) (admission.Warnings, error) {
8761
openstackversionlog.Info("validate create", "name", r.Name)
8862

8963
if r.Spec.TargetVersion != openstackVersionDefaults.AvailableVersion {
@@ -100,7 +74,7 @@ func (r *OpenStackVersion) ValidateCreate() (admission.Warnings, error) {
10074
)
10175
}
10276

103-
versionList, err := GetOpenStackVersions(r.Namespace, versionWebhookClient)
77+
versionList, err := GetOpenStackVersions(r.Namespace, c)
10478

10579
if err != nil {
10680

@@ -136,8 +110,8 @@ func (r *OpenStackVersion) ValidateCreate() (admission.Warnings, error) {
136110
return nil, nil
137111
}
138112

139-
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
140-
func (r *OpenStackVersion) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
113+
// ValidateUpdate validates the OpenStackVersion on update
114+
func (r *OpenStackVersion) ValidateUpdate(ctx context.Context, old runtime.Object, c goClient.Client) (admission.Warnings, error) {
141115
openstackversionlog.Info("validate update", "name", r.Name)
142116

143117
_, ok := r.Status.ContainerImageVersionDefaults[r.Spec.TargetVersion]
@@ -236,11 +210,10 @@ func hasAnyCustomImage(images CustomContainerImages) bool {
236210
return false
237211
}
238212

239-
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
240-
func (r *OpenStackVersion) ValidateDelete() (admission.Warnings, error) {
213+
// ValidateDelete validates the OpenStackVersion on deletion
214+
func (r *OpenStackVersion) ValidateDelete(ctx context.Context, c goClient.Client) (admission.Warnings, error) {
241215
openstackversionlog.Info("validate delete", "name", r.Name)
242216

243-
// TODO(user): fill in your validation logic upon object deletion.
244217
return nil, nil
245218
}
246219

api/core/v1beta1/openstackversion_webhook_test.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package v1beta1
22

33
import (
4+
"context"
5+
46
. "github.com/onsi/ginkgo/v2"
57
. "github.com/onsi/gomega"
68
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -111,7 +113,7 @@ var _ = Describe("OpenStackVersion Webhook", func() {
111113
})
112114

113115
It("should reject update when CustomContainerImages are unchanged and no skip annotation", func() {
114-
_, err := newVersion.ValidateUpdate(oldVersion)
116+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
115117
Expect(err).To(HaveOccurred())
116118
Expect(err.Error()).To(ContainSubstring("CustomContainerImages must be updated when changing targetVersion"))
117119
})
@@ -120,61 +122,61 @@ var _ = Describe("OpenStackVersion Webhook", func() {
120122
newVersion.Annotations = map[string]string{
121123
"core.openstack.org/skip-custom-images-validation": "true",
122124
}
123-
_, err := newVersion.ValidateUpdate(oldVersion)
125+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
124126
Expect(err).ToNot(HaveOccurred())
125127
})
126128

127129
It("should allow update when skip annotation exists with any value", func() {
128130
newVersion.Annotations = map[string]string{
129131
"core.openstack.org/skip-custom-images-validation": "",
130132
}
131-
_, err := newVersion.ValidateUpdate(oldVersion)
133+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
132134
Expect(err).ToNot(HaveOccurred())
133135
})
134136

135137
It("should allow update when CustomContainerImages are actually changed", func() {
136138
newKeystoneImage := "registry.example.com/keystone:v2.0.0"
137139
newVersion.Spec.CustomContainerImages.ContainerTemplate.KeystoneAPIImage = &newKeystoneImage
138140

139-
_, err := newVersion.ValidateUpdate(oldVersion)
141+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
140142
Expect(err).ToNot(HaveOccurred())
141143
})
142144

143145
It("should allow update when there are no custom images configured", func() {
144146
newVersion.Spec.CustomContainerImages = CustomContainerImages{}
145-
_, err := newVersion.ValidateUpdate(oldVersion)
147+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
146148
Expect(err).ToNot(HaveOccurred())
147149
})
148150

149151
It("should allow update when DeployedVersion is nil (fresh install)", func() {
150152
oldVersion.Status.DeployedVersion = nil
151-
_, err := newVersion.ValidateUpdate(oldVersion)
153+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
152154
Expect(err).ToNot(HaveOccurred())
153155
})
154156

155157
It("should allow update when target version is not changing", func() {
156158
newVersion.Spec.TargetVersion = "1.0.0" // Same as old version
157-
_, err := newVersion.ValidateUpdate(oldVersion)
159+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
158160
Expect(err).ToNot(HaveOccurred())
159161
})
160162

161163
It("should handle edge case where TrackedCustomImages is nil", func() {
162164
newVersion.Status.TrackedCustomImages = nil
163-
_, err := newVersion.ValidateUpdate(oldVersion)
165+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
164166
Expect(err).ToNot(HaveOccurred())
165167
})
166168

167169
It("should handle edge case where previous version not found in TrackedCustomImages", func() {
168170
newVersion.Status.TrackedCustomImages = map[string]CustomContainerImages{
169171
"0.9.0": {}, // Different version than oldVersion.Spec.TargetVersion
170172
}
171-
_, err := newVersion.ValidateUpdate(oldVersion)
173+
_, err := newVersion.ValidateUpdate(context.Background(), oldVersion, nil)
172174
Expect(err).ToNot(HaveOccurred())
173175
})
174176

175177
It("should handle invalid old object type gracefully", func() {
176178
invalidOld := &DummyObject{} // Wrong type
177-
_, err := newVersion.ValidateUpdate(invalidOld)
179+
_, err := newVersion.ValidateUpdate(context.Background(), invalidOld, nil)
178180
Expect(err).To(HaveOccurred())
179181
Expect(err.Error()).To(ContainSubstring("failed to convert old object to OpenStackVersion"))
180182
})

0 commit comments

Comments
 (0)