Skip to content

Commit 803ac51

Browse files
committed
OpenStackVersion: ensure there is only one
Jira: OSPRH-6874
1 parent fb5ce90 commit 803ac51

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

apis/core/v1beta1/openstackversion_webhook.go

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,24 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"context"
21+
2022
apierrors "k8s.io/apimachinery/pkg/api/errors"
2123
"k8s.io/apimachinery/pkg/runtime/schema"
2224
"k8s.io/apimachinery/pkg/util/validation/field"
2325

2426
"github.com/openstack-k8s-operators/lib-common/modules/common/util"
2527
"k8s.io/apimachinery/pkg/runtime"
2628
ctrl "sigs.k8s.io/controller-runtime"
29+
"sigs.k8s.io/controller-runtime/pkg/client"
30+
goClient "sigs.k8s.io/controller-runtime/pkg/client"
2731
logf "sigs.k8s.io/controller-runtime/pkg/log"
2832
"sigs.k8s.io/controller-runtime/pkg/webhook"
2933
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
3034
)
3135

36+
var versionWebhookClient goClient.Client
37+
3238
// OpenStackVersionDefaults -
3339
type OpenStackVersionDefaults struct {
3440
availableVersion string
@@ -47,13 +53,16 @@ func SetupOpenStackVersionDefaults(defaults OpenStackVersionDefaults) {
4753

4854
// SetupWebhookWithManager - register OpenStackVersion with the controller manager
4955
func (r *OpenStackVersion) SetupWebhookWithManager(mgr ctrl.Manager) error {
56+
57+
if versionWebhookClient == nil {
58+
versionWebhookClient = mgr.GetClient()
59+
}
60+
5061
return ctrl.NewWebhookManagedBy(mgr).
5162
For(r).
5263
Complete()
5364
}
5465

55-
// TODO(user): EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
56-
5766
//+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
5867

5968
var _ webhook.Defaulter = &OpenStackVersion{}
@@ -91,6 +100,43 @@ func (r *OpenStackVersion) ValidateCreate() (admission.Warnings, error) {
91100
)
92101
}
93102

103+
versionList := &OpenStackVersionList{}
104+
105+
listOpts := []client.ListOption{
106+
client.InNamespace(r.Namespace),
107+
}
108+
109+
if err := versionWebhookClient.List(context.TODO(), versionList, listOpts...); err != nil {
110+
111+
return nil, apierrors.NewForbidden(
112+
schema.GroupResource{
113+
Group: GroupVersion.WithKind("OpenStackVersion").Group,
114+
Resource: GroupVersion.WithKind("OpenStackVersion").Kind,
115+
}, r.GetName(), &field.Error{
116+
Type: field.ErrorTypeForbidden,
117+
Field: "",
118+
BadValue: r.Spec.TargetVersion,
119+
Detail: err.Error(),
120+
},
121+
)
122+
123+
}
124+
125+
if len(versionList.Items) >= 1 {
126+
127+
return nil, apierrors.NewForbidden(
128+
schema.GroupResource{
129+
Group: GroupVersion.WithKind("OpenStackVersion").Group,
130+
Resource: GroupVersion.WithKind("OpenStackVersion").Kind,
131+
}, r.GetName(), &field.Error{
132+
Type: field.ErrorTypeForbidden,
133+
Field: "",
134+
BadValue: r.Spec.TargetVersion,
135+
Detail: "Only one OpenStackVersion instance is supported at this time.",
136+
},
137+
)
138+
}
139+
94140
return nil, nil
95141
}
96142

tests/functional/openstackversion_controller_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,18 @@ var _ = Describe("OpenStackOperator controller", func() {
5252
names.OpenStackVersionName,
5353
)
5454
})
55+
56+
It("should fail to create more than one OpenStackVersion", func() {
57+
58+
instance := &corev1.OpenStackVersion{}
59+
instance.ObjectMeta.Namespace = names.Namespace
60+
instance.Name = "foo"
61+
Eventually(func(g Gomega) {
62+
g.Expect(k8sClient.Create(ctx, instance)).Should(Not(Succeed()))
63+
}, timeout, interval).Should(Succeed())
64+
65+
})
66+
5567
It("should initialize container images", func() {
5668
Eventually(func(g Gomega) {
5769

0 commit comments

Comments
 (0)