@@ -26,6 +26,7 @@ import (
2626
2727 clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
2828 "github.com/kubermatic/machine-controller/pkg/cloudprovider/instance"
29+ cloudprovidertypes "github.com/kubermatic/machine-controller/pkg/cloudprovider/types"
2930 providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types"
3031
3132 corev1 "k8s.io/api/core/v1"
@@ -36,6 +37,7 @@ import (
3637 "k8s.io/client-go/kubernetes/scheme"
3738 "k8s.io/client-go/tools/record"
3839 "k8s.io/klog"
40+ ctrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client"
3941 ctrlruntimefake "sigs.k8s.io/controller-runtime/pkg/client/fake"
4042)
4143
@@ -99,7 +101,8 @@ func TestController_GetNode(t *testing.T) {
99101 node1 := getTestNode ("1" , "aws" )
100102 node2 := getTestNode ("2" , "openstack" )
101103 node3 := getTestNode ("3" , "" )
102- nodeList := []* corev1.Node {& node1 , & node2 , & node3 }
104+ node4 := getTestNode ("4" , "hetzner" )
105+ nodeList := []* corev1.Node {& node1 , & node2 , & node3 , & node4 }
103106
104107 tests := []struct {
105108 name string
@@ -149,6 +152,38 @@ func TestController_GetNode(t *testing.T) {
149152 err : nil ,
150153 instance : & fakeInstance {id : "3" , addresses : map [string ]corev1.NodeAddressType {"172.16.1.3" : corev1 .NodeInternalIP }},
151154 },
155+ {
156+ name : "hetzner node found by internal ip" ,
157+ provider : "hetzner" ,
158+ resNode : & node3 ,
159+ exists : true ,
160+ err : nil ,
161+ instance : & fakeInstance {id : "3" , name : "node3" , addresses : map [string ]corev1.NodeAddressType {"192.168.1.3" : corev1 .NodeInternalIP }},
162+ },
163+ {
164+ name : "hetzner node found by external ip" ,
165+ provider : "hetzner" ,
166+ resNode : & node3 ,
167+ exists : true ,
168+ err : nil ,
169+ instance : & fakeInstance {id : "3" , name : "node3" , addresses : map [string ]corev1.NodeAddressType {"172.16.1.3" : corev1 .NodeExternalIP }},
170+ },
171+ {
172+ name : "hetzner node not found - node and instance names mismatch" ,
173+ provider : "hetzner" ,
174+ resNode : nil ,
175+ exists : false ,
176+ err : nil ,
177+ instance : & fakeInstance {id : "3" , name : "instance3" , addresses : map [string ]corev1.NodeAddressType {"192.168.1.3" : corev1 .NodeInternalIP }},
178+ },
179+ {
180+ name : "hetzner node found by provider id" ,
181+ provider : "hetzner" ,
182+ resNode : & node4 ,
183+ exists : true ,
184+ err : nil ,
185+ instance : & fakeInstance {id : "4" , addresses : map [string ]corev1.NodeAddressType {"" : "" }},
186+ },
152187 }
153188
154189 for _ , test := range tests {
@@ -427,3 +462,137 @@ func TestControllerShouldEvict(t *testing.T) {
427462 })
428463 }
429464}
465+
466+ func TestControllerDeleteNodeForMachine (t * testing.T ) {
467+ machineUID := types .UID ("test-1" )
468+
469+ tests := []struct {
470+ name string
471+ machine * clusterv1alpha1.Machine
472+ nodes []runtime.Object
473+ err error
474+ shouldDeleteNode string
475+ }{
476+ {
477+ name : "delete node by nodeRef" ,
478+ machine : & clusterv1alpha1.Machine {
479+ ObjectMeta : metav1.ObjectMeta {
480+ Name : "machine-1" ,
481+ Finalizers : []string {"machine-node-delete-finalizer" },
482+ },
483+ Status : clusterv1alpha1.MachineStatus {
484+ NodeRef : & corev1.ObjectReference {Name : "node-1" },
485+ },
486+ },
487+ nodes : []runtime.Object {& corev1.Node {
488+ ObjectMeta : metav1.ObjectMeta {
489+ Name : "node-0" ,
490+ }}, & corev1.Node {
491+ ObjectMeta : metav1.ObjectMeta {
492+ Name : "node-1" ,
493+ }},
494+ },
495+ err : nil ,
496+ shouldDeleteNode : "node-1" ,
497+ },
498+ {
499+ name : "delete node by NodeOwner label" ,
500+ machine : & clusterv1alpha1.Machine {
501+ ObjectMeta : metav1.ObjectMeta {
502+ Name : "machine-1" ,
503+ Finalizers : []string {"machine-node-delete-finalizer" },
504+ UID : machineUID ,
505+ },
506+ Status : clusterv1alpha1.MachineStatus {},
507+ },
508+ nodes : []runtime.Object {
509+ & corev1.Node {
510+ ObjectMeta : metav1.ObjectMeta {
511+ Name : "node-0" ,
512+ Labels : map [string ]string {
513+ NodeOwnerLabelName : string (machineUID ),
514+ },
515+ },
516+ },
517+ & corev1.Node {
518+ ObjectMeta : metav1.ObjectMeta {
519+ Name : "node-1" ,
520+ },
521+ },
522+ },
523+ err : nil ,
524+ shouldDeleteNode : "node-0" ,
525+ },
526+ {
527+ name : "no node should be deleted" ,
528+ machine : & clusterv1alpha1.Machine {
529+ ObjectMeta : metav1.ObjectMeta {
530+ Name : "machine-1" ,
531+ Finalizers : []string {"machine-node-delete-finalizer" },
532+ UID : machineUID ,
533+ },
534+ Status : clusterv1alpha1.MachineStatus {},
535+ },
536+ nodes : []runtime.Object {
537+ & corev1.Node {
538+ ObjectMeta : metav1.ObjectMeta {
539+ Name : "node-0" ,
540+ },
541+ },
542+ & corev1.Node {
543+ ObjectMeta : metav1.ObjectMeta {
544+ Name : "node-1" ,
545+ },
546+ },
547+ },
548+ err : nil ,
549+ shouldDeleteNode : "" ,
550+ },
551+ }
552+
553+ for _ , test := range tests {
554+ t .Run (test .name , func (t * testing.T ) {
555+ objects := []runtime.Object {test .machine }
556+ objects = append (objects , test .nodes ... )
557+
558+ client := ctrlruntimefake .NewFakeClient (objects ... )
559+
560+ ctx := context .TODO ()
561+ providerData := & cloudprovidertypes.ProviderData {
562+ Ctx : ctx ,
563+ Update : cloudprovidertypes .GetMachineUpdater (ctx , client ),
564+ Client : client ,
565+ }
566+
567+ reconciler := & Reconciler {
568+ client : client ,
569+ recorder : & record.FakeRecorder {},
570+ providerData : providerData ,
571+ }
572+
573+ err := reconciler .deleteNodeForMachine (test .machine )
574+ if diff := deep .Equal (err , test .err ); diff != nil {
575+ t .Errorf ("expected to get %v instead got: %v" , test .err , err )
576+ }
577+ if err != nil {
578+ return
579+ }
580+
581+ if test .shouldDeleteNode != "" {
582+ err = client .Get (ctx , types.NamespacedName {Name : test .shouldDeleteNode }, & corev1.Node {})
583+ if ! kerrors .IsNotFound (err ) {
584+ t .Errorf ("expected node %q to be deleted, but got: %v" , test .shouldDeleteNode , err )
585+ }
586+ } else {
587+ nodes := & corev1.NodeList {}
588+ err = client .List (ctx , nodes , & ctrlruntimeclient.ListOptions {})
589+ if err != nil {
590+ t .Errorf ("error listing nodes: %v" , err )
591+ }
592+ if len (test .nodes ) != len (nodes .Items ) {
593+ t .Errorf ("expected %d nodes, but got %d" , len (test .nodes ), len (nodes .Items ))
594+ }
595+ }
596+ })
597+ }
598+ }
0 commit comments