-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopenstackprovisionserver_webhook.go
More file actions
127 lines (104 loc) · 4.76 KB
/
Copy pathopenstackprovisionserver_webhook.go
File metadata and controls
127 lines (104 loc) · 4.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
Copyright 2023.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Generated by:
//
// operator-sdk create webhook --group baremetal --version v1beta1 --kind OpenStackProvisionServer --programmatic-validation --defaulting
//
package v1beta1
import (
"context"
"fmt"
"github.com/go-playground/validator/v10"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/validation/field"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)
var openstackProvisionServerDefaults OpenStackProvisionServerDefaults
// log is for logging in this package.
var openstackprovisionserverlog = logf.Log.WithName("openstackprovisionserver-resource")
// SetupOpenStackProvisionServerDefaults - initialize OpenStackProvisionServer spec defaults for use with either internal or external webhooks
func SetupOpenStackProvisionServerDefaults(defaults OpenStackProvisionServerDefaults) {
openstackProvisionServerDefaults = defaults
openstackprovisionserverlog.Info("OpenStackProvisionServer defaults initialized", "defaults", defaults)
}
var _ webhook.Validator = &OpenStackProvisionServer{}
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
func (r *OpenStackProvisionServer) ValidateCreate() (admission.Warnings, error) {
openstackprovisionserverlog.Info("validate create", "name", r.Name)
var errors field.ErrorList
// Check if OpenStackProvisionServer name matches RFC1123 for use in labels
validate := validator.New()
if err := validate.Var(r.Name, "hostname_rfc1123"); err != nil {
openstackprovisionserverlog.Error(err, "Error validating OpenStackProvisionServer name, name must follow RFC1123")
errors = append(errors, field.Invalid(
field.NewPath("Name"),
r.Name,
fmt.Sprintf("Error validating OpenStackProvisionServer name %s, name must follow RFC1123", r.Name)))
}
return nil, r.validateCr()
}
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
func (r *OpenStackProvisionServer) ValidateUpdate(old runtime.Object) (admission.Warnings, error) {
openstackprovisionserverlog.Info("validate update", "name", r.Name)
return nil, r.validateCr()
}
func (r *OpenStackProvisionServer) validateCr() error {
// TODO: Create a specific context here instead of passing TODO()?
existingPorts, err := GetExistingProvServerPorts(context.TODO(), webhookClient, r)
if err != nil {
return err
}
for name, port := range existingPorts {
namespacedName := types.NamespacedName{Namespace: r.Namespace, Name: r.Name}
if port == r.Spec.Port && name != namespacedName.String() {
return fmt.Errorf("port %d is already in use by another OpenStackProvisionServer: %s", port, name)
}
}
return nil
}
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
func (r *OpenStackProvisionServer) ValidateDelete() (admission.Warnings, error) {
openstackprovisionserverlog.Info("validate delete", "name", r.Name)
return nil, nil
}
var _ webhook.Defaulter = &OpenStackProvisionServer{}
// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *OpenStackProvisionServer) Default() {
openstackprovisionserverlog.Info("default", "name", r.Name)
if r.Spec.OSContainerImageURL == "" {
r.Spec.OSContainerImageURL = openstackProvisionServerDefaults.OSContainerImageURL
}
if r.Spec.AgentImageURL == "" {
r.Spec.AgentImageURL = openstackProvisionServerDefaults.AgentImageURL
}
if r.Spec.ApacheImageURL == "" {
r.Spec.ApacheImageURL = openstackProvisionServerDefaults.ApacheImageURL
}
if r.Spec.OSImage == "" {
r.Spec.OSImage = openstackProvisionServerDefaults.OSImage
}
if r.Spec.Port == 0 {
err := AssignProvisionServerPort(context.TODO(), webhookClient, r,
ProvisionServerPortStart, ProvisionServerPortEnd)
if err != nil {
// If this occurs, it will also be caught just after this defaulting webhook in the
// validating webhook, because that webhook calls the same underlying function that
// checks for the availability of ports. That will cause the create/update of the
// CR to fail and halt moving forward.
openstackprovisionserverlog.Error(err, "Cannot assign port for OpenStackProvisionServer", "OpenStackProvisionServer", r)
}
}
}