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