Skip to content

Commit 4bfd53b

Browse files
Merge pull request #347 from mshitrit/wrong-cr-name-machine
MHC created CR isn't deleted by the remediator
2 parents a4fff24 + b45a5c5 commit 4bfd53b

7 files changed

+68
-31
lines changed

Diff for: controllers/machinehealthcheck_controller.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -403,19 +403,21 @@ func (r *MachineHealthCheckReconciler) remediate(target resources.Target, rm res
403403
if err != nil {
404404
return errors.Wrapf(err, "failed to get remediation template")
405405
}
406-
remediationCR, err := rm.GenerateRemediationCRForMachine(target.Machine, target.MHC, template)
407-
if err != nil {
408-
return errors.Wrapf(err, "failed to generate remediation CR")
406+
407+
var nodeNamePtr *string
408+
if target.Node != nil && target.Node.ResourceVersion != "" {
409+
nodeNamePtr = &target.Node.Name
409410
}
410411

411412
// TODO add control plane label
412413

413414
// create remediation CR
414-
var nodeName *string
415-
if target.Node != nil && target.Node.ResourceVersion != "" {
416-
nodeName = &target.Node.Name
415+
remediationCR, err := rm.GenerateRemediationCRForMachine(target.Machine, target.MHC, template, pointer.StringDeref(nodeNamePtr, ""))
416+
if err != nil {
417+
return errors.Wrapf(err, "failed to generate remediation CR")
417418
}
418-
created, _, _, err := rm.CreateRemediationCR(remediationCR, target.MHC, nodeName, utils.DefaultRemediationDuration, 0)
419+
420+
created, _, _, err := rm.CreateRemediationCR(remediationCR, target.MHC, nodeNamePtr, utils.DefaultRemediationDuration, 0)
419421
if err != nil {
420422
if _, ok := err.(resources.RemediationCRNotOwned); ok {
421423
// CR exists but not owned by us, nothing to do

Diff for: controllers/machinehealthcheck_controller_test.go

+42-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"testing"
1010
"time"
1111

12+
commonannotations "github.com/medik8s/common/pkg/annotations"
1213
. "github.com/onsi/gomega"
1314

1415
corev1 "k8s.io/api/core/v1"
@@ -122,16 +123,16 @@ func TestReconcile(t *testing.T) {
122123
machineWithoutNodeRef := newMachine("machineWithoutNodeRef", nodeAnnotatedWithMachineWithoutNodeReference.Name)
123124
machineWithoutNodeRef.Status.NodeRef = nil
124125

125-
machineHealthCheck := newMachineHealthCheck("machineHealthCheck")
126+
machineHealthCheck := newMachineHealthCheck("machineHealthCheck", infraRemediationTemplateRef)
126127
nodeStartupTimeout := 15 * time.Minute
127128
machineHealthCheck.Spec.NodeStartupTimeout = &metav1.Duration{Duration: nodeStartupTimeout}
128129

129-
machineHealthCheckNegativeMaxUnhealthy := newMachineHealthCheck("machineHealthCheckNegativeMaxUnhealthy")
130+
machineHealthCheckNegativeMaxUnhealthy := newMachineHealthCheck("machineHealthCheckNegativeMaxUnhealthy", infraRemediationTemplateRef)
130131
negativeOne := intstr.FromInt(-1)
131132
machineHealthCheckNegativeMaxUnhealthy.Spec.MaxUnhealthy = &negativeOne
132133
machineHealthCheckNegativeMaxUnhealthy.Spec.NodeStartupTimeout = &metav1.Duration{Duration: nodeStartupTimeout}
133134

134-
machineHealthCheckPaused := newMachineHealthCheck("machineHealthCheck")
135+
machineHealthCheckPaused := newMachineHealthCheck("machineHealthCheck", infraRemediationTemplateRef)
135136
machineHealthCheckPaused.Annotations = make(map[string]string)
136137
machineHealthCheckPaused.Annotations[annotations.MHCPausedAnnotation] = "test"
137138

@@ -387,15 +388,18 @@ func TestReconcileExternalRemediationTemplate(t *testing.T) {
387388
machineWithNodeUnHealthy := newMachine("Machine", nodeUnHealthy.Name)
388389
machineWithNodeUnHealthy.APIVersion = machinev1.SchemeGroupVersion.String()
389390

390-
mhc := newMachineHealthCheck("machineHealthCheck")
391+
mhc := newMachineHealthCheck("machineHealthCheck", infraRemediationTemplateRef)
392+
mhcMultipleSupport := newMachineHealthCheck("machineHealthCheck", infraMultipleRemediationTemplateRef)
393+
391394
remediationTemplateCR := newTestRemediationTemplateCR(InfraRemediationKind, MachineNamespace, InfraRemediationTemplateName)
395+
remediationMultipleSupportTemplateCR := newTestRemediationTemplateCR(InfraRemediationKind, MachineNamespace, InfraMultipleSupportRemediationTemplateName)
392396
owner := metav1.OwnerReference{
393397
APIVersion: mhc.APIVersion,
394398
Kind: mhc.Kind,
395399
Name: mhc.Name,
396400
UID: mhc.UID,
397401
}
398-
remediationCR := newRemediationCR(machineWithNodeUnHealthy.Name, *mhc.Spec.RemediationTemplate, owner)
402+
remediationCR := newRemediationCR(machineWithNodeUnHealthy.Name, nodeUnHealthy.Name, *mhc.Spec.RemediationTemplate, owner)
399403

400404
testCases := []testCase{
401405

@@ -464,6 +468,28 @@ func TestReconcileExternalRemediationTemplate(t *testing.T) {
464468
},
465469
},
466470
},
471+
472+
{
473+
name: "create new multiple template supported remediation",
474+
machine: machineWithNodeUnHealthy,
475+
node: nodeUnHealthy,
476+
mhc: mhcMultipleSupport,
477+
remediationCR: nil,
478+
remediationTemplate: remediationMultipleSupportTemplateCR,
479+
expected: expectedReconcile{
480+
result: reconcile.Result{},
481+
error: false,
482+
},
483+
expectedEvents: []string{utils.EventReasonRemediationCreated},
484+
expectedStatus: &machinev1.MachineHealthCheckStatus{
485+
ExpectedMachines: pointer.Int(1),
486+
CurrentHealthy: pointer.Int(0),
487+
RemediationsAllowed: 0,
488+
Conditions: machinev1.Conditions{
489+
remediationAllowedCondition,
490+
},
491+
},
492+
},
467493
}
468494

469495
for _, tc := range testCases {
@@ -849,7 +875,7 @@ func TestMHCRequestsFromNode(t *testing.T) {
849875
func TestGetTargetsFromMHC(t *testing.T) {
850876
machine1 := newMachine("match1", "node1")
851877
machine2 := newMachine("match2", "node2")
852-
mhc := newMachineHealthCheck("findTargets")
878+
mhc := newMachineHealthCheck("findTargets", infraRemediationTemplateRef)
853879
testCases := []struct {
854880
testCase string
855881
mhc *machinev1.MachineHealthCheck
@@ -2485,6 +2511,10 @@ func buildRunTimeObjects(tc testCase) []runtime.Object {
24852511
objects = append(objects, newTestRemediationCRD(testRemediationKind))
24862512
objects = append(objects, newTestRemediationTemplateCR(testRemediationKind, MachineNamespace, InfraRemediationTemplateName))
24872513

2514+
templateMultiSupportCR := newTestRemediationTemplateCR(testRemediationKind, MachineNamespace, InfraMultipleSupportRemediationTemplateName)
2515+
templateMultiSupportCR.SetAnnotations(map[string]string{commonannotations.MultipleTemplatesSupportedAnnotation: "true"})
2516+
objects = append(objects, templateMultiSupportCR)
2517+
24882518
return objects
24892519
}
24902520

@@ -2501,6 +2531,10 @@ func verifyRemediationCR(t *testing.T, tc testCase, ctx context.Context, client
25012531
}
25022532
if isExist {
25032533
g.Expect(client.Get(ctx, nameSpace, remediationCR)).To(Succeed())
2534+
crAnnotations := remediationCR.GetAnnotations()
2535+
g.Expect(crAnnotations).ToNot(BeNil())
2536+
g.Expect(crAnnotations[commonannotations.NodeNameAnnotation]).Should(Equal(tc.node.Name))
2537+
g.Expect(crAnnotations[annotations.TemplateNameAnnotation]).Should(Equal(tc.remediationTemplate.GetName()))
25042538
} else {
25052539
g.Expect(client.Get(ctx, nameSpace, remediationCR)).NotTo(Succeed())
25062540
}
@@ -2588,7 +2622,7 @@ func newMachine(name string, nodeName string) *machinev1.Machine {
25882622
}
25892623

25902624
// newMachineHealthCheck returns new MachineHealthCheck object that can be used for testing
2591-
func newMachineHealthCheck(name string) *machinev1.MachineHealthCheck {
2625+
func newMachineHealthCheck(name string, remediationTemplate *corev1.ObjectReference) *machinev1.MachineHealthCheck {
25922626
return &machinev1.MachineHealthCheck{
25932627
ObjectMeta: metav1.ObjectMeta{
25942628
Name: name,
@@ -2615,7 +2649,7 @@ func newMachineHealthCheck(name string) *machinev1.MachineHealthCheck {
26152649
Timeout: metav1.Duration{Duration: 300 * time.Second},
26162650
},
26172651
},
2618-
RemediationTemplate: infraRemediationTemplateRef,
2652+
RemediationTemplate: remediationTemplate,
26192653
},
26202654
Status: machinev1.MachineHealthCheckStatus{},
26212655
}

Diff for: controllers/nodehealthcheck_controller_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2298,7 +2298,7 @@ func newRemediationCRForNHC(nodeName string, nhc *v1alpha1.NodeHealthCheck) *uns
22982298
Name: nhc.Name,
22992299
UID: nhc.UID,
23002300
}
2301-
return newRemediationCR(nodeName, templateRef, owner)
2301+
return newRemediationCR(nodeName, nodeName, templateRef, owner)
23022302
}
23032303

23042304
func newNodeHealthCheck() *v1alpha1.NodeHealthCheck {

Diff for: controllers/resources/manager.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type Manager interface {
3535
GenerateRemediationCRBase(gvk schema.GroupVersionKind) *unstructured.Unstructured
3636
GenerateRemediationCRBaseNamed(gvk schema.GroupVersionKind, namespace string, name string) *unstructured.Unstructured
3737
GenerateRemediationCRForNode(node *corev1.Node, owner client.Object, template *unstructured.Unstructured) (*unstructured.Unstructured, error)
38-
GenerateRemediationCRForMachine(machine *machinev1beta1.Machine, owner client.Object, template *unstructured.Unstructured) (*unstructured.Unstructured, error)
38+
GenerateRemediationCRForMachine(machine *machinev1beta1.Machine, owner client.Object, template *unstructured.Unstructured, nodeName string) (*unstructured.Unstructured, error)
3939
CreateRemediationCR(remediationCR *unstructured.Unstructured, owner client.Object, nodeName *string, currentRemediationDuration, previousRemediationsDuration time.Duration) (bool, *time.Duration, *unstructured.Unstructured, error)
4040
DeleteRemediationCR(remediationCR *unstructured.Unstructured, owner client.Object) (bool, error)
4141
UpdateRemediationCR(remediationCR *unstructured.Unstructured) error
@@ -98,10 +98,10 @@ func (m *manager) GenerateRemediationCRForNode(node *corev1.Node, owner client.O
9898
}
9999
}
100100

101-
return m.generateRemediationCR(node.GetName(), nhcOwnerRef, machineOwnerRef, template)
101+
return m.generateRemediationCR(node.GetName(), node.GetName(), nhcOwnerRef, machineOwnerRef, template)
102102
}
103103

104-
func (m *manager) GenerateRemediationCRForMachine(machine *machinev1beta1.Machine, owner client.Object, template *unstructured.Unstructured) (*unstructured.Unstructured, error) {
104+
func (m *manager) GenerateRemediationCRForMachine(machine *machinev1beta1.Machine, owner client.Object, template *unstructured.Unstructured, nodeName string) (*unstructured.Unstructured, error) {
105105

106106
mhcOwnerRef := createOwnerRef(owner)
107107

@@ -116,23 +116,25 @@ func (m *manager) GenerateRemediationCRForMachine(machine *machinev1beta1.Machin
116116
// So it can be ignored here.
117117
}
118118

119-
return m.generateRemediationCR(machine.GetName(), mhcOwnerRef, machineOwnerRef, template)
119+
return m.generateRemediationCR(machine.GetName(), nodeName, mhcOwnerRef, machineOwnerRef, template)
120120
}
121121

122-
func (m *manager) generateRemediationCR(name string, healthCheckOwnerRef *metav1.OwnerReference, machineOwnerRef *metav1.OwnerReference, template *unstructured.Unstructured) (*unstructured.Unstructured, error) {
122+
func (m *manager) generateRemediationCR(name string, nodeName string, healthCheckOwnerRef *metav1.OwnerReference, machineOwnerRef *metav1.OwnerReference, template *unstructured.Unstructured) (*unstructured.Unstructured, error) {
123123

124124
remediationCR := m.GenerateRemediationCRBase(template.GroupVersionKind())
125125

126126
// can't go wrong, we already checked for correct spec
127127
templateSpec, _, _ := unstructured.NestedMap(template.Object, "spec", "template", "spec")
128128
unstructured.SetNestedField(remediationCR.Object, templateSpec, "spec")
129129

130-
if annotations.HasMultipleTemplatesAnnotation(template) {
130+
// Multiple same kind templates are never supported for MHC, and remediators are not expected to handle generated names in this case, even if they do for NHC.
131+
isMHCRemediation := name != nodeName
132+
if annotations.HasMultipleTemplatesAnnotation(template) && !isMHCRemediation {
131133
remediationCR.SetGenerateName(fmt.Sprintf("%s-", name))
132134
} else {
133135
remediationCR.SetName(name)
134136
}
135-
remediationCR.SetAnnotations(map[string]string{commonannotations.NodeNameAnnotation: name, annotations.TemplateNameAnnotation: template.GetName()})
137+
remediationCR.SetAnnotations(map[string]string{commonannotations.NodeNameAnnotation: nodeName, annotations.TemplateNameAnnotation: template.GetName()})
136138

137139
remediationCR.SetNamespace(template.GetNamespace())
138140
remediationCR.SetResourceVersion("")

Diff for: controllers/suite_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ func newTestRemediationTemplateCR(kind, namespace, name string) *unstructured.Un
402402
return template
403403
}
404404

405-
func newRemediationCR(nodeName string, templateRef v1.ObjectReference, owner metav1.OwnerReference) *unstructured.Unstructured {
405+
func newRemediationCR(name string, nodeName string, templateRef v1.ObjectReference, owner metav1.OwnerReference) *unstructured.Unstructured {
406406

407407
// check template if it supports multiple same kind remediation
408408
// not needed (and fails for missing k8sclient) for MHC tests
@@ -423,9 +423,9 @@ func newRemediationCR(nodeName string, templateRef v1.ObjectReference, owner met
423423
cr := unstructured.Unstructured{}
424424
cr.SetNamespace(templateRef.Namespace)
425425
if mutipleSameKindSupported {
426-
cr.SetGenerateName(fmt.Sprintf("%s-", nodeName))
426+
cr.SetGenerateName(fmt.Sprintf("%s-", name))
427427
} else {
428-
cr.SetName(nodeName)
428+
cr.SetName(name)
429429
}
430430

431431
kind := templateRef.GroupVersionKind().Kind

Diff for: e2e/common_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"k8s.io/apimachinery/pkg/runtime/schema"
1212
)
1313

14-
func ensureRemediationResourceExists(name string, namespace string, remediationResource schema.GroupVersionResource) func() error {
14+
func ensureRemediationResourceExists(nodeName string, namespace string, remediationResource schema.GroupVersionResource) func() error {
1515
return func() error {
1616
// The CR name doesn't always match the node name in case multiple CRs of same type for the same node are supported
1717
// So list all, and look for the node name in the annotation
@@ -25,7 +25,7 @@ func ensureRemediationResourceExists(name string, namespace string, remediationR
2525
return err
2626
}
2727
for _, cr := range list.Items {
28-
if nodeName, exists := cr.GetAnnotations()[commonannotations.NodeNameAnnotation]; exists && nodeName == name {
28+
if annotationNodeName, exists := cr.GetAnnotations()[commonannotations.NodeNameAnnotation]; exists && annotationNodeName == nodeName {
2929
log.Info("found remediation resource")
3030
return nil
3131
}

Diff for: e2e/mhc_e2e_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ const (
3131

3232
var _ = Describe("e2e - MHC", Label("MHC", labelOcpOnlyValue), func() {
3333
var nodeUnderTest *v1.Node
34-
var machineNameUnderTest string
3534
var mhc *v1beta1.MachineHealthCheck
3635
var workers *v1.NodeList
3736
var leaseName string
@@ -84,7 +83,7 @@ var _ = Describe("e2e - MHC", Label("MHC", labelOcpOnlyValue), func() {
8483
nodeUnderTest = &workers.Items[0]
8584

8685
var err error
87-
_, machineNameUnderTest, err = controllerutils.GetMachineNamespaceName(nodeUnderTest)
86+
_, _, err = controllerutils.GetMachineNamespaceName(nodeUnderTest)
8887
Expect(err).ToNot(HaveOccurred(), "failed to get machine name from node")
8988

9089
leaseName = fmt.Sprintf("%s-%s", "node", nodeUnderTest.Name)
@@ -126,7 +125,7 @@ var _ = Describe("e2e - MHC", Label("MHC", labelOcpOnlyValue), func() {
126125
By("ensuring remediation CR exists")
127126
waitTime := nodeUnhealthyTime.Add(unhealthyConditionDuration + 3*time.Second).Sub(time.Now())
128127
Eventually(
129-
ensureRemediationResourceExists(machineNameUnderTest, mhcNamespace, remediationGVR), waitTime, "500ms").
128+
ensureRemediationResourceExists(nodeUnderTest.Name, mhcNamespace, remediationGVR), waitTime, "500ms").
130129
Should(Succeed())
131130

132131
By("ensuring lease exist")

0 commit comments

Comments
 (0)