tsig_key.go raw
1 package rest
2
3 import (
4 "errors"
5 "fmt"
6 "net/http"
7
8 "gopkg.in/ns1/ns1-go.v2/rest/model/dns"
9 )
10
11 // TsigService handles 'tsig' endpoint.
12 type TsigService service
13
14 // List returns all tsig keys and basic tsig keys configuration details for each.
15 //
16 // NS1 API docs: https://ns1.com/api/#getlist-tsig-keys
17 func (s *TsigService) List() ([]*dns.TSIGKey, *http.Response, error) {
18 req, err := s.client.NewRequest("GET", "tsig", nil)
19 if err != nil {
20 return nil, nil, err
21 }
22
23 tsigKeyList := []*dns.TSIGKey{}
24 var resp *http.Response
25 resp, err = s.client.Do(req, &tsigKeyList)
26 if err != nil {
27 return nil, resp, err
28 }
29
30 return tsigKeyList, resp, nil
31 }
32
33 // Get takes a TSIG key name and returns a single TSIG key and its basic configuration details.
34 //
35 // NS1 API docs: https://ns1.com/api/#getview-tsig-key-details
36 func (s *TsigService) Get(name string) (*dns.TSIGKey, *http.Response, error) {
37 path := fmt.Sprintf("tsig/%s", name)
38
39 req, err := s.client.NewRequest("GET", path, nil)
40 if err != nil {
41 return nil, nil, err
42 }
43
44 var tk dns.TSIGKey
45 var resp *http.Response
46 resp, err = s.client.Do(req, &tk)
47 if err != nil {
48 switch errType := err.(type) {
49 case *Error:
50 if errType.Resp.StatusCode == http.StatusNotFound {
51 return nil, resp, ErrTsigKeyMissing
52 }
53 }
54 return nil, resp, err
55 }
56
57 return &tk, resp, nil
58 }
59
60 // Create takes a *TSIGkey and creates a new TSIG key.
61 //
62 // NS1 API docs: https://ns1.com/api/#putcreate-a-tsig-key
63 func (s *TsigService) Create(tk *dns.TSIGKey) (*http.Response, error) {
64 path := fmt.Sprintf("tsig/%s", tk.Name)
65
66 req, err := s.client.NewRequest("PUT", path, &tk)
67 if err != nil {
68 return nil, err
69 }
70
71 // Update TSIG key fields with data from api(ensure consistent)
72 resp, err := s.client.Do(req, &tk)
73 if err != nil {
74 switch errType := err.(type) {
75 case *Error:
76 if errType.Resp.StatusCode == http.StatusConflict {
77 return resp, ErrTsigKeyExists
78 }
79 }
80 return resp, err
81 }
82
83 return resp, nil
84 }
85
86 // Update takes a *TSIGKey and modifies basic details of a TSIG key.
87 //
88 // NS1 API docs: https://ns1.com/api/#postmodify-a-tsig-key
89 func (s *TsigService) Update(tk *dns.TSIGKey) (*http.Response, error) {
90 path := fmt.Sprintf("tsig/%s", tk.Name)
91
92 req, err := s.client.NewRequest("POST", path, &tk)
93 if err != nil {
94 return nil, err
95 }
96
97 // Update TSIG key fields with data from api(ensure consistent)
98 resp, err := s.client.Do(req, &tk)
99 if err != nil {
100 switch errType := err.(type) {
101 case *Error:
102 if errType.Resp.StatusCode == http.StatusNotFound {
103 return resp, ErrTsigKeyMissing
104 }
105 }
106 return resp, err
107 }
108
109 return resp, nil
110 }
111
112 // Delete takes a TSIG key name and destroys an existing TSIG key.
113 //
114 // NS1 API docs: https://ns1.com/api/#deleteremove-a-tsig-key
115 func (s *TsigService) Delete(name string) (*http.Response, error) {
116 path := fmt.Sprintf("tsig/%s", name)
117
118 req, err := s.client.NewRequest("DELETE", path, nil)
119 if err != nil {
120 return nil, err
121 }
122
123 resp, err := s.client.Do(req, nil)
124 if err != nil {
125 switch errType := err.(type) {
126 case *Error:
127 if errType.Resp.StatusCode == http.StatusNotFound {
128 return resp, ErrTsigKeyMissing
129 }
130 }
131 return resp, err
132 }
133
134 return resp, nil
135 }
136
137 var (
138 // ErrTsigKeyExists bundles PUT create error.
139 ErrTsigKeyExists = errors.New("TSIG key already exists")
140 // ErrTsigKeyMissing bundles GET/POST/DELETE error.
141 ErrTsigKeyMissing = errors.New("TSIG key does not exist")
142 )
143