github.com/gophercloud/gophercloud@v1.14.1/openstack/networking/v2/subnets/testing/requests_test.go (about) 1 package testing 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 8 fake "github.com/gophercloud/gophercloud/openstack/networking/v2/common" 9 "github.com/gophercloud/gophercloud/openstack/networking/v2/subnets" 10 "github.com/gophercloud/gophercloud/pagination" 11 th "github.com/gophercloud/gophercloud/testhelper" 12 ) 13 14 func TestList(t *testing.T) { 15 th.SetupHTTP() 16 defer th.TeardownHTTP() 17 18 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 19 th.TestMethod(t, r, "GET") 20 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 21 22 w.Header().Add("Content-Type", "application/json") 23 w.WriteHeader(http.StatusOK) 24 25 fmt.Fprintf(w, SubnetListResult) 26 }) 27 28 count := 0 29 30 subnets.List(fake.ServiceClient(), subnets.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) { 31 count++ 32 actual, err := subnets.ExtractSubnets(page) 33 if err != nil { 34 t.Errorf("Failed to extract subnets: %v", err) 35 return false, nil 36 } 37 38 expected := []subnets.Subnet{ 39 Subnet1, 40 Subnet2, 41 Subnet3, 42 Subnet4, 43 } 44 45 th.CheckDeepEquals(t, expected, actual) 46 47 return true, nil 48 }) 49 50 if count != 1 { 51 t.Errorf("Expected 1 page, got %d", count) 52 } 53 } 54 55 func TestGet(t *testing.T) { 56 th.SetupHTTP() 57 defer th.TeardownHTTP() 58 59 th.Mux.HandleFunc("/v2.0/subnets/54d6f61d-db07-451c-9ab3-b9609b6b6f0b", func(w http.ResponseWriter, r *http.Request) { 60 th.TestMethod(t, r, "GET") 61 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 62 63 w.Header().Add("Content-Type", "application/json") 64 w.WriteHeader(http.StatusOK) 65 66 fmt.Fprintf(w, SubnetGetResult) 67 }) 68 69 s, err := subnets.Get(fake.ServiceClient(), "54d6f61d-db07-451c-9ab3-b9609b6b6f0b").Extract() 70 th.AssertNoErr(t, err) 71 72 th.AssertEquals(t, s.Name, "my_subnet") 73 th.AssertEquals(t, s.EnableDHCP, true) 74 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 75 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 76 th.AssertDeepEquals(t, s.DNSNameservers, []string{}) 77 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 78 { 79 Start: "192.0.0.2", 80 End: "192.255.255.254", 81 }, 82 }) 83 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 84 th.AssertEquals(t, s.IPVersion, 4) 85 th.AssertEquals(t, s.GatewayIP, "192.0.0.1") 86 th.AssertEquals(t, s.CIDR, "192.0.0.0/8") 87 th.AssertEquals(t, s.ID, "54d6f61d-db07-451c-9ab3-b9609b6b6f0b") 88 th.AssertEquals(t, s.SubnetPoolID, "b80340c7-9960-4f67-a99c-02501656284b") 89 } 90 91 func TestCreate(t *testing.T) { 92 th.SetupHTTP() 93 defer th.TeardownHTTP() 94 95 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 96 th.TestMethod(t, r, "POST") 97 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 98 th.TestHeader(t, r, "Content-Type", "application/json") 99 th.TestHeader(t, r, "Accept", "application/json") 100 th.TestJSONRequest(t, r, SubnetCreateRequest) 101 102 w.Header().Add("Content-Type", "application/json") 103 w.WriteHeader(http.StatusCreated) 104 105 fmt.Fprintf(w, SubnetCreateResult) 106 }) 107 108 var gatewayIP = "192.168.199.1" 109 var dnsPublishFixedIP = true 110 opts := subnets.CreateOpts{ 111 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22", 112 IPVersion: 4, 113 CIDR: "192.168.199.0/24", 114 GatewayIP: &gatewayIP, 115 AllocationPools: []subnets.AllocationPool{ 116 { 117 Start: "192.168.199.2", 118 End: "192.168.199.254", 119 }, 120 }, 121 DNSNameservers: []string{"foo"}, 122 DNSPublishFixedIP: &dnsPublishFixedIP, 123 ServiceTypes: []string{"network:routed"}, 124 HostRoutes: []subnets.HostRoute{ 125 {NextHop: "bar"}, 126 }, 127 SubnetPoolID: "b80340c7-9960-4f67-a99c-02501656284b", 128 } 129 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 130 th.AssertNoErr(t, err) 131 132 th.AssertEquals(t, s.Name, "") 133 th.AssertEquals(t, s.DNSPublishFixedIP, true) 134 th.AssertEquals(t, s.EnableDHCP, true) 135 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 136 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 137 th.AssertDeepEquals(t, s.DNSNameservers, []string{"foo"}) 138 th.AssertDeepEquals(t, s.ServiceTypes, []string{"network:routed"}) 139 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 140 { 141 Start: "192.168.199.2", 142 End: "192.168.199.254", 143 }, 144 }) 145 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 146 th.AssertEquals(t, s.IPVersion, 4) 147 th.AssertEquals(t, s.GatewayIP, "192.168.199.1") 148 th.AssertEquals(t, s.CIDR, "192.168.199.0/24") 149 th.AssertEquals(t, s.ID, "3b80198d-4f7b-4f77-9ef5-774d54e17126") 150 th.AssertEquals(t, s.SubnetPoolID, "b80340c7-9960-4f67-a99c-02501656284b") 151 } 152 153 func TestCreateNoGateway(t *testing.T) { 154 th.SetupHTTP() 155 defer th.TeardownHTTP() 156 157 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 158 th.TestMethod(t, r, "POST") 159 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 160 th.TestHeader(t, r, "Content-Type", "application/json") 161 th.TestHeader(t, r, "Accept", "application/json") 162 th.TestJSONRequest(t, r, SubnetCreateWithNoGatewayRequest) 163 164 w.Header().Add("Content-Type", "application/json") 165 w.WriteHeader(http.StatusCreated) 166 167 fmt.Fprintf(w, SubnetCreateWithNoGatewayResponse) 168 }) 169 170 var noGateway = "" 171 opts := subnets.CreateOpts{ 172 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a23", 173 IPVersion: 4, 174 CIDR: "192.168.1.0/24", 175 GatewayIP: &noGateway, 176 AllocationPools: []subnets.AllocationPool{ 177 { 178 Start: "192.168.1.2", 179 End: "192.168.1.254", 180 }, 181 }, 182 DNSNameservers: []string{}, 183 } 184 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 185 th.AssertNoErr(t, err) 186 187 th.AssertEquals(t, s.Name, "") 188 th.AssertEquals(t, s.EnableDHCP, true) 189 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a23") 190 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 191 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 192 { 193 Start: "192.168.1.2", 194 End: "192.168.1.254", 195 }, 196 }) 197 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 198 th.AssertEquals(t, s.IPVersion, 4) 199 th.AssertEquals(t, s.GatewayIP, "") 200 th.AssertEquals(t, s.CIDR, "192.168.1.0/24") 201 th.AssertEquals(t, s.ID, "54d6f61d-db07-451c-9ab3-b9609b6b6f0c") 202 } 203 204 func TestCreateDefaultGateway(t *testing.T) { 205 th.SetupHTTP() 206 defer th.TeardownHTTP() 207 208 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 209 th.TestMethod(t, r, "POST") 210 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 211 th.TestHeader(t, r, "Content-Type", "application/json") 212 th.TestHeader(t, r, "Accept", "application/json") 213 th.TestJSONRequest(t, r, SubnetCreateWithDefaultGatewayRequest) 214 215 w.Header().Add("Content-Type", "application/json") 216 w.WriteHeader(http.StatusCreated) 217 218 fmt.Fprintf(w, SubnetCreateWithDefaultGatewayResponse) 219 }) 220 221 opts := subnets.CreateOpts{ 222 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a23", 223 IPVersion: 4, 224 CIDR: "192.168.1.0/24", 225 AllocationPools: []subnets.AllocationPool{ 226 { 227 Start: "192.168.1.2", 228 End: "192.168.1.254", 229 }, 230 }, 231 DNSNameservers: []string{}, 232 } 233 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 234 th.AssertNoErr(t, err) 235 236 th.AssertEquals(t, s.Name, "") 237 th.AssertEquals(t, s.EnableDHCP, true) 238 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a23") 239 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 240 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 241 { 242 Start: "192.168.1.2", 243 End: "192.168.1.254", 244 }, 245 }) 246 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 247 th.AssertEquals(t, s.IPVersion, 4) 248 th.AssertEquals(t, s.GatewayIP, "192.168.1.1") 249 th.AssertEquals(t, s.CIDR, "192.168.1.0/24") 250 th.AssertEquals(t, s.ID, "54d6f61d-db07-451c-9ab3-b9609b6b6f0c") 251 } 252 253 func TestCreateIPv6RaAddressMode(t *testing.T) { 254 th.SetupHTTP() 255 defer th.TeardownHTTP() 256 257 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 258 th.TestMethod(t, r, "POST") 259 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 260 th.TestHeader(t, r, "Content-Type", "application/json") 261 th.TestHeader(t, r, "Accept", "application/json") 262 th.TestJSONRequest(t, r, SubnetCreateWithIPv6RaAddressModeRequest) 263 264 w.Header().Add("Content-Type", "application/json") 265 w.WriteHeader(http.StatusCreated) 266 267 fmt.Fprintf(w, SubnetCreateWithIPv6RaAddressModeResponse) 268 }) 269 270 var gatewayIP = "2001:db8:0:a::1" 271 opts := subnets.CreateOpts{ 272 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22", 273 IPVersion: 6, 274 CIDR: "2001:db8:0:a:0:0:0:0/64", 275 GatewayIP: &gatewayIP, 276 IPv6AddressMode: "slaac", 277 IPv6RAMode: "slaac", 278 } 279 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 280 th.AssertNoErr(t, err) 281 282 th.AssertEquals(t, s.Name, "") 283 th.AssertEquals(t, s.EnableDHCP, true) 284 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 285 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 286 th.AssertEquals(t, s.IPVersion, 6) 287 th.AssertEquals(t, s.GatewayIP, "2001:db8:0:a::1") 288 th.AssertEquals(t, s.CIDR, "2001:db8:0:a:0:0:0:0/64") 289 th.AssertEquals(t, s.ID, "3b80198d-4f7b-4f77-9ef5-774d54e17126") 290 th.AssertEquals(t, s.IPv6AddressMode, "slaac") 291 th.AssertEquals(t, s.IPv6RAMode, "slaac") 292 } 293 294 func TestCreateWithNoCIDR(t *testing.T) { 295 th.SetupHTTP() 296 defer th.TeardownHTTP() 297 298 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 299 th.TestMethod(t, r, "POST") 300 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 301 th.TestHeader(t, r, "Content-Type", "application/json") 302 th.TestHeader(t, r, "Accept", "application/json") 303 th.TestJSONRequest(t, r, SubnetCreateRequestWithNoCIDR) 304 305 w.Header().Add("Content-Type", "application/json") 306 w.WriteHeader(http.StatusCreated) 307 308 fmt.Fprintf(w, SubnetCreateResult) 309 }) 310 311 opts := subnets.CreateOpts{ 312 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22", 313 IPVersion: 4, 314 DNSNameservers: []string{"foo"}, 315 HostRoutes: []subnets.HostRoute{ 316 {NextHop: "bar"}, 317 }, 318 SubnetPoolID: "b80340c7-9960-4f67-a99c-02501656284b", 319 } 320 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 321 th.AssertNoErr(t, err) 322 323 th.AssertEquals(t, s.Name, "") 324 th.AssertEquals(t, s.DNSPublishFixedIP, true) 325 th.AssertEquals(t, s.EnableDHCP, true) 326 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 327 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 328 th.AssertDeepEquals(t, s.DNSNameservers, []string{"foo"}) 329 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 330 { 331 Start: "192.168.199.2", 332 End: "192.168.199.254", 333 }, 334 }) 335 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 336 th.AssertEquals(t, s.IPVersion, 4) 337 th.AssertEquals(t, s.GatewayIP, "192.168.199.1") 338 th.AssertEquals(t, s.CIDR, "192.168.199.0/24") 339 th.AssertEquals(t, s.ID, "3b80198d-4f7b-4f77-9ef5-774d54e17126") 340 th.AssertEquals(t, s.SubnetPoolID, "b80340c7-9960-4f67-a99c-02501656284b") 341 } 342 343 func TestCreateWithPrefixlen(t *testing.T) { 344 th.SetupHTTP() 345 defer th.TeardownHTTP() 346 347 th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) { 348 th.TestMethod(t, r, "POST") 349 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 350 th.TestHeader(t, r, "Content-Type", "application/json") 351 th.TestHeader(t, r, "Accept", "application/json") 352 th.TestJSONRequest(t, r, SubnetCreateRequestWithPrefixlen) 353 354 w.Header().Add("Content-Type", "application/json") 355 w.WriteHeader(http.StatusCreated) 356 357 fmt.Fprintf(w, SubnetCreateResult) 358 }) 359 360 opts := subnets.CreateOpts{ 361 NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a22", 362 IPVersion: 4, 363 DNSNameservers: []string{"foo"}, 364 HostRoutes: []subnets.HostRoute{ 365 {NextHop: "bar"}, 366 }, 367 SubnetPoolID: "b80340c7-9960-4f67-a99c-02501656284b", 368 Prefixlen: 12, 369 } 370 s, err := subnets.Create(fake.ServiceClient(), opts).Extract() 371 th.AssertNoErr(t, err) 372 373 th.AssertEquals(t, s.Name, "") 374 th.AssertEquals(t, s.DNSPublishFixedIP, true) 375 th.AssertEquals(t, s.EnableDHCP, true) 376 th.AssertEquals(t, s.NetworkID, "d32019d3-bc6e-4319-9c1d-6722fc136a22") 377 th.AssertEquals(t, s.TenantID, "4fd44f30292945e481c7b8a0c8908869") 378 th.AssertDeepEquals(t, s.DNSNameservers, []string{"foo"}) 379 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 380 { 381 Start: "192.168.199.2", 382 End: "192.168.199.254", 383 }, 384 }) 385 th.AssertDeepEquals(t, s.HostRoutes, []subnets.HostRoute{}) 386 th.AssertEquals(t, s.IPVersion, 4) 387 th.AssertEquals(t, s.GatewayIP, "192.168.199.1") 388 th.AssertEquals(t, s.CIDR, "192.168.199.0/24") 389 th.AssertEquals(t, s.ID, "3b80198d-4f7b-4f77-9ef5-774d54e17126") 390 th.AssertEquals(t, s.SubnetPoolID, "b80340c7-9960-4f67-a99c-02501656284b") 391 } 392 393 func TestRequiredCreateOpts(t *testing.T) { 394 res := subnets.Create(fake.ServiceClient(), subnets.CreateOpts{}) 395 if res.Err == nil { 396 t.Fatalf("Expected error, got none") 397 } 398 399 res = subnets.Create(fake.ServiceClient(), subnets.CreateOpts{NetworkID: "foo"}) 400 if res.Err == nil { 401 t.Fatalf("Expected error, got none") 402 } 403 404 res = subnets.Create(fake.ServiceClient(), subnets.CreateOpts{NetworkID: "foo", CIDR: "bar", IPVersion: 40}) 405 if res.Err == nil { 406 t.Fatalf("Expected error, got none") 407 } 408 } 409 410 func TestUpdate(t *testing.T) { 411 th.SetupHTTP() 412 defer th.TeardownHTTP() 413 414 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 415 th.TestMethod(t, r, "PUT") 416 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 417 th.TestHeader(t, r, "Content-Type", "application/json") 418 th.TestHeader(t, r, "Accept", "application/json") 419 th.TestJSONRequest(t, r, SubnetUpdateRequest) 420 421 w.Header().Add("Content-Type", "application/json") 422 w.WriteHeader(http.StatusCreated) 423 424 fmt.Fprintf(w, SubnetUpdateResponse) 425 }) 426 427 dnsNameservers := []string{"foo"} 428 name := "my_new_subnet" 429 opts := subnets.UpdateOpts{ 430 Name: &name, 431 DNSNameservers: &dnsNameservers, 432 HostRoutes: &[]subnets.HostRoute{ 433 {NextHop: "bar"}, 434 }, 435 } 436 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 437 th.AssertNoErr(t, err) 438 439 th.AssertEquals(t, s.Name, "my_new_subnet") 440 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 441 } 442 443 func TestUpdateGateway(t *testing.T) { 444 th.SetupHTTP() 445 defer th.TeardownHTTP() 446 447 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 448 th.TestMethod(t, r, "PUT") 449 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 450 th.TestHeader(t, r, "Content-Type", "application/json") 451 th.TestHeader(t, r, "Accept", "application/json") 452 th.TestJSONRequest(t, r, SubnetUpdateGatewayRequest) 453 454 w.Header().Add("Content-Type", "application/json") 455 w.WriteHeader(http.StatusCreated) 456 457 fmt.Fprintf(w, SubnetUpdateGatewayResponse) 458 }) 459 460 var gatewayIP = "10.0.0.1" 461 name := "my_new_subnet" 462 opts := subnets.UpdateOpts{ 463 Name: &name, 464 GatewayIP: &gatewayIP, 465 } 466 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 467 th.AssertNoErr(t, err) 468 469 th.AssertEquals(t, s.Name, "my_new_subnet") 470 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 471 th.AssertEquals(t, s.GatewayIP, "10.0.0.1") 472 } 473 474 func TestUpdateRemoveGateway(t *testing.T) { 475 th.SetupHTTP() 476 defer th.TeardownHTTP() 477 478 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 479 th.TestMethod(t, r, "PUT") 480 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 481 th.TestHeader(t, r, "Content-Type", "application/json") 482 th.TestHeader(t, r, "Accept", "application/json") 483 th.TestJSONRequest(t, r, SubnetUpdateRemoveGatewayRequest) 484 485 w.Header().Add("Content-Type", "application/json") 486 w.WriteHeader(http.StatusCreated) 487 488 fmt.Fprintf(w, SubnetUpdateRemoveGatewayResponse) 489 }) 490 491 var noGateway = "" 492 name := "my_new_subnet" 493 opts := subnets.UpdateOpts{ 494 Name: &name, 495 GatewayIP: &noGateway, 496 } 497 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 498 th.AssertNoErr(t, err) 499 500 th.AssertEquals(t, s.Name, "my_new_subnet") 501 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 502 th.AssertEquals(t, s.GatewayIP, "") 503 } 504 505 func TestUpdateHostRoutes(t *testing.T) { 506 th.SetupHTTP() 507 defer th.TeardownHTTP() 508 509 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 510 th.TestMethod(t, r, "PUT") 511 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 512 th.TestHeader(t, r, "Content-Type", "application/json") 513 th.TestHeader(t, r, "Accept", "application/json") 514 th.TestJSONRequest(t, r, SubnetUpdateHostRoutesRequest) 515 516 w.Header().Add("Content-Type", "application/json") 517 w.WriteHeader(http.StatusCreated) 518 519 fmt.Fprintf(w, SubnetUpdateHostRoutesResponse) 520 }) 521 522 HostRoutes := []subnets.HostRoute{ 523 { 524 DestinationCIDR: "192.168.1.1/24", 525 NextHop: "bar", 526 }, 527 } 528 529 name := "my_new_subnet" 530 opts := subnets.UpdateOpts{ 531 Name: &name, 532 HostRoutes: &HostRoutes, 533 } 534 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 535 th.AssertNoErr(t, err) 536 537 th.AssertEquals(t, s.Name, "my_new_subnet") 538 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 539 th.AssertDeepEquals(t, s.HostRoutes, HostRoutes) 540 } 541 542 func TestUpdateRemoveHostRoutes(t *testing.T) { 543 th.SetupHTTP() 544 defer th.TeardownHTTP() 545 546 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 547 th.TestMethod(t, r, "PUT") 548 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 549 th.TestHeader(t, r, "Content-Type", "application/json") 550 th.TestHeader(t, r, "Accept", "application/json") 551 th.TestJSONRequest(t, r, SubnetUpdateRemoveHostRoutesRequest) 552 553 w.Header().Add("Content-Type", "application/json") 554 w.WriteHeader(http.StatusCreated) 555 556 fmt.Fprintf(w, SubnetUpdateRemoveHostRoutesResponse) 557 }) 558 559 noHostRoutes := []subnets.HostRoute{} 560 opts := subnets.UpdateOpts{ 561 HostRoutes: &noHostRoutes, 562 } 563 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 564 th.AssertNoErr(t, err) 565 566 th.AssertEquals(t, s.Name, "my_new_subnet") 567 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 568 th.AssertDeepEquals(t, s.HostRoutes, noHostRoutes) 569 } 570 571 func TestUpdateAllocationPool(t *testing.T) { 572 th.SetupHTTP() 573 defer th.TeardownHTTP() 574 575 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 576 th.TestMethod(t, r, "PUT") 577 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 578 th.TestHeader(t, r, "Content-Type", "application/json") 579 th.TestHeader(t, r, "Accept", "application/json") 580 th.TestJSONRequest(t, r, SubnetUpdateAllocationPoolRequest) 581 582 w.Header().Add("Content-Type", "application/json") 583 w.WriteHeader(http.StatusCreated) 584 585 fmt.Fprintf(w, SubnetUpdateAllocationPoolResponse) 586 }) 587 588 name := "my_new_subnet" 589 opts := subnets.UpdateOpts{ 590 Name: &name, 591 AllocationPools: []subnets.AllocationPool{ 592 { 593 Start: "10.1.0.2", 594 End: "10.1.0.254", 595 }, 596 }, 597 } 598 s, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 599 th.AssertNoErr(t, err) 600 601 th.AssertEquals(t, s.Name, "my_new_subnet") 602 th.AssertEquals(t, s.ID, "08eae331-0402-425a-923c-34f7cfe39c1b") 603 th.AssertDeepEquals(t, s.AllocationPools, []subnets.AllocationPool{ 604 { 605 Start: "10.1.0.2", 606 End: "10.1.0.254", 607 }, 608 }) 609 } 610 611 func TestUpdateRevision(t *testing.T) { 612 th.SetupHTTP() 613 defer th.TeardownHTTP() 614 615 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 616 th.TestMethod(t, r, "PUT") 617 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 618 th.TestHeader(t, r, "Content-Type", "application/json") 619 th.TestHeader(t, r, "Accept", "application/json") 620 th.TestHeaderUnset(t, r, "If-Match") 621 th.TestJSONRequest(t, r, SubnetUpdateRequest) 622 623 w.Header().Add("Content-Type", "application/json") 624 w.WriteHeader(http.StatusCreated) 625 626 fmt.Fprintf(w, SubnetUpdateResponse) 627 }) 628 629 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1c", func(w http.ResponseWriter, r *http.Request) { 630 th.TestMethod(t, r, "PUT") 631 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 632 th.TestHeader(t, r, "Content-Type", "application/json") 633 th.TestHeader(t, r, "Accept", "application/json") 634 th.TestHeader(t, r, "If-Match", "revision_number=42") 635 th.TestJSONRequest(t, r, SubnetUpdateRequest) 636 637 w.Header().Add("Content-Type", "application/json") 638 w.WriteHeader(http.StatusCreated) 639 640 fmt.Fprintf(w, SubnetUpdateResponse) 641 }) 642 643 dnsNameservers := []string{"foo"} 644 name := "my_new_subnet" 645 opts := subnets.UpdateOpts{ 646 Name: &name, 647 DNSNameservers: &dnsNameservers, 648 HostRoutes: &[]subnets.HostRoute{ 649 {NextHop: "bar"}, 650 }, 651 } 652 _, err := subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b", opts).Extract() 653 th.AssertNoErr(t, err) 654 655 revisionNumber := 42 656 opts.RevisionNumber = &revisionNumber 657 _, err = subnets.Update(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1c", opts).Extract() 658 th.AssertNoErr(t, err) 659 } 660 661 func TestDelete(t *testing.T) { 662 th.SetupHTTP() 663 defer th.TeardownHTTP() 664 665 th.Mux.HandleFunc("/v2.0/subnets/08eae331-0402-425a-923c-34f7cfe39c1b", func(w http.ResponseWriter, r *http.Request) { 666 th.TestMethod(t, r, "DELETE") 667 th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) 668 w.WriteHeader(http.StatusNoContent) 669 }) 670 671 res := subnets.Delete(fake.ServiceClient(), "08eae331-0402-425a-923c-34f7cfe39c1b") 672 th.AssertNoErr(t, res.Err) 673 }