Skip to content

Commit a01807f

Browse files
author
Roman
committed
Dedicated private subnet
1 parent 34d17e9 commit a01807f

3 files changed

Lines changed: 268 additions & 0 deletions

File tree

pkg/v2/networks.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package v2
22

33
import (
4+
"bytes"
45
"context"
6+
"encoding/json"
57
"fmt"
68
"net/http"
79
)
@@ -82,6 +84,86 @@ func (client *ServiceClient) NetworkLocalSubnets(ctx context.Context, networkID
8284
return result.Result, responseResult, nil
8385
}
8486

87+
func (client *ServiceClient) GetNetworkLocalSubnet(ctx context.Context, subnetID string) (*LocalSubnet, *ResponseResult, error) {
88+
url := fmt.Sprintf("%s/network/ipam/local_subnet/%s", client.Endpoint, subnetID)
89+
90+
responseResult, err := client.DoRequest(ctx, http.MethodGet, url, nil)
91+
if err != nil {
92+
return nil, responseResult, err
93+
}
94+
if responseResult.Err != nil {
95+
return nil, responseResult, responseResult.Err
96+
}
97+
98+
var result struct {
99+
Result LocalSubnet `json:"result"`
100+
}
101+
102+
err = responseResult.ExtractResult(&result)
103+
if err != nil {
104+
return nil, responseResult, err
105+
}
106+
107+
return &result.Result, responseResult, nil
108+
}
109+
110+
func (client *ServiceClient) CreateNetworkLocalSubnet(ctx context.Context, networkID string, subnet string) (*LocalSubnet, *ResponseResult, error) {
111+
url := fmt.Sprintf("%s/network/ipam/local_subnet", client.Endpoint)
112+
113+
payload := struct {
114+
NetworkID string `json:"network_uuid"`
115+
SubnetAddress string `json:"subnet_address"`
116+
}{
117+
NetworkID: networkID,
118+
SubnetAddress: subnet,
119+
}
120+
121+
body, err := json.Marshal(payload)
122+
if err != nil {
123+
return nil, nil, err
124+
}
125+
126+
responseResult, err := client.DoRequest(ctx, http.MethodPost, url, bytes.NewReader(body))
127+
if err != nil {
128+
return nil, responseResult, err
129+
}
130+
if responseResult.Err != nil {
131+
return nil, responseResult, responseResult.Err
132+
}
133+
134+
var result struct {
135+
Result *LocalSubnet `json:"result"`
136+
}
137+
138+
err = responseResult.ExtractResult(&result)
139+
if err != nil {
140+
return nil, responseResult, err
141+
}
142+
143+
return result.Result, responseResult, nil
144+
}
145+
146+
func (client *ServiceClient) DeleteNetworkLocalSubnet(ctx context.Context, subnetID string) (*ResponseResult, error) {
147+
url := fmt.Sprintf("%s/network/ipam/local_subnet/%s", client.Endpoint, subnetID)
148+
149+
payload := struct{}{}
150+
151+
body, err := json.Marshal(payload)
152+
if err != nil {
153+
return nil, err
154+
}
155+
156+
responseResult, err := client.DoRequest(ctx, http.MethodDelete, url, bytes.NewReader(body))
157+
if err != nil {
158+
return nil, err
159+
}
160+
if responseResult.Err != nil {
161+
return responseResult, responseResult.Err
162+
}
163+
164+
return responseResult, nil
165+
}
166+
85167
func (client *ServiceClient) NetworkSubnet(ctx context.Context, subnetID string) (*Subnet, *ResponseResult, error) {
86168
url := fmt.Sprintf("%s/network/ipam/subnet/%s", client.Endpoint, subnetID)
87169

pkg/v2/networks.models.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,20 @@ type (
144144

145145
ReservedIPs []*ReservedIP
146146
)
147+
148+
type (
149+
LocalSubnet struct {
150+
UUID string `json:"uuid"`
151+
Broadcast net.IP `json:"broadcast"`
152+
Created int64 `json:"created"`
153+
GlobalRouterUUID string `json:"global_router_uuid"`
154+
LocationUUID string `json:"location_uuid"`
155+
Netmask net.IP `json:"netmask"`
156+
Network int `json:"network"`
157+
NetworkUUID string `json:"network_uuid"`
158+
OwnerID int `json:"owner_id"`
159+
ServiceTags []string `json:"service_tags"`
160+
Subnet string `json:"subnet"`
161+
Updated int64 `json:"updated"`
162+
}
163+
)

pkg/v2/networks_test.go

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12+
const (
13+
localSubnetSuccessBody = `{
14+
"result": {
15+
"network_uuid": "net1",
16+
"subnet": "192.168.1.0/24",
17+
"free": 1
18+
}
19+
}`
20+
)
21+
1222
func TestServiceClient_Networks(t *testing.T) {
1323
t.Run("Success", func(t *testing.T) {
1424
// Prepare
@@ -250,6 +260,165 @@ func TestServiceClient_NetworkLocalSubnets(t *testing.T) {
250260
})
251261
}
252262

263+
func TestServiceClient_GetNetworkLocalSubnet(t *testing.T) {
264+
t.Run("Success with networkID", func(t *testing.T) {
265+
fakeResp := httptest.NewFakeResponse(200, localSubnetSuccessBody) //nolint:bodyclose
266+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
267+
268+
subnet, respRes, err := client.GetNetworkLocalSubnet(context.Background(), "subnet1")
269+
require.NoError(t, err)
270+
require.NotNil(t, respRes)
271+
require.NotNil(t, subnet)
272+
})
273+
274+
t.Run("Success without networkID", func(t *testing.T) {
275+
fakeResp := httptest.NewFakeResponse(200, localSubnetSuccessBody) //nolint:bodyclose
276+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
277+
278+
subnet, respRes, err := client.GetNetworkLocalSubnet(context.Background(), "subnet1")
279+
require.NoError(t, err)
280+
require.NotNil(t, respRes)
281+
require.NotNil(t, subnet)
282+
})
283+
284+
t.Run("InvalidJSON", func(t *testing.T) {
285+
fakeResp := httptest.NewFakeResponse(200, invalidJSONBody) //nolint:bodyclose
286+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
287+
288+
subnet, respRes, err := client.GetNetworkLocalSubnet(context.Background(), "subnet1")
289+
require.Error(t, err)
290+
require.Nil(t, subnet)
291+
require.NotNil(t, respRes)
292+
})
293+
294+
t.Run("HTTPError", func(t *testing.T) {
295+
fakeResp := httptest.NewFakeResponse(404, httpErrorBody) //nolint:bodyclose
296+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
297+
298+
subnet, respRes, err := client.GetNetworkLocalSubnet(context.Background(), "subnet1")
299+
require.Error(t, err)
300+
require.Nil(t, subnet)
301+
require.NotNil(t, respRes)
302+
require.EqualError(t, respRes.Err, httpErrorMessage)
303+
})
304+
305+
t.Run("DoRequestError", func(t *testing.T) {
306+
client := newFakeClient("http://fake", httptest.NewFakeTransport(nil, errors.New("network failure")))
307+
308+
subnet, respRes, err := client.GetNetworkLocalSubnet(context.Background(), "subnet1")
309+
require.Error(t, err)
310+
require.Nil(t, subnet)
311+
require.Nil(t, respRes)
312+
})
313+
}
314+
315+
func TestServiceClient_CreateNetworkLocalSubnet(t *testing.T) {
316+
t.Run("Success with locationID", func(t *testing.T) {
317+
fakeResp := httptest.NewFakeResponse(201, localSubnetSuccessBody) //nolint:bodyclose
318+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
319+
320+
subnet, respRes, err := client.CreateNetworkLocalSubnet(
321+
context.Background(),
322+
"net1",
323+
"192.168.1.0/24",
324+
)
325+
326+
require.NoError(t, err)
327+
require.NotNil(t, respRes)
328+
require.NotNil(t, subnet)
329+
require.Equal(t, "net1", subnet.NetworkUUID)
330+
})
331+
332+
t.Run("Success without locationID", func(t *testing.T) {
333+
fakeResp := httptest.NewFakeResponse(201, localSubnetSuccessBody) //nolint:bodyclose
334+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
335+
336+
subnet, respRes, err := client.CreateNetworkLocalSubnet(
337+
context.Background(),
338+
"net1",
339+
"192.168.1.0/24",
340+
)
341+
342+
require.NoError(t, err)
343+
require.NotNil(t, respRes)
344+
require.NotNil(t, subnet)
345+
})
346+
347+
t.Run("InvalidJSON", func(t *testing.T) {
348+
fakeResp := httptest.NewFakeResponse(200, invalidJSONBody) //nolint:bodyclose
349+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
350+
351+
subnet, respRes, err := client.CreateNetworkLocalSubnet(
352+
context.Background(),
353+
"net1",
354+
"192.168.1.0/24",
355+
)
356+
357+
require.Error(t, err)
358+
require.Nil(t, subnet)
359+
require.NotNil(t, respRes)
360+
})
361+
362+
t.Run("HTTPError", func(t *testing.T) {
363+
fakeResp := httptest.NewFakeResponse(404, httpErrorBody) //nolint:bodyclose
364+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
365+
366+
subnet, respRes, err := client.CreateNetworkLocalSubnet(
367+
context.Background(),
368+
"net1",
369+
"192.168.1.0/24",
370+
)
371+
372+
require.Error(t, err)
373+
require.Nil(t, subnet)
374+
require.NotNil(t, respRes)
375+
require.EqualError(t, respRes.Err, httpErrorMessage)
376+
})
377+
378+
t.Run("DoRequestError", func(t *testing.T) {
379+
client := newFakeClient("http://fake", httptest.NewFakeTransport(nil, errors.New("network failure")))
380+
381+
subnet, respRes, err := client.CreateNetworkLocalSubnet(
382+
context.Background(),
383+
"net1",
384+
"192.168.1.0/24",
385+
)
386+
387+
require.Error(t, err)
388+
require.Nil(t, subnet)
389+
require.Nil(t, respRes)
390+
})
391+
}
392+
393+
func TestServiceClient_DeleteNetworkLocalSubnet(t *testing.T) {
394+
t.Run("Success", func(t *testing.T) {
395+
fakeResp := httptest.NewFakeResponse(204, `{}`) //nolint:bodyclose
396+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
397+
398+
respRes, err := client.DeleteNetworkLocalSubnet(context.Background(), "subnet1")
399+
require.NoError(t, err)
400+
require.NotNil(t, respRes)
401+
})
402+
403+
t.Run("HTTPError", func(t *testing.T) {
404+
fakeResp := httptest.NewFakeResponse(404, httpErrorBody) //nolint:bodyclose
405+
client := newFakeClient("http://fake", httptest.NewFakeTransport(fakeResp, nil))
406+
407+
respRes, err := client.DeleteNetworkLocalSubnet(context.Background(), "subnet1")
408+
require.Error(t, err)
409+
require.NotNil(t, respRes)
410+
require.EqualError(t, respRes.Err, httpErrorMessage)
411+
})
412+
413+
t.Run("DoRequestError", func(t *testing.T) {
414+
client := newFakeClient("http://fake", httptest.NewFakeTransport(nil, errors.New("network failure")))
415+
416+
respRes, err := client.DeleteNetworkLocalSubnet(context.Background(), "subnet1")
417+
require.Error(t, err)
418+
require.Nil(t, respRes)
419+
})
420+
}
421+
253422
func TestServiceClient_NetworkSubnet(t *testing.T) {
254423
t.Run("Success", func(t *testing.T) {
255424
body := `{"result": {"uuid": "subnet1", "subnet": "192.168.1.0/24"}}`

0 commit comments

Comments
 (0)