@@ -5,13 +5,15 @@ import (
5
5
"fmt"
6
6
"io/ioutil"
7
7
"log"
8
+ "net"
8
9
"os"
9
10
"sync/atomic"
10
11
"testing"
11
12
"time"
12
13
13
14
"github.com/docker/docker/pkg/stringid"
14
15
"github.com/docker/go-events"
16
+ "github.com/hashicorp/memberlist"
15
17
"github.com/sirupsen/logrus"
16
18
"github.com/stretchr/testify/assert"
17
19
"github.com/stretchr/testify/require"
@@ -580,3 +582,156 @@ func TestNetworkDBGarbageCollection(t *testing.T) {
580
582
581
583
closeNetworkDBInstances (dbs )
582
584
}
585
+
586
+ func TestFindNode (t * testing.T ) {
587
+ dbs := createNetworkDBInstances (t , 1 , "node" , DefaultConfig ())
588
+
589
+ dbs [0 ].nodes ["active" ] = & node {Node : memberlist.Node {Name : "active" }}
590
+ dbs [0 ].failedNodes ["failed" ] = & node {Node : memberlist.Node {Name : "failed" }}
591
+ dbs [0 ].leftNodes ["left" ] = & node {Node : memberlist.Node {Name : "left" }}
592
+
593
+ // active nodes is 2 because the testing node is in the list
594
+ assert .Equal (t , 2 , len (dbs [0 ].nodes ))
595
+ assert .Equal (t , 1 , len (dbs [0 ].failedNodes ))
596
+ assert .Equal (t , 1 , len (dbs [0 ].leftNodes ))
597
+
598
+ n , currState , m := dbs [0 ].findNode ("active" )
599
+ assert .NotNil (t , n )
600
+ assert .Equal (t , "active" , n .Name )
601
+ assert .Equal (t , nodeActiveState , currState )
602
+ assert .NotNil (t , m )
603
+ // delete the entry manually
604
+ delete (m , "active" )
605
+
606
+ // test if can be still find
607
+ n , currState , m = dbs [0 ].findNode ("active" )
608
+ assert .Nil (t , n )
609
+ assert .Equal (t , nodeNotFound , currState )
610
+ assert .Nil (t , m )
611
+
612
+ n , currState , m = dbs [0 ].findNode ("failed" )
613
+ assert .NotNil (t , n )
614
+ assert .Equal (t , "failed" , n .Name )
615
+ assert .Equal (t , nodeFailedState , currState )
616
+ assert .NotNil (t , m )
617
+
618
+ // find and remove
619
+ n , currState , m = dbs [0 ].findNode ("left" )
620
+ assert .NotNil (t , n )
621
+ assert .Equal (t , "left" , n .Name )
622
+ assert .Equal (t , nodeLeftState , currState )
623
+ assert .NotNil (t , m )
624
+ delete (m , "left" )
625
+
626
+ n , currState , m = dbs [0 ].findNode ("left" )
627
+ assert .Nil (t , n )
628
+ assert .Equal (t , nodeNotFound , currState )
629
+ assert .Nil (t , m )
630
+
631
+ closeNetworkDBInstances (dbs )
632
+ }
633
+
634
+ func TestChangeNodeState (t * testing.T ) {
635
+ dbs := createNetworkDBInstances (t , 1 , "node" , DefaultConfig ())
636
+
637
+ dbs [0 ].nodes ["node1" ] = & node {Node : memberlist.Node {Name : "node1" }}
638
+ dbs [0 ].nodes ["node2" ] = & node {Node : memberlist.Node {Name : "node2" }}
639
+ dbs [0 ].nodes ["node3" ] = & node {Node : memberlist.Node {Name : "node3" }}
640
+
641
+ // active nodes is 4 because the testing node is in the list
642
+ assert .Equal (t , 4 , len (dbs [0 ].nodes ))
643
+
644
+ n , currState , m := dbs [0 ].findNode ("node1" )
645
+ assert .NotNil (t , n )
646
+ assert .Equal (t , nodeActiveState , currState )
647
+ assert .Equal (t , "node1" , n .Name )
648
+ assert .NotNil (t , m )
649
+
650
+ // node1 to failed
651
+ dbs [0 ].changeNodeState ("node1" , nodeFailedState )
652
+
653
+ n , currState , m = dbs [0 ].findNode ("node1" )
654
+ assert .NotNil (t , n )
655
+ assert .Equal (t , nodeFailedState , currState )
656
+ assert .Equal (t , "node1" , n .Name )
657
+ assert .NotNil (t , m )
658
+ assert .NotEqual (t , time .Duration (0 ), n .reapTime )
659
+
660
+ // node1 back to active
661
+ dbs [0 ].changeNodeState ("node1" , nodeActiveState )
662
+
663
+ n , currState , m = dbs [0 ].findNode ("node1" )
664
+ assert .NotNil (t , n )
665
+ assert .Equal (t , nodeActiveState , currState )
666
+ assert .Equal (t , "node1" , n .Name )
667
+ assert .NotNil (t , m )
668
+ assert .Equal (t , time .Duration (0 ), n .reapTime )
669
+
670
+ // node1 to left
671
+ dbs [0 ].changeNodeState ("node1" , nodeLeftState )
672
+ dbs [0 ].changeNodeState ("node2" , nodeLeftState )
673
+ dbs [0 ].changeNodeState ("node3" , nodeLeftState )
674
+
675
+ n , currState , m = dbs [0 ].findNode ("node1" )
676
+ assert .NotNil (t , n )
677
+ assert .Equal (t , nodeLeftState , currState )
678
+ assert .Equal (t , "node1" , n .Name )
679
+ assert .NotNil (t , m )
680
+ assert .NotEqual (t , time .Duration (0 ), n .reapTime )
681
+
682
+ n , currState , m = dbs [0 ].findNode ("node2" )
683
+ assert .NotNil (t , n )
684
+ assert .Equal (t , nodeLeftState , currState )
685
+ assert .Equal (t , "node2" , n .Name )
686
+ assert .NotNil (t , m )
687
+ assert .NotEqual (t , time .Duration (0 ), n .reapTime )
688
+
689
+ n , currState , m = dbs [0 ].findNode ("node3" )
690
+ assert .NotNil (t , n )
691
+ assert .Equal (t , nodeLeftState , currState )
692
+ assert .Equal (t , "node3" , n .Name )
693
+ assert .NotNil (t , m )
694
+ assert .NotEqual (t , time .Duration (0 ), n .reapTime )
695
+
696
+ // active nodes is 1 because the testing node is in the list
697
+ assert .Equal (t , 1 , len (dbs [0 ].nodes ))
698
+ assert .Equal (t , 0 , len (dbs [0 ].failedNodes ))
699
+ assert .Equal (t , 3 , len (dbs [0 ].leftNodes ))
700
+
701
+ closeNetworkDBInstances (dbs )
702
+ }
703
+
704
+ func TestNodeReincarnation (t * testing.T ) {
705
+ dbs := createNetworkDBInstances (t , 1 , "node" , DefaultConfig ())
706
+
707
+ dbs [0 ].nodes ["node1" ] = & node {Node : memberlist.Node {Name : "node1" , Addr : net .ParseIP ("192.168.1.1" )}}
708
+ dbs [0 ].leftNodes ["node2" ] = & node {Node : memberlist.Node {Name : "node2" , Addr : net .ParseIP ("192.168.1.2" )}}
709
+ dbs [0 ].failedNodes ["node3" ] = & node {Node : memberlist.Node {Name : "node3" , Addr : net .ParseIP ("192.168.1.3" )}}
710
+
711
+ // active nodes is 2 because the testing node is in the list
712
+ assert .Equal (t , 2 , len (dbs [0 ].nodes ))
713
+ assert .Equal (t , 1 , len (dbs [0 ].failedNodes ))
714
+ assert .Equal (t , 1 , len (dbs [0 ].leftNodes ))
715
+
716
+ b := dbs [0 ].purgeReincarnation (& memberlist.Node {Name : "node4" , Addr : net .ParseIP ("192.168.1.1" )})
717
+ assert .True (t , b )
718
+ dbs [0 ].nodes ["node4" ] = & node {Node : memberlist.Node {Name : "node4" , Addr : net .ParseIP ("192.168.1.1" )}}
719
+
720
+ b = dbs [0 ].purgeReincarnation (& memberlist.Node {Name : "node5" , Addr : net .ParseIP ("192.168.1.2" )})
721
+ assert .True (t , b )
722
+ dbs [0 ].nodes ["node5" ] = & node {Node : memberlist.Node {Name : "node5" , Addr : net .ParseIP ("192.168.1.1" )}}
723
+
724
+ b = dbs [0 ].purgeReincarnation (& memberlist.Node {Name : "node6" , Addr : net .ParseIP ("192.168.1.3" )})
725
+ assert .True (t , b )
726
+ dbs [0 ].nodes ["node6" ] = & node {Node : memberlist.Node {Name : "node6" , Addr : net .ParseIP ("192.168.1.1" )}}
727
+
728
+ b = dbs [0 ].purgeReincarnation (& memberlist.Node {Name : "node6" , Addr : net .ParseIP ("192.168.1.10" )})
729
+ assert .False (t , b )
730
+
731
+ // active nodes is 1 because the testing node is in the list
732
+ assert .Equal (t , 4 , len (dbs [0 ].nodes ))
733
+ assert .Equal (t , 0 , len (dbs [0 ].failedNodes ))
734
+ assert .Equal (t , 3 , len (dbs [0 ].leftNodes ))
735
+
736
+ closeNetworkDBInstances (dbs )
737
+ }
0 commit comments