aboutsummaryrefslogtreecommitdiff
path: root/echo
diff options
context:
space:
mode:
authorMike Crute <mike@crute.us>2022-05-21 22:59:00 -0700
committerMike Crute <mike@crute.us>2022-05-21 22:59:00 -0700
commit1c95e861c15ca9e7763b8a678e2ce5e7f525c73e (patch)
tree44f904eef99c95dbfa3b065ee1d0143a8817adb6 /echo
parente1a4e7e55dbefbc53fda14312ddcf15e0b7bc462 (diff)
downloadgolib-1c95e861c15ca9e7763b8a678e2ce5e7f525c73e.tar.bz2
golib-1c95e861c15ca9e7763b8a678e2ce5e7f525c73e.tar.xz
golib-1c95e861c15ca9e7763b8a678e2ce5e7f525c73e.zip
netbox: move client to standaloneclients/netbox/v0.1.0
Diffstat (limited to 'echo')
-rw-r--r--echo/netbox/client.go169
-rw-r--r--echo/netbox/model.go74
2 files changed, 0 insertions, 243 deletions
diff --git a/echo/netbox/client.go b/echo/netbox/client.go
deleted file mode 100644
index aabadc8..0000000
--- a/echo/netbox/client.go
+++ /dev/null
@@ -1,169 +0,0 @@
1package netbox
2
3import (
4 "encoding/json"
5 "fmt"
6 "io"
7 "net"
8 "net/http"
9 "net/url"
10 "strconv"
11
12 "code.crute.us/mcrute/golib/vault"
13)
14
15type NetboxClient interface {
16 GetSitePrefixesWithTag(site string, tag string) ([]*net.IPNet, error)
17 GetPrefixesWithTag(tag string) ([]*net.IPNet, error)
18}
19
20func NewNetboxClientDefault() NetboxClient {
21 return &netboxClient{
22 endpoint: "https://netbox.crute.me",
23 vaultMaterial: "infra/netbox-readonly",
24 }
25}
26
27func NewNetboxClient(endpoint string, vaultMaterial string) NetboxClient {
28 return &netboxClient{
29 endpoint: endpoint,
30 vaultMaterial: vaultMaterial,
31 }
32}
33
34type netboxClient struct {
35 endpoint string
36 vaultMaterial string
37}
38
39func (c *netboxClient) makeRequestRaw(method, u string, ib io.Reader, o interface{}) error {
40 apiKey, err := vault.GetVaultApiKey(c.vaultMaterial)
41 if err != nil {
42 return err
43 }
44
45 req, err := http.NewRequest(method, u, ib)
46 if err != nil {
47 return err
48 }
49 req.Header.Add("Authorization", fmt.Sprintf("Token %s", apiKey))
50
51 res, err := http.DefaultClient.Do(req)
52 if err != nil {
53 return err
54 }
55 defer res.Body.Close()
56
57 if err = json.NewDecoder(res.Body).Decode(o); err != nil {
58 return err
59 }
60
61 return nil
62}
63
64func (c *netboxClient) makeRequest(method, path string, q url.Values, ib io.Reader, o interface{}) error {
65 u, err := url.Parse(c.endpoint)
66 if err != nil {
67 return err
68 }
69 u.Path = path
70 u.RawQuery = q.Encode()
71
72 return c.makeRequestRaw(method, u.String(), ib, o)
73}
74
75func (c *netboxClient) GetSitePrefixesWithTag(site string, tag string) ([]*net.IPNet, error) {
76 s, err := c.resolveSiteNameToId(site)
77 if err != nil {
78 return nil, err
79 }
80
81 out := []*net.IPNet{}
82
83 q := url.Values{}
84 q.Add("site_id", strconv.Itoa(s))
85 q.Add("tag", tag)
86
87 page := &PrefixList{}
88 if err := c.makeRequest(http.MethodGet, "/api/ipam/prefixes/", q, nil, page); err != nil {
89 return nil, err
90 }
91
92 for _, r := range page.Results {
93 _, ipnet, err := net.ParseCIDR(r.Prefix)
94 if err != nil {
95 return nil, err
96 }
97 out = append(out, ipnet)
98 }
99
100 for page.Next != "" {
101 page = &PrefixList{}
102 if err := c.makeRequestRaw(http.MethodGet, page.Next, nil, page); err != nil {
103 return nil, err
104 }
105
106 for _, r := range page.Results {
107 _, ipnet, err := net.ParseCIDR(r.Prefix)
108 if err != nil {
109 return nil, err
110 }
111 out = append(out, ipnet)
112 }
113 }
114
115 return out, nil
116}
117
118func (c *netboxClient) GetPrefixesWithTag(tag string) ([]*net.IPNet, error) {
119 out := []*net.IPNet{}
120
121 q := url.Values{}
122 q.Add("tag", tag)
123
124 page := &PrefixList{}
125 if err := c.makeRequest(http.MethodGet, "/api/ipam/prefixes/", q, nil, page); err != nil {
126 return nil, err
127 }
128
129 for _, r := range page.Results {
130 _, ipnet, err := net.ParseCIDR(r.Prefix)
131 if err != nil {
132 return nil, err
133 }
134 out = append(out, ipnet)
135 }
136
137 for page.Next != "" {
138 page = &PrefixList{}
139 if err := c.makeRequestRaw(http.MethodGet, page.Next, nil, page); err != nil {
140 return nil, err
141 }
142
143 for _, r := range page.Results {
144 _, ipnet, err := net.ParseCIDR(r.Prefix)
145 if err != nil {
146 return nil, err
147 }
148 out = append(out, ipnet)
149 }
150 }
151
152 return out, nil
153}
154
155func (c *netboxClient) resolveSiteNameToId(s string) (int, error) {
156 q := url.Values{}
157 q.Add("name", s)
158
159 out := &SiteList{}
160 if err := c.makeRequest(http.MethodGet, "/api/dcim/sites/", q, nil, out); err != nil {
161 return 0, err
162 }
163
164 if len(out.Results) == 0 {
165 return 0, fmt.Errorf("resolveSiteNameToId: no results returned from netbox")
166 }
167
168 return out.Results[0].ID, nil
169}
diff --git a/echo/netbox/model.go b/echo/netbox/model.go
deleted file mode 100644
index 78f2ca6..0000000
--- a/echo/netbox/model.go
+++ /dev/null
@@ -1,74 +0,0 @@
1package netbox
2
3type LabeledInt struct {
4 Value int `json:"value"`
5 Label string `json:"label"`
6}
7
8type LabeledString struct {
9 Value string `json:"value"`
10 Label string `json:"label"`
11}
12
13type Role struct {
14 ID int `json:"ID"`
15 Url string `json:"url"`
16 Display string `json:"display"`
17 Name string `json:"name"`
18 Slug string `json:"slub"`
19}
20
21type Tag struct {
22 ID int `json:"id"`
23 Url string `json:"url"`
24 Display string `json:"display"`
25 Name string `json:"name"`
26 Slug string `json:"slug"`
27 Color string `json:"color"`
28}
29
30type SiteList struct {
31 Count int `json:"count"`
32 Next string `json:"next"`
33 Previous string `json:"previous"`
34 Results []*Site `json:"results"`
35}
36
37type Site struct {
38 ID int `json:"id"`
39 Url string `json:"url"`
40 Display string `json:"display"`
41 Name string `json:"name"`
42 Slug string `json:"slug"`
43 Facility string `json:"facility"`
44 Description string `json:"description"`
45 Timezone string `json:"time_zone"`
46 ASN int `json:"asn"`
47 Status LabeledString `json:"status"`
48}
49
50type PrefixList struct {
51 Count int `json:"count"`
52 Next string `json:"next"`
53 Previous string `json:"previous"`
54 Results []*Prefix `json:"results"`
55}
56
57type Prefix struct {
58 ID int `json:"ID"`
59 Url string `json:"url"`
60 Display string `json:"display"`
61 Prefix string `json:"prefix"`
62 IsPool bool `json:"is_pool"`
63 Description string `json:"description"`
64 Created string `json:"created"`
65 LastUpdated string `json:"last_updated"`
66 Children int `json:"children"`
67 Depth int `json:"_depth"`
68 Family LabeledInt `json:"family"`
69 Status LabeledString `json:"status"`
70 Site *Site `json:"site"`
71 Role *Role `json:"role"`
72 Tags []*Tag `json:"tags"`
73 CustomFields map[string]interface{} `json:"custom_fields"`
74}