Skip to content
This repository has been archived by the owner on Jan 29, 2025. It is now read-only.

Commit

Permalink
Add node reboot controller unittest
Browse files Browse the repository at this point in the history
Signed-off-by: Artyom Lukianov <[email protected]>
  • Loading branch information
Artyom Lukianov committed Oct 27, 2019
1 parent 2644721 commit 239a874
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 8 deletions.
1 change: 1 addition & 0 deletions cmd/machine-remediation/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ go_library(
"//pkg/baremetal/remediator:go_default_library",
"//pkg/controllers:go_default_library",
"//pkg/controllers/machineremediation:go_default_library",
"//pkg/controllers/nodereboot:go_default_library",
"//pkg/version:go_default_library",
"//vendor/github.com/golang/glog:go_default_library",
"//vendor/github.com/metal3-io/baremetal-operator/pkg/apis/metal3/v1alpha1:go_default_library",
Expand Down
3 changes: 2 additions & 1 deletion cmd/machine-remediation/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"kubevirt.io/machine-remediation-operator/pkg/baremetal/remediator"
"kubevirt.io/machine-remediation-operator/pkg/controllers"
"kubevirt.io/machine-remediation-operator/pkg/controllers/machineremediation"
"kubevirt.io/machine-remediation-operator/pkg/controllers/nodereboot"
"kubevirt.io/machine-remediation-operator/pkg/version"

mapiv1 "sigs.k8s.io/cluster-api/pkg/apis/machine/v1beta1"
Expand Down Expand Up @@ -72,7 +73,7 @@ func main() {
}

// Setup all Controllers
if err := controllers.AddToManager(mgr, opts, addController); err != nil {
if err := controllers.AddToManager(mgr, opts, addController, nodereboot.Add); err != nil {
glog.Fatal(err)
}

Expand Down
24 changes: 22 additions & 2 deletions pkg/controllers/nodereboot/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
load("@io_bazel_rules_go//go:def.bzl", "go_library")
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")

go_library(
name = "go_default_library",
srcs = ["nodereboot.go"],
srcs = ["nodereboot_controller.go"],
importpath = "kubevirt.io/machine-remediation-operator/pkg/controllers/nodereboot",
visibility = ["//visibility:public"],
deps = [
Expand All @@ -21,3 +21,23 @@ go_library(
"//vendor/sigs.k8s.io/controller-runtime/pkg/source:go_default_library",
],
)

go_test(
name = "go_default_test",
srcs = ["nodereboot_controller_test.go"],
embed = [":go_default_library"],
deps = [
"//pkg/apis/machineremediation/v1alpha1:go_default_library",
"//pkg/consts:go_default_library",
"//pkg/utils/testing:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library",
"//vendor/sigs.k8s.io/cluster-api/pkg/apis/machine/v1beta1:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/client/fake:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/reconcile:go_default_library",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,15 @@ func isRebootInProgress(c client.Client, machineName string) (bool, error) {
return false, err
}

rebootInProgress := false

for _, mr := range machineRemediations.Items {
if mr.Spec.MachineName == machineName {
if mr.Status.EndTime != nil {
return true, nil
if mr.Status.EndTime == nil {
rebootInProgress = true
break
}
}
}
return false, nil
return rebootInProgress, nil
}
104 changes: 104 additions & 0 deletions pkg/controllers/nodereboot/nodereboot_controller_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package nodereboot

import (
"context"
"testing"
"time"

"github.com/stretchr/testify/assert"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes/scheme"

mrv1 "kubevirt.io/machine-remediation-operator/pkg/apis/machineremediation/v1alpha1"
"kubevirt.io/machine-remediation-operator/pkg/consts"
mrotesting "kubevirt.io/machine-remediation-operator/pkg/utils/testing"

mapiv1 "sigs.k8s.io/cluster-api/pkg/apis/machine/v1beta1"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

func init() {
// Add types to scheme
mrv1.AddToScheme(scheme.Scheme)
mapiv1.AddToScheme(scheme.Scheme)
}

// newFakeReconciler returns a new reconcile.Reconciler with a fake client
func newFakeReconciler(initObjects ...runtime.Object) *ReconcileNodeReboot {
fakeClient := fake.NewFakeClient(initObjects...)
return &ReconcileNodeReboot{
client: fakeClient,
namespace: consts.NamespaceOpenshiftMachineAPI,
}
}

func TestReconcile(t *testing.T) {
nodeWithRebootAnnotation := mrotesting.NewNode("nodeWithRebootAnnotation", true, "machineWithRebootAnnotation")
nodeWithRebootAnnotation.Annotations[consts.AnnotationNodeMachineReboot] = ""
machineWithRebootAnnotation := mrotesting.NewMachine("machineWithRebootAnnotation", nodeWithRebootAnnotation.Name, "")

nodeWithoutRebootAnnotation := mrotesting.NewNode("nodeWithoutRebootAnnotation", true, "machineWithoutRebootAnnotation")
machineWithoutRebootAnnotation := mrotesting.NewMachine("machineWithoutRebootAnnotation", nodeWithoutRebootAnnotation.Name, "")

machineRemediationEnded := mrotesting.NewMachineRemediation("machineRemediationEnded", machineWithRebootAnnotation.Name, mrv1.RemediationTypeReboot, mrv1.RemediationStateFailed)
machineRemediationEnded.Status.EndTime = &metav1.Time{Time: time.Now()}
machineRemediationNotEnded := mrotesting.NewMachineRemediation("machineRemediationNotEnded", machineWithRebootAnnotation.Name, mrv1.RemediationTypeReboot, mrv1.RemediationStateStarted)

testsCases := []struct {
node *corev1.Node
machineRemdiation *mrv1.MachineRemediation
expectedNumMachineRemediations int
}{
{
node: nodeWithRebootAnnotation,
machineRemdiation: nil,
expectedNumMachineRemediations: 1,
},
{
node: nodeWithoutRebootAnnotation,
machineRemdiation: nil,
expectedNumMachineRemediations: 0,
},
{
node: nodeWithRebootAnnotation,
machineRemdiation: machineRemediationEnded,
expectedNumMachineRemediations: 2,
},
{
node: nodeWithRebootAnnotation,
machineRemdiation: machineRemediationNotEnded,
expectedNumMachineRemediations: 1,
},
}

for _, tc := range testsCases {
objects := []runtime.Object{
machineWithRebootAnnotation,
machineWithoutRebootAnnotation,
tc.node,
}
if tc.machineRemdiation != nil {
objects = append(objects, tc.machineRemdiation)
}
r := newFakeReconciler(objects...)
request := reconcile.Request{
NamespacedName: types.NamespacedName{
Namespace: metav1.NamespaceNone,
Name: tc.node.Name,
},
}
result, err := r.Reconcile(request)
assert.NoError(t, err)
assert.Equal(t, result, reconcile.Result{})

mrList := &mrv1.MachineRemediationList{}
assert.NoError(t, r.client.List(context.TODO(), mrList))

assert.Equal(t, len(mrList.Items), tc.expectedNumMachineRemediations)
}
}
4 changes: 2 additions & 2 deletions vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -273,12 +273,12 @@ k8s.io/apimachinery/pkg/labels
k8s.io/apimachinery/pkg/api/equality
k8s.io/apimachinery/pkg/util/wait
k8s.io/apimachinery/pkg/api/resource
k8s.io/apimachinery/pkg/api/meta
k8s.io/apimachinery/pkg/util/rand
k8s.io/apimachinery/pkg/apis/meta/v1/unstructured
k8s.io/apimachinery/pkg/apis/meta/v1/validation
k8s.io/apimachinery/pkg/util/intstr
k8s.io/apimachinery/pkg/util/validation/field
k8s.io/apimachinery/pkg/api/meta
k8s.io/apimachinery/pkg/conversion
k8s.io/apimachinery/pkg/util/json
k8s.io/apimachinery/pkg/fields
Expand Down Expand Up @@ -316,6 +316,7 @@ k8s.io/client-go/discovery/fake
k8s.io/client-go/testing
k8s.io/client-go/tools/record
k8s.io/client-go/util/retry
k8s.io/client-go/restmapper
k8s.io/client-go/tools/clientcmd
k8s.io/client-go/kubernetes/scheme
k8s.io/client-go/tools/leaderelection
Expand All @@ -337,7 +338,6 @@ k8s.io/client-go/tools/clientcmd/api/latest
k8s.io/client-go/util/homedir
k8s.io/client-go/kubernetes/typed/coordination/v1
k8s.io/client-go/kubernetes/typed/core/v1
k8s.io/client-go/restmapper
k8s.io/client-go/kubernetes
k8s.io/client-go/pkg/apis/clientauthentication
k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1
Expand Down

0 comments on commit 239a874

Please sign in to comment.