github.com/hooklift/nomad@v0.5.7-0.20170407200202-db11e7dd7b55/command/agent/agent_endpoint_test.go (about) 1 package agent 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "strings" 10 "testing" 11 12 "github.com/hashicorp/nomad/nomad/structs" 13 ) 14 15 func TestHTTP_AgentSelf(t *testing.T) { 16 httpTest(t, nil, func(s *TestServer) { 17 // Make the HTTP request 18 req, err := http.NewRequest("GET", "/v1/agent/self", nil) 19 if err != nil { 20 t.Fatalf("err: %v", err) 21 } 22 respW := httptest.NewRecorder() 23 24 // Make the request 25 obj, err := s.Server.AgentSelfRequest(respW, req) 26 if err != nil { 27 t.Fatalf("err: %v", err) 28 } 29 30 // Check the job 31 self := obj.(agentSelf) 32 if self.Config == nil { 33 t.Fatalf("bad: %#v", self) 34 } 35 if len(self.Stats) == 0 { 36 t.Fatalf("bad: %#v", self) 37 } 38 }) 39 } 40 41 func TestHTTP_AgentJoin(t *testing.T) { 42 httpTest(t, nil, func(s *TestServer) { 43 // Determine the join address 44 member := s.Agent.Server().LocalMember() 45 addr := fmt.Sprintf("%s:%d", member.Addr, member.Port) 46 47 // Make the HTTP request 48 req, err := http.NewRequest("PUT", 49 fmt.Sprintf("/v1/agent/join?address=%s&address=%s", addr, addr), nil) 50 if err != nil { 51 t.Fatalf("err: %v", err) 52 } 53 respW := httptest.NewRecorder() 54 55 // Make the request 56 obj, err := s.Server.AgentJoinRequest(respW, req) 57 if err != nil { 58 t.Fatalf("err: %v", err) 59 } 60 61 // Check the job 62 join := obj.(joinResult) 63 if join.NumJoined != 2 { 64 t.Fatalf("bad: %#v", join) 65 } 66 if join.Error != "" { 67 t.Fatalf("bad: %#v", join) 68 } 69 }) 70 } 71 72 func TestHTTP_AgentMembers(t *testing.T) { 73 httpTest(t, nil, func(s *TestServer) { 74 // Make the HTTP request 75 req, err := http.NewRequest("GET", "/v1/agent/members", nil) 76 if err != nil { 77 t.Fatalf("err: %v", err) 78 } 79 respW := httptest.NewRecorder() 80 81 // Make the request 82 obj, err := s.Server.AgentMembersRequest(respW, req) 83 if err != nil { 84 t.Fatalf("err: %v", err) 85 } 86 87 // Check the job 88 members := obj.(structs.ServerMembersResponse) 89 if len(members.Members) != 1 { 90 t.Fatalf("bad: %#v", members.Members) 91 } 92 }) 93 } 94 95 func TestHTTP_AgentForceLeave(t *testing.T) { 96 httpTest(t, nil, func(s *TestServer) { 97 // Make the HTTP request 98 req, err := http.NewRequest("PUT", "/v1/agent/force-leave?node=foo", nil) 99 if err != nil { 100 t.Fatalf("err: %v", err) 101 } 102 respW := httptest.NewRecorder() 103 104 // Make the request 105 _, err = s.Server.AgentForceLeaveRequest(respW, req) 106 if err != nil { 107 t.Fatalf("err: %v", err) 108 } 109 }) 110 } 111 112 func TestHTTP_AgentSetServers(t *testing.T) { 113 httpTest(t, nil, func(s *TestServer) { 114 // Establish a baseline number of servers 115 req, err := http.NewRequest("GET", "/v1/agent/servers", nil) 116 if err != nil { 117 t.Fatalf("err: %s", err) 118 } 119 respW := httptest.NewRecorder() 120 121 // Create the request 122 req, err = http.NewRequest("PUT", "/v1/agent/servers", nil) 123 if err != nil { 124 t.Fatalf("err: %s", err) 125 } 126 127 // Send the request 128 respW = httptest.NewRecorder() 129 _, err = s.Server.AgentServersRequest(respW, req) 130 if err == nil || !strings.Contains(err.Error(), "missing server address") { 131 t.Fatalf("expected missing servers error, got: %#v", err) 132 } 133 134 // Create a valid request 135 req, err = http.NewRequest("PUT", "/v1/agent/servers?address=127.0.0.1%3A4647&address=127.0.0.2%3A4647&address=127.0.0.3%3A4647", nil) 136 if err != nil { 137 t.Fatalf("err: %s", err) 138 } 139 140 // Send the request 141 respW = httptest.NewRecorder() 142 _, err = s.Server.AgentServersRequest(respW, req) 143 if err != nil { 144 t.Fatalf("err: %s", err) 145 } 146 147 // Retrieve the servers again 148 req, err = http.NewRequest("GET", "/v1/agent/servers", nil) 149 if err != nil { 150 t.Fatalf("err: %s", err) 151 } 152 respW = httptest.NewRecorder() 153 154 // Make the request and check the result 155 expected := map[string]bool{ 156 "127.0.0.1:4647": true, 157 "127.0.0.2:4647": true, 158 "127.0.0.3:4647": true, 159 } 160 out, err := s.Server.AgentServersRequest(respW, req) 161 if err != nil { 162 t.Fatalf("err: %s", err) 163 } 164 servers := out.([]string) 165 if n := len(servers); n != len(expected) { 166 t.Fatalf("expected %d servers, got: %d: %v", len(expected), n, servers) 167 } 168 received := make(map[string]bool, len(servers)) 169 for _, server := range servers { 170 received[server] = true 171 } 172 foundCount := 0 173 for k, _ := range received { 174 _, found := expected[k] 175 if found { 176 foundCount++ 177 } 178 } 179 if foundCount != len(expected) { 180 t.Fatalf("bad servers result") 181 } 182 }) 183 } 184 185 func TestHTTP_AgentListKeys(t *testing.T) { 186 key1 := "HS5lJ+XuTlYKWaeGYyG+/A==" 187 188 httpTest(t, func(c *Config) { 189 c.Server.EncryptKey = key1 190 }, func(s *TestServer) { 191 req, err := http.NewRequest("GET", "/v1/agent/keyring/list", nil) 192 if err != nil { 193 t.Fatalf("err: %s", err) 194 } 195 respW := httptest.NewRecorder() 196 197 out, err := s.Server.KeyringOperationRequest(respW, req) 198 if err != nil { 199 t.Fatalf("err: %s", err) 200 } 201 kresp := out.(structs.KeyringResponse) 202 if len(kresp.Keys) != 1 { 203 t.Fatalf("bad: %v", kresp) 204 } 205 }) 206 } 207 208 func TestHTTP_AgentInstallKey(t *testing.T) { 209 key1 := "HS5lJ+XuTlYKWaeGYyG+/A==" 210 key2 := "wH1Bn9hlJ0emgWB1JttVRA==" 211 212 httpTest(t, func(c *Config) { 213 c.Server.EncryptKey = key1 214 }, func(s *TestServer) { 215 b, err := json.Marshal(&structs.KeyringRequest{Key: key2}) 216 if err != nil { 217 t.Fatalf("err: %v", err) 218 } 219 req, err := http.NewRequest("GET", "/v1/agent/keyring/install", bytes.NewReader(b)) 220 if err != nil { 221 t.Fatalf("err: %s", err) 222 } 223 respW := httptest.NewRecorder() 224 225 _, err = s.Server.KeyringOperationRequest(respW, req) 226 if err != nil { 227 t.Fatalf("err: %s", err) 228 } 229 req, err = http.NewRequest("GET", "/v1/agent/keyring/list", bytes.NewReader(b)) 230 if err != nil { 231 t.Fatalf("err: %s", err) 232 } 233 respW = httptest.NewRecorder() 234 235 out, err := s.Server.KeyringOperationRequest(respW, req) 236 if err != nil { 237 t.Fatalf("err: %s", err) 238 } 239 kresp := out.(structs.KeyringResponse) 240 if len(kresp.Keys) != 2 { 241 t.Fatalf("bad: %v", kresp) 242 } 243 }) 244 } 245 246 func TestHTTP_AgentRemoveKey(t *testing.T) { 247 key1 := "HS5lJ+XuTlYKWaeGYyG+/A==" 248 key2 := "wH1Bn9hlJ0emgWB1JttVRA==" 249 250 httpTest(t, func(c *Config) { 251 c.Server.EncryptKey = key1 252 }, func(s *TestServer) { 253 b, err := json.Marshal(&structs.KeyringRequest{Key: key2}) 254 if err != nil { 255 t.Fatalf("err: %v", err) 256 } 257 258 req, err := http.NewRequest("GET", "/v1/agent/keyring/install", bytes.NewReader(b)) 259 if err != nil { 260 t.Fatalf("err: %s", err) 261 } 262 respW := httptest.NewRecorder() 263 _, err = s.Server.KeyringOperationRequest(respW, req) 264 if err != nil { 265 t.Fatalf("err: %s", err) 266 } 267 268 req, err = http.NewRequest("GET", "/v1/agent/keyring/remove", bytes.NewReader(b)) 269 if err != nil { 270 t.Fatalf("err: %s", err) 271 } 272 respW = httptest.NewRecorder() 273 if _, err = s.Server.KeyringOperationRequest(respW, req); err != nil { 274 t.Fatalf("err: %s", err) 275 } 276 277 req, err = http.NewRequest("GET", "/v1/agent/keyring/list", nil) 278 if err != nil { 279 t.Fatalf("err: %s", err) 280 } 281 respW = httptest.NewRecorder() 282 out, err := s.Server.KeyringOperationRequest(respW, req) 283 if err != nil { 284 t.Fatalf("err: %s", err) 285 } 286 kresp := out.(structs.KeyringResponse) 287 if len(kresp.Keys) != 1 { 288 t.Fatalf("bad: %v", kresp) 289 } 290 }) 291 }