Skip to content

Commit b8a7e87

Browse files
committed
fixes
1 parent 6b5e56e commit b8a7e87

File tree

4 files changed

+94
-9
lines changed

4 files changed

+94
-9
lines changed

api/v1beta1/machinedrainrules_types.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,9 @@ type MachineDrainRuleDrainConfig struct {
134134
Order *int32 `json:"order,omitempty"`
135135
}
136136

137+
// MachineDrainRuleMachineSelector defines to which Machines this MachineDrainRule should be applied.
137138
// +kubebuilder:validation:MinProperties=1
138-
type MachineDrainRuleMachineSelector struct { //nolint:revive // Intentionally not adding a godoc comment as it would show up additionally to the field comment in the CRD
139+
type MachineDrainRuleMachineSelector struct {
139140
// selector is a label selector which selects Machines by their labels.
140141
// This field follows standard label selector semantics; if not present or
141142
// empty, it selects all Machines.
@@ -160,8 +161,9 @@ type MachineDrainRuleMachineSelector struct { //nolint:revive // Intentionally n
160161
ClusterSelector *metav1.LabelSelector `json:"clusterSelector,omitempty"`
161162
}
162163

164+
// MachineDrainRulePodSelector defines to which Pods this MachineDrainRule should be applied.
163165
// +kubebuilder:validation:MinProperties=1
164-
type MachineDrainRulePodSelector struct { //nolint:revive // Intentionally not adding a godoc comment as it would show up additionally to the field comment in the CRD
166+
type MachineDrainRulePodSelector struct {
165167
// selector is a label selector which selects Pods by their labels.
166168
// This field follows standard label selector semantics; if not present or
167169
// empty, it selects all Pods.

config/crd/bases/cluster.x-k8s.io_machinedrainrules.yaml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/test/envtest/environment.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ func newEnvironment(uncachedObjs ...client.Object) *Environment {
334334
if err := (&webhooks.MachineDeployment{}).SetupWebhookWithManager(mgr); err != nil {
335335
klog.Fatalf("unable to create webhook: %+v", err)
336336
}
337+
if err := (&webhooks.MachineDrainRule{}).SetupWebhookWithManager(mgr); err != nil {
338+
klog.Fatalf("unable to create webhook: %+v", err)
339+
}
337340
if err := (&bootstrapwebhooks.KubeadmConfig{}).SetupWebhookWithManager(mgr); err != nil {
338341
klog.Fatalf("unable to create webhook: %+v", err)
339342
}

internal/webhooks/machinedrainrules_test.go renamed to internal/webhooks/test/machinedrainrules_test.go

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package webhooks
17+
package test
1818

1919
import (
2020
"testing"
@@ -44,7 +44,8 @@ func Test_validate(t *testing.T) {
4444
name: "Return no error if MachineDrainRule is valid",
4545
machineDrainRule: &clusterv1.MachineDrainRule{
4646
ObjectMeta: metav1.ObjectMeta{
47-
Name: "mdr",
47+
Name: "mdr",
48+
Namespace: metav1.NamespaceDefault,
4849
},
4950
Spec: clusterv1.MachineDrainRuleSpec{
5051
Drain: clusterv1.MachineDrainRuleDrainConfig{
@@ -86,7 +87,8 @@ func Test_validate(t *testing.T) {
8687
name: "Return error if order is set with drain behavior Skip",
8788
machineDrainRule: &clusterv1.MachineDrainRule{
8889
ObjectMeta: metav1.ObjectMeta{
89-
Name: "mdr",
90+
Name: "mdr",
91+
Namespace: metav1.NamespaceDefault,
9092
},
9193
Spec: clusterv1.MachineDrainRuleSpec{
9294
Drain: clusterv1.MachineDrainRuleDrainConfig{
@@ -95,14 +97,16 @@ func Test_validate(t *testing.T) {
9597
},
9698
},
9799
},
98-
wantErr: "MachineDrainRule.cluster.x-k8s.io \"mdr\" is invalid: " +
100+
wantErr: "admission webhook \"validation.machinedrainrule.cluster.x-k8s.io\" denied the request: " +
101+
"MachineDrainRule.cluster.x-k8s.io \"mdr\" is invalid: " +
99102
"spec.drain.order: Invalid value: 5: order must not be set if drain behavior is \"Skip\"",
100103
},
101104
{
102105
name: "Return error for MachineDrainRules with invalid selector",
103106
machineDrainRule: &clusterv1.MachineDrainRule{
104107
ObjectMeta: metav1.ObjectMeta{
105-
Name: "mdr",
108+
Name: "mdr",
109+
Namespace: metav1.NamespaceDefault,
106110
},
107111
Spec: clusterv1.MachineDrainRuleSpec{
108112
Drain: clusterv1.MachineDrainRuleDrainConfig{
@@ -122,24 +126,96 @@ func Test_validate(t *testing.T) {
122126
},
123127
},
124128
},
125-
wantErr: "MachineDrainRule.cluster.x-k8s.io \"mdr\" is invalid: [" +
129+
wantErr: "admission webhook \"validation.machinedrainrule.cluster.x-k8s.io\" denied the request: " +
130+
"MachineDrainRule.cluster.x-k8s.io \"mdr\" is invalid: [" +
126131
"spec.machines[0].selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string(nil), MatchExpressions:[]v1.LabelSelectorRequirement{v1.LabelSelectorRequirement{Key:\"\", Operator:\"Invalid-Operator\", Values:[]string(nil)}}}: \"Invalid-Operator\" is not a valid label selector operator, " +
127132
"spec.machines[0].clusterSelector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string(nil), MatchExpressions:[]v1.LabelSelectorRequirement{v1.LabelSelectorRequirement{Key:\"\", Operator:\"Invalid-Operator\", Values:[]string(nil)}}}: \"Invalid-Operator\" is not a valid label selector operator, " +
128133
"spec.pods[0].selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string(nil), MatchExpressions:[]v1.LabelSelectorRequirement{v1.LabelSelectorRequirement{Key:\"\", Operator:\"Invalid-Operator\", Values:[]string(nil)}}}: \"Invalid-Operator\" is not a valid label selector operator, " +
129134
"spec.pods[0].namespaceSelector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string(nil), MatchExpressions:[]v1.LabelSelectorRequirement{v1.LabelSelectorRequirement{Key:\"\", Operator:\"Invalid-Operator\", Values:[]string(nil)}}}: \"Invalid-Operator\" is not a valid label selector operator]",
130135
},
136+
{
137+
name: "Return error if selectors are not unique",
138+
machineDrainRule: &clusterv1.MachineDrainRule{
139+
ObjectMeta: metav1.ObjectMeta{
140+
Name: "mdr",
141+
Namespace: metav1.NamespaceDefault,
142+
},
143+
Spec: clusterv1.MachineDrainRuleSpec{
144+
Drain: clusterv1.MachineDrainRuleDrainConfig{
145+
Behavior: clusterv1.MachineDrainRuleDrainBehaviorSkip,
146+
},
147+
Machines: []clusterv1.MachineDrainRuleMachineSelector{
148+
{
149+
Selector: &metav1.LabelSelector{
150+
MatchLabels: map[string]string{
151+
"os": "linux",
152+
},
153+
},
154+
ClusterSelector: &metav1.LabelSelector{
155+
MatchLabels: map[string]string{
156+
"stage": "production",
157+
},
158+
},
159+
},
160+
{
161+
Selector: &metav1.LabelSelector{
162+
MatchLabels: map[string]string{
163+
"os": "linux",
164+
},
165+
},
166+
ClusterSelector: &metav1.LabelSelector{
167+
MatchLabels: map[string]string{
168+
"stage": "production",
169+
},
170+
},
171+
},
172+
},
173+
Pods: []clusterv1.MachineDrainRulePodSelector{
174+
{
175+
Selector: &metav1.LabelSelector{
176+
MatchLabels: map[string]string{
177+
"app": "does-not-match",
178+
},
179+
},
180+
NamespaceSelector: &metav1.LabelSelector{
181+
MatchLabels: map[string]string{
182+
"kubernetes.io/metadata.name": "monitoring",
183+
},
184+
},
185+
},
186+
{
187+
Selector: &metav1.LabelSelector{
188+
MatchLabels: map[string]string{
189+
"app": "does-not-match",
190+
},
191+
},
192+
NamespaceSelector: &metav1.LabelSelector{
193+
MatchLabels: map[string]string{
194+
"kubernetes.io/metadata.name": "monitoring",
195+
},
196+
},
197+
},
198+
},
199+
},
200+
},
201+
wantErr: "MachineDrainRule.cluster.x-k8s.io \"mdr\" is invalid: [" +
202+
"spec.machines: Invalid value: \"array\": entries in machines must be unique, " +
203+
"spec.pods: Invalid value: \"array\": entries in pods must be unique]",
204+
},
131205
}
132206

133207
for _, tt := range tests {
134208
t.Run(tt.name, func(t *testing.T) {
135209
g := NewWithT(t)
136210

137-
err := (&MachineDrainRule{}).validate(tt.machineDrainRule)
211+
err := env.CreateAndWait(ctx, tt.machineDrainRule)
212+
138213
if tt.wantErr != "" {
139214
g.Expect(err).To(HaveOccurred())
140215
g.Expect(err.Error()).To(BeComparableTo(tt.wantErr))
141216
} else {
142217
g.Expect(err).ToNot(HaveOccurred())
218+
g.Expect(env.CleanupAndWait(ctx, tt.machineDrainRule)).To(Succeed())
143219
}
144220
})
145221
}

0 commit comments

Comments
 (0)