aboutsummaryrefslogtreecommitdiff
path: root/clients/netbox/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'clients/netbox/client.go')
-rw-r--r--clients/netbox/client.go70
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
3import ( 3import (
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
20type BasicNetboxClient struct { 16type BasicNetboxClient struct {
21 ApiKey string 17 *NetboxHttpClient
22 Endpoint string
23} 18}
24 19
25var _ NetboxClient = (*BasicNetboxClient)(nil) 20func MustNewBasicNetboxClient(apiKey, endpoint string) NetboxClient {
26 21 return &BasicNetboxClient{MustNewNetboxHttpClient(apiKey, endpoint)}
27func (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
55func (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
66func (c *BasicNetboxClient) GetSitePrefixesWithTag(ctx context.Context, site string, tag string) ([]*net.IPNet, error) { 24func (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
109func (c *BasicNetboxClient) GetPrefixesWithTag(ctx context.Context, tag string) ([]*net.IPNet, error) { 67func (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
146func (c *BasicNetboxClient) resolveSiteNameToId(ctx context.Context, s string) (int, error) { 104func (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) (
162func (c *BasicNetboxClient) GetServicesForVm(ctx context.Context, vmName string) ([]*Service, error) { 120func (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