@@ -17,18 +17,24 @@ limitations under the License.
1717package v1beta1
1818
1919import (
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 -
3339type OpenStackVersionDefaults struct {
3440 availableVersion string
@@ -47,13 +53,16 @@ func SetupOpenStackVersionDefaults(defaults OpenStackVersionDefaults) {
4753
4854// SetupWebhookWithManager - register OpenStackVersion with the controller manager
4955func (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
5968var _ 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
0 commit comments