package edgeinjector import ( "context" "fmt" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "edge-infra.dev/pkg/lib/fog" dsv1 "edge-infra.dev/pkg/sds/devices/k8s/apis/v1" ) var ( DeviceClass = "device-class" ) type DeviceClassWebhook struct{} type Validator interface { Validate() error Name() string } func (c *DeviceClassWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { return validateDeviceObject(ctx, obj) } func (c *DeviceClassWebhook) ValidateUpdate(ctx context.Context, _, obj runtime.Object) (admission.Warnings, error) { return validateDeviceObject(ctx, obj) } func (c *DeviceClassWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) { return nil, nil } func validateDeviceObject(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) { log := fog.FromContext(ctx).WithValues("name", "DeviceClassWebhook") args := []any{"group", obj.GetObjectKind().GroupVersionKind().Group, "kind", obj.GetObjectKind().GroupVersionKind().Kind} deviceObject, err := convertObjectToDeviceSystemValidator(obj) if err != nil { log.Error(err, "invalid device class", args...) return warnings, err } args = append(args, "name", deviceObject.Name()) if err := deviceObject.Validate(); err != nil { log.Error(err, "invalid device resource", args...) return warnings, err } return warnings, nil } func convertObjectToDeviceSystemValidator(obj runtime.Object) (Validator, error) { devClass, ok := obj.(*dsv1.DeviceClass) if ok { return devClass, nil } devSet, ok := obj.(*dsv1.DeviceSet) if ok { return devSet, nil } return nil, fmt.Errorf("invalid object %s", obj.GetObjectKind().GroupVersionKind().String()) }