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  }