Skip to content
This repository has been archived by the owner on Aug 1, 2023. It is now read-only.

Commit

Permalink
Ensure both GatewayIP and NoGateway cannot be set in subnets
Browse files Browse the repository at this point in the history
  • Loading branch information
jtopjian committed Apr 7, 2016
1 parent f92ae6c commit 2524d11
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 3 deletions.
16 changes: 16 additions & 0 deletions acceptance/openstack/networking/v2/subnet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,22 @@ func TestSubnetCRUD(t *testing.T) {
t.Log("Delete subnet with no gateway")
res = subnets.Delete(Client, subnetID)
th.AssertNoErr(t, res.Err)

// Create subnet with invalid gateway configuration
t.Log("Create subnet with invalid gateway configuration")
opts = subnets.CreateOpts{
NetworkID: networkID,
CIDR: "192.168.199.0/24",
IPVersion: subnets.IPv4,
Name: "my_subnet",
EnableDHCP: &enable,
NoGateway: true,
GatewayIP: "192.168.199.1",
}
_, err = subnets.Create(Client, opts).Extract()
if err == nil {
t.Fatalf("Expected an error, got none")
}
}

func TestBatchCreate(t *testing.T) {
Expand Down
7 changes: 4 additions & 3 deletions openstack/networking/v2/subnets/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ func err(str string) error {
}

var (
errNetworkIDRequired = err("A network ID is required")
errCIDRRequired = err("A valid CIDR is required")
errInvalidIPType = err("An IP type must either be 4 or 6")
errNetworkIDRequired = err("A network ID is required")
errCIDRRequired = err("A valid CIDR is required")
errInvalidIPType = err("An IP type must either be 4 or 6")
errInvalidGatewayConfig = err("Both disabling the gateway and specifying a gateway is not allowed")
)
10 changes: 10 additions & 0 deletions openstack/networking/v2/subnets/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,11 @@ func (opts CreateOpts) ToSubnetCreateMap() (map[string]interface{}, error) {
return nil, errInvalidIPType
}

// Both GatewayIP and NoGateway should not be set
if opts.GatewayIP != "" && opts.NoGateway {
return nil, errInvalidGatewayConfig
}

s["network_id"] = opts.NetworkID
s["cidr"] = opts.CIDR

Expand Down Expand Up @@ -197,6 +202,11 @@ type UpdateOpts struct {
func (opts UpdateOpts) ToSubnetUpdateMap() (map[string]interface{}, error) {
s := make(map[string]interface{})

// Both GatewayIP and NoGateway should not be set
if opts.GatewayIP != "" && opts.NoGateway {
return nil, errInvalidGatewayConfig
}

if opts.EnableDHCP != nil {
s["enable_dhcp"] = &opts.EnableDHCP
}
Expand Down
54 changes: 54 additions & 0 deletions openstack/networking/v2/subnets/requests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,60 @@ func TestCreateNoGateway(t *testing.T) {
th.AssertEquals(t, s.ID, "54d6f61d-db07-451c-9ab3-b9609b6b6f0c")
}

func TestCreateInvalidGatewayConfig(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()

th.Mux.HandleFunc("/v2.0/subnets", func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "POST")
th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
th.TestHeader(t, r, "Content-Type", "application/json")
th.TestHeader(t, r, "Accept", "application/json")
th.TestJSONRequest(t, r, `
{
"subnet": {
"network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a23",
"ip_version": 4,
"cidr": "192.168.1.0/24",
"gateway_ip": "192.168.1.1",
"allocation_pools": [
{
"start": "192.168.1.2",
"end": "192.168.1.254"
}
]
}
}
`)

w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
})

opts := CreateOpts{
NetworkID: "d32019d3-bc6e-4319-9c1d-6722fc136a23",
IPVersion: 4,
CIDR: "192.168.1.0/24",
NoGateway: true,
GatewayIP: "192.168.1.1",
AllocationPools: []AllocationPool{
AllocationPool{
Start: "192.168.1.2",
End: "192.168.1.254",
},
},
DNSNameservers: []string{},
}
_, err := Create(fake.ServiceClient(), opts).Extract()
if err == nil {
t.Fatalf("Expected an error, got none")
}

if err != errInvalidGatewayConfig {
t.Fatalf("Exected errInvalidGateway but got: %s", err)
}
}

func TestRequiredCreateOpts(t *testing.T) {
res := Create(fake.ServiceClient(), CreateOpts{})
if res.Err == nil {
Expand Down

0 comments on commit 2524d11

Please sign in to comment.