@@ -25,6 +25,10 @@ import (
2525 logf "sigs.k8s.io/controller-runtime/pkg/log"
2626 "sigs.k8s.io/controller-runtime/pkg/webhook"
2727 "sigs.k8s.io/controller-runtime/pkg/webhook/admission"
28+ apierrors "k8s.io/apimachinery/pkg/api/errors"
29+ "k8s.io/apimachinery/pkg/runtime/schema"
30+ "k8s.io/apimachinery/pkg/util/validation/field"
31+ topologyv1 "github.com/openstack-k8s-operators/infra-operator/apis/topology/v1beta1"
2832)
2933
3034// TelemetryDefaults -
@@ -126,16 +130,32 @@ var _ webhook.Validator = &Telemetry{}
126130// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
127131func (r * Telemetry ) ValidateCreate () (admission.Warnings , error ) {
128132 telemetrylog .Info ("validate create" , "name" , r .Name )
133+ var allErrs field.ErrorList
134+ basePath := field .NewPath ("spec" )
135+
136+ allErrs = r .Spec .ValidateTelemetryTopology (basePath , r .Namespace )
137+ if len (allErrs ) != 0 {
138+ return nil , apierrors .NewInvalid (
139+ schema.GroupKind {Group : "telemetry.openstack.org" , Kind : "Telemetry" },
140+ r .Name , allErrs )
141+ }
129142
130- // TODO(user): fill in your validation logic upon object creation.
131143 return nil , nil
132144}
133145
134146// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
135147func (r * Telemetry ) ValidateUpdate (old runtime.Object ) (admission.Warnings , error ) {
136148 telemetrylog .Info ("validate update" , "name" , r .Name )
137149
138- // TODO(user): fill in your validation logic upon object update.
150+ var allErrs field.ErrorList
151+ basePath := field .NewPath ("spec" )
152+
153+ allErrs = r .Spec .ValidateTelemetryTopology (basePath , r .Namespace )
154+ if len (allErrs ) != 0 {
155+ return nil , apierrors .NewInvalid (
156+ schema.GroupKind {Group : "telemetry.openstack.org" , Kind : "Telemetry" },
157+ r .Name , allErrs )
158+ }
139159 return nil , nil
140160}
141161
@@ -146,3 +166,35 @@ func (r *Telemetry) ValidateDelete() (admission.Warnings, error) {
146166 // TODO(user): fill in your validation logic upon object deletion.
147167 return nil , nil
148168}
169+
170+ // ValidateTelemetryTopology - Returns an ErrorList if the Topology is referenced
171+ // on a different namespace
172+ func (spec * TelemetrySpec ) ValidateTelemetryTopology (basePath * field.Path , namespace string ) field.ErrorList {
173+ var allErrs field.ErrorList
174+
175+ // When a TopologyRef CR is referenced, fail if a different Namespace is
176+ // referenced because is not supported
177+ if spec .TopologyRef != nil {
178+ if err := topologyv1 .ValidateTopologyNamespace (spec .TopologyRef .Namespace , * basePath , namespace ); err != nil {
179+ allErrs = append (allErrs , err )
180+ }
181+ }
182+
183+ // When a TopologyRef CR is referenced with an override to Aodh, fail
184+ // if a different Namespace is referenced because not supported
185+ if spec .Autoscaling .Aodh .TopologyRef != nil {
186+ if err := topologyv1 .ValidateTopologyNamespace (spec .Autoscaling .Aodh .TopologyRef .Namespace , * basePath , namespace ); err != nil {
187+ allErrs = append (allErrs , err )
188+ }
189+ }
190+
191+ // When a TopologyRef CR is referenced with an override to Ceilometer,
192+ // fail if a different Namespace is referenced because not supported
193+ if spec .Ceilometer .TopologyRef != nil {
194+ if err := topologyv1 .ValidateTopologyNamespace (spec .Ceilometer .TopologyRef .Namespace , * basePath , namespace ); err != nil {
195+ allErrs = append (allErrs , err )
196+ }
197+ }
198+
199+ return allErrs
200+ }
0 commit comments