github.com/gophercloud/gophercloud@v1.11.0/openstack/networking/v2/extensions/agents/testing/requests_test.go (about) 1 package testing 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 "time" 8 9 fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common" 10 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/agents" 11 "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers" 12 "github.com/gophercloud/gophercloud/pagination" 13 th "github.com/gophercloud/gophercloud/testhelper" 14 ) 15 16 func TestList(t *testing.T) { 17 th.SetupHTTP() 18 defer th.TeardownHTTP() 19 20 th.Mux.HandleFunc("/v2.0/agents", func(w http.ResponseWriter, r *http.Request) { 21 th.TestMethod(t, r, "GET") 22 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 23 24 w.Header().Add("Content-Type", "application/json") 25 w.WriteHeader(http.StatusOK) 26 27 fmt.Fprintf(w, AgentsListResult) 28 }) 29 30 count := 0 31 32 agents.List(fake.ServiceClient(), agents.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) { 33 count++ 34 actual, err := agents.ExtractAgents(page) 35 36 if err != nil { 37 t.Errorf("Failed to extract agents: %v", err) 38 return false, nil 39 } 40 41 expected := []agents.Agent{ 42 Agent1, 43 Agent2, 44 } 45 46 th.CheckDeepEquals(t, expected, actual) 47 48 return true, nil 49 }) 50 51 if count != 1 { 52 t.Errorf("Expected 1 page, got %d", count) 53 } 54 } 55 56 func TestGet(t *testing.T) { 57 th.SetupHTTP() 58 defer th.TeardownHTTP() 59 60 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) { 61 th.TestMethod(t, r, "GET") 62 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 63 64 w.Header().Add("Content-Type", "application/json") 65 w.WriteHeader(http.StatusOK) 66 67 fmt.Fprintf(w, AgentsGetResult) 68 }) 69 70 s, err := agents.Get(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract() 71 th.AssertNoErr(t, err) 72 73 th.AssertEquals(t, s.ID, "43583cf5-472e-4dc8-af5b-6aed4c94ee3a") 74 th.AssertEquals(t, s.Binary, "neutron-openvswitch-agent") 75 th.AssertEquals(t, s.AdminStateUp, true) 76 th.AssertEquals(t, s.Alive, true) 77 th.AssertEquals(t, s.Topic, "N/A") 78 th.AssertEquals(t, s.Host, "compute3") 79 th.AssertEquals(t, s.AgentType, "Open vSwitch agent") 80 th.AssertEquals(t, s.HeartbeatTimestamp, time.Date(2019, 1, 9, 11, 43, 01, 0, time.UTC)) 81 th.AssertEquals(t, s.StartedAt, time.Date(2018, 6, 26, 21, 46, 20, 0, time.UTC)) 82 th.AssertEquals(t, s.CreatedAt, time.Date(2017, 7, 26, 23, 2, 5, 0, time.UTC)) 83 th.AssertDeepEquals(t, s.Configurations, map[string]interface{}{ 84 "ovs_hybrid_plug": false, 85 "datapath_type": "system", 86 "vhostuser_socket_dir": "/var/run/openvswitch", 87 "log_agent_heartbeats": false, 88 "l2_population": true, 89 "enable_distributed_routing": false, 90 }) 91 } 92 93 func TestUpdate(t *testing.T) { 94 th.SetupHTTP() 95 defer th.TeardownHTTP() 96 97 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) { 98 th.TestMethod(t, r, "PUT") 99 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 100 th.TestHeader(t, r, "Content-Type", "application/json") 101 th.TestHeader(t, r, "Accept", "application/json") 102 th.TestJSONRequest(t, r, AgentUpdateRequest) 103 104 w.Header().Add("Content-Type", "application/json") 105 w.WriteHeader(http.StatusOK) 106 107 fmt.Fprintf(w, AgentsUpdateResult) 108 }) 109 110 iTrue := true 111 description := "My OVS agent for OpenStack" 112 updateOpts := &agents.UpdateOpts{ 113 Description: &description, 114 AdminStateUp: &iTrue, 115 } 116 s, err := agents.Update(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", updateOpts).Extract() 117 th.AssertNoErr(t, err) 118 119 th.AssertDeepEquals(t, *s, Agent) 120 } 121 122 func TestDelete(t *testing.T) { 123 th.SetupHTTP() 124 defer th.TeardownHTTP() 125 126 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) { 127 th.TestMethod(t, r, "DELETE") 128 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 129 th.TestHeader(t, r, "Accept", "application/json") 130 131 w.Header().Add("Content-Type", "application/json") 132 w.WriteHeader(http.StatusNoContent) 133 }) 134 135 err := agents.Delete(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").ExtractErr() 136 th.AssertNoErr(t, err) 137 } 138 139 func TestListDHCPNetworks(t *testing.T) { 140 th.SetupHTTP() 141 defer th.TeardownHTTP() 142 143 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks", func(w http.ResponseWriter, r *http.Request) { 144 th.TestMethod(t, r, "GET") 145 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 146 147 w.Header().Add("Content-Type", "application/json") 148 w.WriteHeader(http.StatusOK) 149 150 fmt.Fprintf(w, AgentDHCPNetworksListResult) 151 }) 152 153 s, err := agents.ListDHCPNetworks(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract() 154 th.AssertNoErr(t, err) 155 156 var nilSlice []string 157 th.AssertEquals(t, len(s), 1) 158 th.AssertEquals(t, s[0].ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 159 th.AssertEquals(t, s[0].AdminStateUp, true) 160 th.AssertEquals(t, s[0].ProjectID, "4fd44f30292945e481c7b8a0c8908869") 161 th.AssertEquals(t, s[0].Shared, false) 162 th.AssertEquals(t, s[0].Name, "net1") 163 th.AssertEquals(t, s[0].Status, "ACTIVE") 164 th.AssertDeepEquals(t, s[0].Tags, nilSlice) 165 th.AssertEquals(t, s[0].TenantID, "4fd44f30292945e481c7b8a0c8908869") 166 th.AssertDeepEquals(t, s[0].AvailabilityZoneHints, []string{}) 167 th.AssertDeepEquals(t, s[0].Subnets, []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"}) 168 169 } 170 171 func TestScheduleDHCPNetwork(t *testing.T) { 172 th.SetupHTTP() 173 defer th.TeardownHTTP() 174 175 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks", func(w http.ResponseWriter, r *http.Request) { 176 th.TestMethod(t, r, "POST") 177 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 178 th.TestHeader(t, r, "Content-Type", "application/json") 179 th.TestHeader(t, r, "Accept", "application/json") 180 th.TestJSONRequest(t, r, ScheduleDHCPNetworkRequest) 181 182 w.Header().Add("Content-Type", "application/json") 183 w.WriteHeader(http.StatusCreated) 184 }) 185 186 opts := &agents.ScheduleDHCPNetworkOpts{ 187 NetworkID: "1ae075ca-708b-4e66-b4a7-b7698632f05f", 188 } 189 err := agents.ScheduleDHCPNetwork(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", opts).ExtractErr() 190 th.AssertNoErr(t, err) 191 } 192 193 func TestRemoveDHCPNetwork(t *testing.T) { 194 th.SetupHTTP() 195 defer th.TeardownHTTP() 196 197 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks/1ae075ca-708b-4e66-b4a7-b7698632f05f", func(w http.ResponseWriter, r *http.Request) { 198 th.TestMethod(t, r, "DELETE") 199 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 200 th.TestHeader(t, r, "Accept", "application/json") 201 202 w.Header().Add("Content-Type", "application/json") 203 w.WriteHeader(http.StatusNoContent) 204 }) 205 206 err := agents.RemoveDHCPNetwork(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", "1ae075ca-708b-4e66-b4a7-b7698632f05f").ExtractErr() 207 th.AssertNoErr(t, err) 208 } 209 210 func TestListBGPSpeakers(t *testing.T) { 211 th.SetupHTTP() 212 defer th.TeardownHTTP() 213 214 agentID := "30d76012-46de-4215-aaa1-a1630d01d891" 215 216 th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances", 217 func(w http.ResponseWriter, r *http.Request) { 218 th.TestMethod(t, r, "GET") 219 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 220 221 w.Header().Add("Content-Type", "application/json") 222 w.WriteHeader(http.StatusOK) 223 224 fmt.Fprintf(w, ListBGPSpeakersResult) 225 }) 226 227 count := 0 228 agents.ListBGPSpeakers(fake.ServiceClient(), agentID).EachPage( 229 func(page pagination.Page) (bool, error) { 230 count++ 231 actual, err := agents.ExtractBGPSpeakers(page) 232 233 th.AssertNoErr(t, err) 234 th.AssertEquals(t, len(actual), 1) 235 th.AssertEquals(t, actual[0].ID, "cab00464-284d-4251-9798-2b27db7b1668") 236 th.AssertEquals(t, actual[0].Name, "gophercloud-testing-speaker") 237 th.AssertEquals(t, actual[0].LocalAS, 12345) 238 th.AssertEquals(t, actual[0].IPVersion, 4) 239 return true, nil 240 }) 241 if count != 1 { 242 t.Errorf("Expected 1 page, got %d", count) 243 } 244 } 245 246 func TestScheduleBGPSpeaker(t *testing.T) { 247 th.SetupHTTP() 248 defer th.TeardownHTTP() 249 250 agentID := "30d76012-46de-4215-aaa1-a1630d01d891" 251 speakerID := "8edb2c68-0654-49a9-b3fe-030f92e3ddf6" 252 253 th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances", 254 func(w http.ResponseWriter, r *http.Request) { 255 th.TestMethod(t, r, "POST") 256 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 257 th.TestHeader(t, r, "Content-Type", "application/json") 258 th.TestHeader(t, r, "Accept", "application/json") 259 th.TestJSONRequest(t, r, ScheduleBGPSpeakerRequest) 260 261 w.Header().Add("Content-Type", "application/json") 262 w.WriteHeader(http.StatusCreated) 263 }) 264 265 var opts agents.ScheduleBGPSpeakerOpts 266 opts.SpeakerID = speakerID 267 err := agents.ScheduleBGPSpeaker(fake.ServiceClient(), agentID, opts).ExtractErr() 268 th.AssertNoErr(t, err) 269 } 270 271 func TestRemoveBGPSpeaker(t *testing.T) { 272 th.SetupHTTP() 273 defer th.TeardownHTTP() 274 275 agentID := "30d76012-46de-4215-aaa1-a1630d01d891" 276 speakerID := "8edb2c68-0654-49a9-b3fe-030f92e3ddf6" 277 278 th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances/"+speakerID, 279 func(w http.ResponseWriter, r *http.Request) { 280 th.TestMethod(t, r, "DELETE") 281 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 282 th.TestHeader(t, r, "Accept", "application/json") 283 284 w.Header().Add("Content-Type", "application/json") 285 w.WriteHeader(http.StatusNoContent) 286 }) 287 288 err := agents.RemoveBGPSpeaker(fake.ServiceClient(), agentID, speakerID).ExtractErr() 289 th.AssertNoErr(t, err) 290 } 291 292 func TestListDRAgentHostingBGPSpeakers(t *testing.T) { 293 th.SetupHTTP() 294 defer th.TeardownHTTP() 295 296 speakerID := "3f511b1b-d541-45f1-aa98-2e44e8183d4c" 297 th.Mux.HandleFunc("/v2.0/bgp-speakers/"+speakerID+"/bgp-dragents", 298 func(w http.ResponseWriter, r *http.Request) { 299 th.TestMethod(t, r, "GET") 300 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 301 302 w.Header().Add("Content-Type", "application/json") 303 w.WriteHeader(http.StatusOK) 304 fmt.Fprintf(w, ListDRAgentHostingBGPSpeakersResult) 305 }) 306 307 count := 0 308 agents.ListDRAgentHostingBGPSpeakers(fake.ServiceClient(), speakerID).EachPage( 309 func(page pagination.Page) (bool, error) { 310 count++ 311 actual, err := agents.ExtractAgents(page) 312 313 if err != nil { 314 t.Errorf("Failed to extract agents: %v", err) 315 return false, nil 316 } 317 318 expected := []agents.Agent{BGPAgent1, BGPAgent2} 319 th.CheckDeepEquals(t, expected, actual) 320 return true, nil 321 }) 322 323 if count != 1 { 324 t.Errorf("Expected 1 page, got %d", count) 325 } 326 } 327 328 func TestListL3Routers(t *testing.T) { 329 th.SetupHTTP() 330 defer th.TeardownHTTP() 331 332 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers", func(w http.ResponseWriter, r *http.Request) { 333 th.TestMethod(t, r, "GET") 334 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 335 336 w.Header().Add("Content-Type", "application/json") 337 w.WriteHeader(http.StatusOK) 338 339 fmt.Fprintf(w, AgentL3RoutersListResult) 340 }) 341 342 s, err := agents.ListL3Routers(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract() 343 th.AssertNoErr(t, err) 344 345 routes := []routers.Route{ 346 { 347 NextHop: "172.24.3.99", 348 DestinationCIDR: "179.24.1.0/24", 349 }, 350 } 351 352 var snat bool = true 353 gw := routers.GatewayInfo{ 354 EnableSNAT: &snat, 355 NetworkID: "ae34051f-aa6c-4c75-abf5-50dc9ac99ef3", 356 ExternalFixedIPs: []routers.ExternalFixedIP{ 357 { 358 IPAddress: "172.24.4.3", 359 SubnetID: "b930d7f6-ceb7-40a0-8b81-a425dd994ccf", 360 }, 361 362 { 363 IPAddress: "2001:db8::c", 364 SubnetID: "0c56df5d-ace5-46c8-8f4c-45fa4e334d18", 365 }, 366 }, 367 } 368 369 var nilSlice []string 370 th.AssertEquals(t, len(s), 2) 371 th.AssertEquals(t, s[0].ID, "915a14a6-867b-4af7-83d1-70efceb146f9") 372 th.AssertEquals(t, s[0].AdminStateUp, true) 373 th.AssertEquals(t, s[0].ProjectID, "0bd18306d801447bb457a46252d82d13") 374 th.AssertEquals(t, s[0].Name, "router2") 375 th.AssertEquals(t, s[0].Status, "ACTIVE") 376 th.AssertEquals(t, s[0].TenantID, "0bd18306d801447bb457a46252d82d13") 377 th.AssertDeepEquals(t, s[0].AvailabilityZoneHints, []string{}) 378 th.AssertDeepEquals(t, s[0].Routes, routes) 379 th.AssertDeepEquals(t, s[0].GatewayInfo, gw) 380 th.AssertDeepEquals(t, s[0].Tags, nilSlice) 381 th.AssertEquals(t, s[1].ID, "f8a44de0-fc8e-45df-93c7-f79bf3b01c95") 382 th.AssertEquals(t, s[1].Name, "router1") 383 384 } 385 386 func TestScheduleL3Router(t *testing.T) { 387 th.SetupHTTP() 388 defer th.TeardownHTTP() 389 390 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers", func(w http.ResponseWriter, r *http.Request) { 391 th.TestMethod(t, r, "POST") 392 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 393 th.TestHeader(t, r, "Content-Type", "application/json") 394 th.TestHeader(t, r, "Accept", "application/json") 395 th.TestJSONRequest(t, r, ScheduleL3RouterRequest) 396 397 w.Header().Add("Content-Type", "application/json") 398 w.WriteHeader(http.StatusCreated) 399 }) 400 401 opts := &agents.ScheduleL3RouterOpts{ 402 RouterID: "43e66290-79a4-415d-9eb9-7ff7919839e1", 403 } 404 err := agents.ScheduleL3Router(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", opts).ExtractErr() 405 th.AssertNoErr(t, err) 406 } 407 408 func TestRemoveL3Router(t *testing.T) { 409 th.SetupHTTP() 410 defer th.TeardownHTTP() 411 412 th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers/43e66290-79a4-415d-9eb9-7ff7919839e1", func(w http.ResponseWriter, r *http.Request) { 413 th.TestMethod(t, r, "DELETE") 414 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 415 th.TestHeader(t, r, "Accept", "application/json") 416 417 w.Header().Add("Content-Type", "application/json") 418 w.WriteHeader(http.StatusNoContent) 419 }) 420 421 err := agents.RemoveL3Router(fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", "43e66290-79a4-415d-9eb9-7ff7919839e1").ExtractErr() 422 th.AssertNoErr(t, err) 423 }