github.com/ryanslade/nomad@v0.2.4-0.20160128061903-fc95782f2089/api/nodes_test.go (about) 1 package api 2 3 import ( 4 "fmt" 5 "reflect" 6 "sort" 7 "strings" 8 "testing" 9 10 "github.com/hashicorp/nomad/testutil" 11 ) 12 13 func TestNodes_List(t *testing.T) { 14 c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { 15 c.DevMode = true 16 }) 17 defer s.Stop() 18 nodes := c.Nodes() 19 20 var qm *QueryMeta 21 var out []*NodeListStub 22 var err error 23 24 testutil.WaitForResult(func() (bool, error) { 25 out, qm, err = nodes.List(nil) 26 if err != nil { 27 return false, err 28 } 29 if n := len(out); n != 1 { 30 return false, fmt.Errorf("expected 1 node, got: %d", n) 31 } 32 return true, nil 33 }, func(err error) { 34 t.Fatalf("err: %s", err) 35 }) 36 37 // Check that we got valid QueryMeta. 38 assertQueryMeta(t, qm) 39 } 40 41 func TestNodes_PrefixList(t *testing.T) { 42 c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { 43 c.DevMode = true 44 }) 45 defer s.Stop() 46 nodes := c.Nodes() 47 48 var qm *QueryMeta 49 var out []*NodeListStub 50 var err error 51 52 // Get the node ID 53 var nodeID, dc string 54 testutil.WaitForResult(func() (bool, error) { 55 out, _, err := nodes.List(nil) 56 if err != nil { 57 return false, err 58 } 59 if n := len(out); n != 1 { 60 return false, fmt.Errorf("expected 1 node, got: %d", n) 61 } 62 nodeID = out[0].ID 63 dc = out[0].Datacenter 64 return true, nil 65 }, func(err error) { 66 t.Fatalf("err: %s", err) 67 }) 68 69 // Find node based on four character prefix 70 out, qm, err = nodes.PrefixList(nodeID[:4]) 71 if err != nil { 72 t.Fatalf("err: %s", err) 73 } 74 if n := len(out); n != 1 { 75 t.Fatalf("expected 1 node, got: %d ", n) 76 } 77 78 // Check that we got valid QueryMeta. 79 assertQueryMeta(t, qm) 80 } 81 82 func TestNodes_Info(t *testing.T) { 83 c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { 84 c.DevMode = true 85 }) 86 defer s.Stop() 87 nodes := c.Nodes() 88 89 // Retrieving a non-existent node returns error 90 _, _, err := nodes.Info("12345678-abcd-efab-cdef-123456789abc", nil) 91 if err == nil || !strings.Contains(err.Error(), "not found") { 92 t.Fatalf("expected not found error, got: %#v", err) 93 } 94 95 // Get the node ID 96 var nodeID, dc string 97 testutil.WaitForResult(func() (bool, error) { 98 out, _, err := nodes.List(nil) 99 if err != nil { 100 return false, err 101 } 102 if n := len(out); n != 1 { 103 return false, fmt.Errorf("expected 1 node, got: %d", n) 104 } 105 nodeID = out[0].ID 106 dc = out[0].Datacenter 107 return true, nil 108 }, func(err error) { 109 t.Fatalf("err: %s", err) 110 }) 111 112 // Querying for existing nodes returns properly 113 result, qm, err := nodes.Info(nodeID, nil) 114 if err != nil { 115 t.Fatalf("err: %s", err) 116 } 117 assertQueryMeta(t, qm) 118 119 // Check that the result is what we expect 120 if result.ID != nodeID || result.Datacenter != dc { 121 t.Fatalf("expected %s (%s), got: %s (%s)", 122 nodeID, dc, 123 result.ID, result.Datacenter) 124 } 125 } 126 127 func TestNodes_ToggleDrain(t *testing.T) { 128 c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { 129 c.DevMode = true 130 }) 131 defer s.Stop() 132 nodes := c.Nodes() 133 134 // Wait for node registration and get the ID 135 var nodeID string 136 testutil.WaitForResult(func() (bool, error) { 137 out, _, err := nodes.List(nil) 138 if err != nil { 139 return false, err 140 } 141 if n := len(out); n != 1 { 142 return false, fmt.Errorf("expected 1 node, got: %d", n) 143 } 144 nodeID = out[0].ID 145 return true, nil 146 }, func(err error) { 147 t.Fatalf("err: %s", err) 148 }) 149 150 // Check for drain mode 151 out, _, err := nodes.Info(nodeID, nil) 152 if err != nil { 153 t.Fatalf("err: %s", err) 154 } 155 if out.Drain { 156 t.Fatalf("drain mode should be off") 157 } 158 159 // Toggle it on 160 wm, err := nodes.ToggleDrain(nodeID, true, nil) 161 if err != nil { 162 t.Fatalf("err: %s", err) 163 } 164 assertWriteMeta(t, wm) 165 166 // Check again 167 out, _, err = nodes.Info(nodeID, nil) 168 if err != nil { 169 t.Fatalf("err: %s", err) 170 } 171 if !out.Drain { 172 t.Fatalf("drain mode should be on") 173 } 174 175 // Toggle off again 176 wm, err = nodes.ToggleDrain(nodeID, false, nil) 177 if err != nil { 178 t.Fatalf("err: %s", err) 179 } 180 assertWriteMeta(t, wm) 181 182 // Check again 183 out, _, err = nodes.Info(nodeID, nil) 184 if err != nil { 185 t.Fatalf("err: %s", err) 186 } 187 if out.Drain { 188 t.Fatalf("drain mode should be off") 189 } 190 } 191 192 func TestNodes_Allocations(t *testing.T) { 193 c, s := makeClient(t, nil, nil) 194 defer s.Stop() 195 nodes := c.Nodes() 196 197 // Looking up by a non-existent node returns nothing. We 198 // don't check the index here because it's possible the node 199 // has already registered, in which case we will get a non- 200 // zero result anyways. 201 allocs, _, err := nodes.Allocations("nope", nil) 202 if err != nil { 203 t.Fatalf("err: %s", err) 204 } 205 if n := len(allocs); n != 0 { 206 t.Fatalf("expected 0 allocs, got: %d", n) 207 } 208 } 209 210 func TestNodes_ForceEvaluate(t *testing.T) { 211 c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { 212 c.DevMode = true 213 }) 214 defer s.Stop() 215 nodes := c.Nodes() 216 217 // Force-eval on a non-existent node fails 218 _, _, err := nodes.ForceEvaluate("12345678-abcd-efab-cdef-123456789abc", nil) 219 if err == nil || !strings.Contains(err.Error(), "not found") { 220 t.Fatalf("expected not found error, got: %#v", err) 221 } 222 223 // Wait for node registration and get the ID 224 var nodeID string 225 testutil.WaitForResult(func() (bool, error) { 226 out, _, err := nodes.List(nil) 227 if err != nil { 228 return false, err 229 } 230 if n := len(out); n != 1 { 231 return false, fmt.Errorf("expected 1 node, got: %d", n) 232 } 233 nodeID = out[0].ID 234 return true, nil 235 }, func(err error) { 236 t.Fatalf("err: %s", err) 237 }) 238 239 // Try force-eval again. We don't check the WriteMeta because 240 // there are no allocations to process, so we would get an index 241 // of zero. Same goes for the eval ID. 242 _, _, err = nodes.ForceEvaluate(nodeID, nil) 243 if err != nil { 244 t.Fatalf("err: %s", err) 245 } 246 } 247 248 func TestNodes_Sort(t *testing.T) { 249 nodes := []*NodeListStub{ 250 &NodeListStub{CreateIndex: 2}, 251 &NodeListStub{CreateIndex: 1}, 252 &NodeListStub{CreateIndex: 5}, 253 } 254 sort.Sort(NodeIndexSort(nodes)) 255 256 expect := []*NodeListStub{ 257 &NodeListStub{CreateIndex: 5}, 258 &NodeListStub{CreateIndex: 2}, 259 &NodeListStub{CreateIndex: 1}, 260 } 261 if !reflect.DeepEqual(nodes, expect) { 262 t.Fatalf("\n\n%#v\n\n%#v", nodes, expect) 263 } 264 }