diff options
Diffstat (limited to 'clients/netbox/client.go')
-rw-r--r-- | clients/netbox/client.go | 70 |
1 files changed, 14 insertions, 56 deletions
diff --git a/clients/netbox/client.go b/clients/netbox/client.go index ad2967a..3b7fbaf 100644 --- a/clients/netbox/client.go +++ b/clients/netbox/client.go | |||
@@ -2,12 +2,8 @@ package netbox | |||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "context" | 4 | "context" |
5 | "encoding/json" | ||
6 | "fmt" | 5 | "fmt" |
7 | "io" | ||
8 | "net" | 6 | "net" |
9 | "net/http" | ||
10 | "net/url" | ||
11 | "strconv" | 7 | "strconv" |
12 | ) | 8 | ) |
13 | 9 | ||
@@ -18,49 +14,11 @@ type NetboxClient interface { | |||
18 | } | 14 | } |
19 | 15 | ||
20 | type BasicNetboxClient struct { | 16 | type BasicNetboxClient struct { |
21 | ApiKey string | 17 | *NetboxHttpClient |
22 | Endpoint string | ||
23 | } | 18 | } |
24 | 19 | ||
25 | var _ NetboxClient = (*BasicNetboxClient)(nil) | 20 | func MustNewBasicNetboxClient(apiKey, endpoint string) NetboxClient { |
26 | 21 | return &BasicNetboxClient{MustNewNetboxHttpClient(apiKey, endpoint)} | |
27 | func (c *BasicNetboxClient) makeRequestRaw(ctx context.Context, method, u string, ib io.Reader, o interface{}) error { | ||
28 | req, err := http.NewRequestWithContext(ctx, method, u, ib) | ||
29 | if err != nil { | ||
30 | return err | ||
31 | } | ||
32 | req.Header.Add("Authorization", fmt.Sprintf("Token %s", c.ApiKey)) | ||
33 | |||
34 | res, err := http.DefaultClient.Do(req) | ||
35 | if err != nil { | ||
36 | return err | ||
37 | } | ||
38 | defer res.Body.Close() | ||
39 | |||
40 | if res.StatusCode != http.StatusOK { | ||
41 | apiError := &ApiError{Status: res.StatusCode} | ||
42 | if err = json.NewDecoder(res.Body).Decode(apiError); err != nil { | ||
43 | return fmt.Errorf("Netbox JSON decode error while parsing error with status %d: %w", res.StatusCode, err) | ||
44 | } | ||
45 | return apiError | ||
46 | } | ||
47 | |||
48 | if err = json.NewDecoder(res.Body).Decode(o); err != nil { | ||
49 | return err | ||
50 | } | ||
51 | |||
52 | return nil | ||
53 | } | ||
54 | |||
55 | func (c *BasicNetboxClient) makeRequest(ctx context.Context, method, path string, q url.Values, ib io.Reader, o interface{}) error { | ||
56 | u, err := url.Parse(c.Endpoint) | ||
57 | if err != nil { | ||
58 | return err | ||
59 | } | ||
60 | u.Path = path | ||
61 | u.RawQuery = q.Encode() | ||
62 | |||
63 | return c.makeRequestRaw(ctx, method, u.String(), ib, o) | ||
64 | } | 22 | } |
65 | 23 | ||
66 | func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site string, tag string) ([]*net.IPNet, error) { | 24 | func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site string, tag string) ([]*net.IPNet, error) { |
@@ -71,12 +29,12 @@ func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site str | |||
71 | 29 | ||
72 | out := []*net.IPNet{} | 30 | out := []*net.IPNet{} |
73 | 31 | ||
74 | q := url.Values{} | 32 | q := NewNetboxGetRequest("/api/ipam/prefixes/") |
75 | q.Add("site_id", strconv.Itoa(s)) | 33 | q.Add("site_id", strconv.Itoa(s)) |
76 | q.Add("tag", tag) | 34 | q.Add("tag", tag) |
77 | 35 | ||
78 | page := &PrefixList{} | 36 | page := &PrefixList{} |
79 | if err := c.makeRequest(ctx, http.MethodGet, "/api/ipam/prefixes/", q, nil, page); err != nil { | 37 | if err := c.Do(ctx, q, page); err != nil { |
80 | return nil, err | 38 | return nil, err |
81 | } | 39 | } |
82 | 40 | ||
@@ -90,7 +48,7 @@ func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site str | |||
90 | 48 | ||
91 | for page.Next != "" { | 49 | for page.Next != "" { |
92 | page = &PrefixList{} | 50 | page = &PrefixList{} |
93 | if err := c.makeRequestRaw(ctx, http.MethodGet, page.Next, nil, page); err != nil { | 51 | if err := c.Do(ctx, &NetboxRawGet{page.Next}, page); err != nil { |
94 | return nil, err | 52 | return nil, err |
95 | } | 53 | } |
96 | 54 | ||
@@ -109,11 +67,11 @@ func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site str | |||
109 | func (c *BasicNetboxClient) GetPrefixesWithTag(ctx context.Context, tag string) ([]*net.IPNet, error) { | 67 | func (c *BasicNetboxClient) GetPrefixesWithTag(ctx context.Context, tag string) ([]*net.IPNet, error) { |
110 | out := []*net.IPNet{} | 68 | out := []*net.IPNet{} |
111 | 69 | ||
112 | q := url.Values{} | 70 | q := NewNetboxGetRequest("/api/ipam/prefixes/") |
113 | q.Add("tag", tag) | 71 | q.Add("tag", tag) |
114 | 72 | ||
115 | page := &PrefixList{} | 73 | page := &PrefixList{} |
116 | if err := c.makeRequest(ctx, http.MethodGet, "/api/ipam/prefixes/", q, nil, page); err != nil { | 74 | if err := c.Do(ctx, q, page); err != nil { |
117 | return nil, err | 75 | return nil, err |
118 | } | 76 | } |
119 | 77 | ||
@@ -127,7 +85,7 @@ func (c *BasicNetboxClient) GetPrefixesWithTag(ctx context.Context, tag string) | |||
127 | 85 | ||
128 | for page.Next != "" { | 86 | for page.Next != "" { |
129 | page = &PrefixList{} | 87 | page = &PrefixList{} |
130 | if err := c.makeRequestRaw(ctx, http.MethodGet, page.Next, nil, page); err != nil { | 88 | if err := c.Do(ctx, &NetboxRawGet{page.Next}, page); err != nil { |
131 | return nil, err | 89 | return nil, err |
132 | } | 90 | } |
133 | 91 | ||
@@ -144,11 +102,11 @@ func (c *BasicNetboxClient) GetPrefixesWithTag(ctx context.Context, tag string) | |||
144 | } | 102 | } |
145 | 103 | ||
146 | func (c *BasicNetboxClient) resolveSiteNameToId(ctx context.Context, s string) (int, error) { | 104 | func (c *BasicNetboxClient) resolveSiteNameToId(ctx context.Context, s string) (int, error) { |
147 | q := url.Values{} | 105 | q := NewNetboxGetRequest("/api/dcim/sites/") |
148 | q.Add("name", s) | 106 | q.Add("name", s) |
149 | 107 | ||
150 | out := &SiteList{} | 108 | out := &SiteList{} |
151 | if err := c.makeRequest(ctx, http.MethodGet, "/api/dcim/sites/", q, nil, out); err != nil { | 109 | if err := c.Do(ctx, q, out); err != nil { |
152 | return 0, err | 110 | return 0, err |
153 | } | 111 | } |
154 | 112 | ||
@@ -162,11 +120,11 @@ func (c *BasicNetboxClient) resolveSiteNameToId(ctx context.Context, s string) ( | |||
162 | func (c *BasicNetboxClient) GetServicesForVm(ctx context.Context, vmName string) ([]*Service, error) { | 120 | func (c *BasicNetboxClient) GetServicesForVm(ctx context.Context, vmName string) ([]*Service, error) { |
163 | out := []*Service{} | 121 | out := []*Service{} |
164 | 122 | ||
165 | q := url.Values{} | 123 | q := NewNetboxGetRequest("/api/ipam/services/") |
166 | q.Add("virtual_machine", vmName) | 124 | q.Add("virtual_machine", vmName) |
167 | 125 | ||
168 | page := &ServiceList{} | 126 | page := &ServiceList{} |
169 | if err := c.makeRequest(ctx, http.MethodGet, "/api/ipam/services/", q, nil, page); err != nil { | 127 | if err := c.Do(ctx, q, page); err != nil { |
170 | return nil, err | 128 | return nil, err |
171 | } | 129 | } |
172 | 130 | ||
@@ -176,7 +134,7 @@ func (c *BasicNetboxClient) GetServicesForVm(ctx context.Context, vmName string) | |||
176 | 134 | ||
177 | for page.Next != "" { | 135 | for page.Next != "" { |
178 | page = &ServiceList{} | 136 | page = &ServiceList{} |
179 | if err := c.makeRequestRaw(ctx, http.MethodGet, page.Next, nil, page); err != nil { | 137 | if err := c.Do(ctx, &NetboxRawGet{page.Next}, page); err != nil { |
180 | return nil, err | 138 | return nil, err |
181 | } | 139 | } |
182 | 140 | ||