github.com/blixtra/nomad@v0.7.2-0.20171221000451-da9a1d7bb050/api/agent_test.go (about) 1 package api 2 3 import ( 4 "reflect" 5 "sort" 6 "testing" 7 8 "github.com/hashicorp/nomad/testutil" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestAgent_Self(t *testing.T) { 13 t.Parallel() 14 c, s := makeClient(t, nil, nil) 15 defer s.Stop() 16 17 // Get a handle on the Agent endpoints 18 a := c.Agent() 19 20 // Query the endpoint 21 res, err := a.Self() 22 if err != nil { 23 t.Fatalf("err: %s", err) 24 } 25 26 // Check that we got a valid response 27 if res.Member.Name == "" { 28 t.Fatalf("bad member name in response: %#v", res) 29 } 30 31 // Local cache was populated 32 if a.nodeName == "" || a.datacenter == "" || a.region == "" { 33 t.Fatalf("cache should be populated, got: %#v", a) 34 } 35 } 36 37 func TestAgent_NodeName(t *testing.T) { 38 t.Parallel() 39 c, s := makeClient(t, nil, nil) 40 defer s.Stop() 41 a := c.Agent() 42 43 // Query the agent for the node name 44 res, err := a.NodeName() 45 if err != nil { 46 t.Fatalf("err: %s", err) 47 } 48 if res == "" { 49 t.Fatalf("expected node name, got nothing") 50 } 51 } 52 53 func TestAgent_Datacenter(t *testing.T) { 54 t.Parallel() 55 c, s := makeClient(t, nil, nil) 56 defer s.Stop() 57 a := c.Agent() 58 59 // Query the agent for the datacenter 60 dc, err := a.Datacenter() 61 if err != nil { 62 t.Fatalf("err: %s", err) 63 } 64 if dc != "dc1" { 65 t.Fatalf("expected dc1, got: %q", dc) 66 } 67 } 68 69 func TestAgent_Join(t *testing.T) { 70 t.Parallel() 71 c1, s1 := makeClient(t, nil, nil) 72 defer s1.Stop() 73 a1 := c1.Agent() 74 75 _, s2 := makeClient(t, nil, func(c *testutil.TestServerConfig) { 76 c.Server.BootstrapExpect = 0 77 }) 78 defer s2.Stop() 79 80 // Attempting to join a non-existent host returns error 81 n, err := a1.Join("nope") 82 if err == nil { 83 t.Fatalf("expected error, got nothing") 84 } 85 if n != 0 { 86 t.Fatalf("expected 0 nodes, got: %d", n) 87 } 88 89 // Returns correctly if join succeeds 90 n, err = a1.Join(s2.SerfAddr) 91 if err != nil { 92 t.Fatalf("err: %s", err) 93 } 94 if n != 1 { 95 t.Fatalf("expected 1 node, got: %d", n) 96 } 97 } 98 99 func TestAgent_Members(t *testing.T) { 100 t.Parallel() 101 c, s := makeClient(t, nil, nil) 102 defer s.Stop() 103 a := c.Agent() 104 105 // Query nomad for all the known members 106 mem, err := a.Members() 107 if err != nil { 108 t.Fatalf("err: %s", err) 109 } 110 111 // Check that we got the expected result 112 if n := len(mem.Members); n != 1 { 113 t.Fatalf("expected 1 member, got: %d", n) 114 } 115 if m := mem.Members[0]; m.Name == "" || m.Addr == "" || m.Port == 0 { 116 t.Fatalf("bad member: %#v", m) 117 } 118 } 119 120 func TestAgent_ForceLeave(t *testing.T) { 121 t.Parallel() 122 c, s := makeClient(t, nil, nil) 123 defer s.Stop() 124 a := c.Agent() 125 126 // Force-leave on a non-existent node does not error 127 if err := a.ForceLeave("nope"); err != nil { 128 t.Fatalf("err: %s", err) 129 } 130 131 // TODO: test force-leave on an existing node 132 } 133 134 func (a *AgentMember) String() string { 135 return "{Name: " + a.Name + " Region: " + a.Tags["region"] + " DC: " + a.Tags["dc"] + "}" 136 } 137 138 func TestAgents_Sort(t *testing.T) { 139 t.Parallel() 140 var sortTests = []struct { 141 in []*AgentMember 142 out []*AgentMember 143 }{ 144 { 145 []*AgentMember{ 146 {Name: "nomad-2.vac.us-east", 147 Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}}, 148 {Name: "nomad-1.global", 149 Tags: map[string]string{"region": "global", "dc": "dc1"}}, 150 {Name: "nomad-1.vac.us-east", 151 Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}}, 152 }, 153 []*AgentMember{ 154 {Name: "nomad-1.global", 155 Tags: map[string]string{"region": "global", "dc": "dc1"}}, 156 {Name: "nomad-1.vac.us-east", 157 Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}}, 158 {Name: "nomad-2.vac.us-east", 159 Tags: map[string]string{"region": "us-east", "dc": "us-east-1c"}}, 160 }, 161 }, 162 { 163 []*AgentMember{ 164 {Name: "nomad-02.tam.us-east", 165 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 166 {Name: "nomad-02.pal.us-west", 167 Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}}, 168 {Name: "nomad-01.pal.us-west", 169 Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}}, 170 {Name: "nomad-01.tam.us-east", 171 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 172 }, 173 []*AgentMember{ 174 {Name: "nomad-01.tam.us-east", 175 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 176 {Name: "nomad-02.tam.us-east", 177 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 178 {Name: "nomad-01.pal.us-west", 179 Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}}, 180 {Name: "nomad-02.pal.us-west", 181 Tags: map[string]string{"region": "us-west", "dc": "palo_alto"}}, 182 }, 183 }, 184 { 185 []*AgentMember{ 186 {Name: "nomad-02.tam.us-east", 187 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 188 {Name: "nomad-02.ams.europe", 189 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 190 {Name: "nomad-01.tam.us-east", 191 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 192 {Name: "nomad-01.ams.europe", 193 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 194 }, 195 []*AgentMember{ 196 {Name: "nomad-01.ams.europe", 197 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 198 {Name: "nomad-02.ams.europe", 199 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 200 {Name: "nomad-01.tam.us-east", 201 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 202 {Name: "nomad-02.tam.us-east", 203 Tags: map[string]string{"region": "us-east", "dc": "tampa"}}, 204 }, 205 }, 206 { 207 []*AgentMember{ 208 {Name: "nomad-02.ber.europe", 209 Tags: map[string]string{"region": "europe", "dc": "berlin"}}, 210 {Name: "nomad-02.ams.europe", 211 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 212 {Name: "nomad-01.ams.europe", 213 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 214 {Name: "nomad-01.ber.europe", 215 Tags: map[string]string{"region": "europe", "dc": "berlin"}}, 216 }, 217 []*AgentMember{ 218 {Name: "nomad-01.ams.europe", 219 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 220 {Name: "nomad-02.ams.europe", 221 Tags: map[string]string{"region": "europe", "dc": "amsterdam"}}, 222 {Name: "nomad-01.ber.europe", 223 Tags: map[string]string{"region": "europe", "dc": "berlin"}}, 224 {Name: "nomad-02.ber.europe", 225 Tags: map[string]string{"region": "europe", "dc": "berlin"}}, 226 }, 227 }, 228 { 229 []*AgentMember{ 230 {Name: "nomad-1.global"}, 231 {Name: "nomad-3.global"}, 232 {Name: "nomad-2.global"}, 233 }, 234 []*AgentMember{ 235 {Name: "nomad-1.global"}, 236 {Name: "nomad-2.global"}, 237 {Name: "nomad-3.global"}, 238 }, 239 }, 240 } 241 for _, tt := range sortTests { 242 sort.Sort(AgentMembersNameSort(tt.in)) 243 if !reflect.DeepEqual(tt.in, tt.out) { 244 t.Errorf("\necpected: %s\nget : %s", tt.in, tt.out) 245 } 246 } 247 } 248 249 func TestAgent_Health(t *testing.T) { 250 t.Parallel() 251 assert := assert.New(t) 252 c, s := makeClient(t, nil, nil) 253 defer s.Stop() 254 a := c.Agent() 255 256 health, err := a.Health() 257 assert.Nil(err) 258 assert.True(health.Server.Ok) 259 }