zonebulk.go raw
1 package dns
2
3 import (
4 "context"
5 "errors"
6 "fmt"
7 "net/http"
8
9 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v11/pkg/edgegriderr"
10 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v11/pkg/session"
11 validation "github.com/go-ozzo/ozzo-validation/v4"
12 )
13
14 type (
15 // BulkZonesCreate contains a list of one or more new Zones to create
16 BulkZonesCreate struct {
17 Zones []ZoneCreate `json:"zones"`
18 }
19
20 // BulkZonesResponse contains response from bulk-create request
21 BulkZonesResponse struct {
22 RequestID string `json:"requestId"`
23 ExpirationDate string `json:"expirationDate"`
24 }
25
26 // BulkRequest contains request parameter
27 BulkRequest struct {
28 RequestID string
29 }
30
31 // BulkStatusResponse contains current status of a running or completed bulk-create request
32 BulkStatusResponse struct {
33 RequestID string `json:"requestId"`
34 ZonesSubmitted int `json:"zonesSubmitted"`
35 SuccessCount int `json:"successCount"`
36 FailureCount int `json:"failureCount"`
37 IsComplete bool `json:"isComplete"`
38 ExpirationDate string `json:"expirationDate"`
39 }
40
41 // BulkFailedZone contains information about failed zone
42 BulkFailedZone struct {
43 Zone string `json:"zone"`
44 FailureReason string `json:"failureReason"`
45 }
46
47 // BulkCreateResultResponse contains the response from a completed bulk-create request
48 BulkCreateResultResponse struct {
49 RequestID string `json:"requestId"`
50 SuccessfullyCreatedZones []string `json:"successfullyCreatedZones"`
51 FailedZones []BulkFailedZone `json:"failedZones"`
52 }
53
54 // BulkDeleteResultResponse contains the response from a completed bulk-delete request
55 BulkDeleteResultResponse struct {
56 RequestID string `json:"requestId"`
57 SuccessfullyDeletedZones []string `json:"successfullyDeletedZones"`
58 FailedZones []BulkFailedZone `json:"failedZones"`
59 }
60
61 // GetBulkZoneCreateStatusRequest contains request parameters for GetBulkZoneCreateStatus
62 GetBulkZoneCreateStatusRequest BulkRequest
63
64 // GetBulkZoneCreateStatusResponse contains the response data from GetBulkZoneCreateStatus operation
65 GetBulkZoneCreateStatusResponse struct {
66 RequestID string `json:"requestId"`
67 ZonesSubmitted int `json:"zonesSubmitted"`
68 SuccessCount int `json:"successCount"`
69 FailureCount int `json:"failureCount"`
70 IsComplete bool `json:"isComplete"`
71 ExpirationDate string `json:"expirationDate"`
72 }
73
74 // GetBulkZoneDeleteStatusRequest contains request parameters for GetBulkZoneDeleteStatus
75 GetBulkZoneDeleteStatusRequest BulkRequest
76
77 // GetBulkZoneDeleteStatusResponse contains the response data from GetBulkZoneDeleteStatus operation
78 GetBulkZoneDeleteStatusResponse struct {
79 RequestID string `json:"requestId"`
80 ZonesSubmitted int `json:"zonesSubmitted"`
81 SuccessCount int `json:"successCount"`
82 FailureCount int `json:"failureCount"`
83 IsComplete bool `json:"isComplete"`
84 ExpirationDate string `json:"expirationDate"`
85 }
86
87 // GetBulkZoneCreateResultRequest contains request parameters for GetBulkZoneCreateResult
88 GetBulkZoneCreateResultRequest BulkRequest
89
90 // GetBulkZoneCreateResultResponse contains the response data from GetBulkZoneCreateResult operation
91 GetBulkZoneCreateResultResponse struct {
92 RequestID string `json:"requestId"`
93 SuccessfullyCreatedZones []string `json:"successfullyCreatedZones"`
94 FailedZones []BulkFailedZone `json:"failedZones"`
95 }
96
97 // GetBulkZoneDeleteResultRequest contains request parameters for GetBulkZoneDeleteResult
98 GetBulkZoneDeleteResultRequest BulkRequest
99
100 // GetBulkZoneDeleteResultResponse contains the response data from GetBulkZoneDeleteResult operation
101 GetBulkZoneDeleteResultResponse struct {
102 RequestID string `json:"requestId"`
103 SuccessfullyDeletedZones []string `json:"successfullyDeletedZones"`
104 FailedZones []BulkFailedZone `json:"failedZones"`
105 }
106
107 // CreateBulkZonesRequest contains request parameters for CreateBulkZones
108 CreateBulkZonesRequest struct {
109 BulkZones *BulkZonesCreate
110 ZoneQueryString ZoneQueryString
111 }
112
113 // CreateBulkZonesResponse contains the response data from CreateBulkZones operation
114 CreateBulkZonesResponse struct {
115 RequestID string `json:"requestId"`
116 ExpirationDate string `json:"expirationDate"`
117 }
118
119 // DeleteBulkZonesRequest contains request parameters for DeleteBulkZones
120 DeleteBulkZonesRequest struct {
121 ZonesList *ZoneNameListResponse
122 BypassSafetyChecks *bool
123 }
124
125 // DeleteBulkZonesResponse contains the response data from DeleteBulkZones operation
126 DeleteBulkZonesResponse struct {
127 RequestID string `json:"requestId"`
128 ExpirationDate string `json:"expirationDate"`
129 }
130 )
131
132 var (
133 // ErrGetBulkZoneCreateStatus is returned when GetBulkZoneCreateStatus fails
134 ErrGetBulkZoneCreateStatus = errors.New("get bulk zone create status")
135 // ErrGetBulkZoneDeleteStatus is returned when GetBulkZoneDeleteStatus fails
136 ErrGetBulkZoneDeleteStatus = errors.New("get bulk zone delete status")
137 // ErrGetBulkZoneCreateResult is returned when GetBulkZoneCreateResult fails
138 ErrGetBulkZoneCreateResult = errors.New("get bulk zone create result")
139 // ErrGetBulkZoneDeleteResult is returned when GetBulkZoneDeleteResult fails
140 ErrGetBulkZoneDeleteResult = errors.New("get bulk zone delete result")
141 // ErrCreateBulkZones is returned when CreateBulkZones fails
142 ErrCreateBulkZones = errors.New("create bulk zones")
143 // ErrDeleteBulkZones is returned when DeleteBulkZones fails
144 ErrDeleteBulkZones = errors.New("delete bulk zones")
145 )
146
147 // Validate validates GetBulkZoneCreateStatusRequest
148 func (r GetBulkZoneCreateStatusRequest) Validate() error {
149 return edgegriderr.ParseValidationErrors(validation.Errors{
150 "RequestID": validation.Validate(r.RequestID, validation.Required),
151 })
152 }
153
154 // Validate validates GetBulkZoneDeleteStatusRequest
155 func (r GetBulkZoneDeleteStatusRequest) Validate() error {
156 return edgegriderr.ParseValidationErrors(validation.Errors{
157 "RequestID": validation.Validate(r.RequestID, validation.Required),
158 })
159 }
160
161 // Validate validates GetBulkZoneCreateResultRequest
162 func (r GetBulkZoneCreateResultRequest) Validate() error {
163 return edgegriderr.ParseValidationErrors(validation.Errors{
164 "RequestID": validation.Validate(r.RequestID, validation.Required),
165 })
166 }
167
168 // Validate validates GetBulkZoneDeleteResultRequest
169 func (r GetBulkZoneDeleteResultRequest) Validate() error {
170 return edgegriderr.ParseValidationErrors(validation.Errors{
171 "RequestID": validation.Validate(r.RequestID, validation.Required),
172 })
173 }
174
175 // Validate validates CreateBulkZonesRequest
176 func (r CreateBulkZonesRequest) Validate() error {
177 return edgegriderr.ParseValidationErrors(validation.Errors{
178 "BulkZones": validation.Validate(r.BulkZones, validation.Required),
179 })
180 }
181
182 // Validate validates DeleteBulkZonesRequest
183 func (r DeleteBulkZonesRequest) Validate() error {
184 return edgegriderr.ParseValidationErrors(validation.Errors{
185 "ZonesList": validation.Validate(r.ZonesList, validation.Required),
186 })
187 }
188
189 func (d *dns) GetBulkZoneCreateStatus(ctx context.Context, params GetBulkZoneCreateStatusRequest) (*GetBulkZoneCreateStatusResponse, error) {
190 logger := d.Log(ctx)
191 logger.Debug("GetBulkZoneCreateStatus")
192
193 if err := params.Validate(); err != nil {
194 return nil, fmt.Errorf("%s: %w: %s", ErrGetBulkZoneCreateStatus, ErrStructValidation, err)
195 }
196
197 bulkZonesURL := fmt.Sprintf("/config-dns/v2/zones/create-requests/%s", params.RequestID)
198
199 req, err := http.NewRequestWithContext(ctx, http.MethodGet, bulkZonesURL, nil)
200 if err != nil {
201 return nil, fmt.Errorf("failed to create GetBulkZoneCreateStatus request: %w", err)
202 }
203
204 var result GetBulkZoneCreateStatusResponse
205 resp, err := d.Exec(req, &result)
206 if err != nil {
207 return nil, fmt.Errorf("GetBulkZoneCreateStatus request failed: %w", err)
208 }
209 defer session.CloseResponseBody(resp)
210
211 if resp.StatusCode != http.StatusOK {
212 return nil, d.Error(resp)
213 }
214
215 return &result, nil
216 }
217
218 func (d *dns) GetBulkZoneDeleteStatus(ctx context.Context, params GetBulkZoneDeleteStatusRequest) (*GetBulkZoneDeleteStatusResponse, error) {
219 logger := d.Log(ctx)
220 logger.Debug("GetBulkZoneDeleteStatus")
221
222 if err := params.Validate(); err != nil {
223 return nil, fmt.Errorf("%s: %w: %s", ErrGetBulkZoneDeleteStatus, ErrStructValidation, err)
224 }
225
226 bulkZonesURL := fmt.Sprintf("/config-dns/v2/zones/delete-requests/%s", params.RequestID)
227
228 req, err := http.NewRequestWithContext(ctx, http.MethodGet, bulkZonesURL, nil)
229 if err != nil {
230 return nil, fmt.Errorf("failed to create GetBulkZoneDeleteStatus request: %w", err)
231 }
232
233 var result GetBulkZoneDeleteStatusResponse
234 resp, err := d.Exec(req, &result)
235 if err != nil {
236 return nil, fmt.Errorf("GetBulkZoneDeleteStatus request failed: %w", err)
237 }
238 defer session.CloseResponseBody(resp)
239
240 if resp.StatusCode != http.StatusOK {
241 return nil, d.Error(resp)
242 }
243
244 return &result, nil
245 }
246
247 func (d *dns) GetBulkZoneCreateResult(ctx context.Context, params GetBulkZoneCreateResultRequest) (*GetBulkZoneCreateResultResponse, error) {
248 logger := d.Log(ctx)
249 logger.Debug("GetBulkZoneCreateResult")
250
251 if err := params.Validate(); err != nil {
252 return nil, fmt.Errorf("%s: %w: %s", ErrGetBulkZoneCreateResult, ErrStructValidation, err)
253 }
254
255 bulkZonesURL := fmt.Sprintf("/config-dns/v2/zones/create-requests/%s/result", params.RequestID)
256 var status GetBulkZoneCreateResultResponse
257
258 req, err := http.NewRequestWithContext(ctx, http.MethodGet, bulkZonesURL, nil)
259 if err != nil {
260 return nil, fmt.Errorf("failed to create GetBulkZoneCreateResult request: %w", err)
261 }
262
263 resp, err := d.Exec(req, &status)
264 if err != nil {
265 return nil, fmt.Errorf("GetBulkZoneCreateResult request failed: %w", err)
266 }
267 defer session.CloseResponseBody(resp)
268
269 if resp.StatusCode != http.StatusOK {
270 return nil, d.Error(resp)
271 }
272
273 return &status, nil
274 }
275
276 func (d *dns) GetBulkZoneDeleteResult(ctx context.Context, params GetBulkZoneDeleteResultRequest) (*GetBulkZoneDeleteResultResponse, error) {
277 logger := d.Log(ctx)
278 logger.Debug("GetBulkZoneDeleteResult")
279
280 if err := params.Validate(); err != nil {
281 return nil, fmt.Errorf("%s: %w: %s", ErrGetBulkZoneDeleteResult, ErrStructValidation, err)
282 }
283
284 bulkZonesURL := fmt.Sprintf("/config-dns/v2/zones/delete-requests/%s/result", params.RequestID)
285
286 req, err := http.NewRequestWithContext(ctx, http.MethodGet, bulkZonesURL, nil)
287 if err != nil {
288 return nil, fmt.Errorf("failed to create GetBulkZoneDeleteResult request: %w", err)
289 }
290
291 var result GetBulkZoneDeleteResultResponse
292 resp, err := d.Exec(req, &result)
293 if err != nil {
294 return nil, fmt.Errorf("GetBulkZoneDeleteResult request failed: %w", err)
295 }
296 defer session.CloseResponseBody(resp)
297
298 if resp.StatusCode != http.StatusOK {
299 return nil, d.Error(resp)
300 }
301
302 return &result, nil
303 }
304
305 func (d *dns) CreateBulkZones(ctx context.Context, params CreateBulkZonesRequest) (*CreateBulkZonesResponse, error) {
306 logger := d.Log(ctx)
307 logger.Debug("CreateBulkZones")
308
309 if err := params.Validate(); err != nil {
310 return nil, fmt.Errorf("%s: %w: %s", ErrCreateBulkZones, ErrStructValidation, err)
311 }
312
313 bulkZonesURL := "/config-dns/v2/zones/create-requests?contractId=" + params.ZoneQueryString.Contract
314 if len(params.ZoneQueryString.Group) > 0 {
315 bulkZonesURL += "&gid=" + params.ZoneQueryString.Group
316 }
317
318 req, err := http.NewRequestWithContext(ctx, http.MethodPost, bulkZonesURL, nil)
319 if err != nil {
320 return nil, fmt.Errorf("failed to create CreateBulkZones request: %w", err)
321 }
322
323 var result CreateBulkZonesResponse
324 resp, err := d.Exec(req, &result, params.BulkZones)
325 if err != nil {
326 return nil, fmt.Errorf("CreateBulkZones request failed: %w", err)
327 }
328 defer session.CloseResponseBody(resp)
329
330 if resp.StatusCode != http.StatusCreated {
331 return nil, d.Error(resp)
332 }
333
334 return &result, nil
335 }
336
337 func (d *dns) DeleteBulkZones(ctx context.Context, params DeleteBulkZonesRequest) (*DeleteBulkZonesResponse, error) {
338 logger := d.Log(ctx)
339 logger.Debug("DeleteBulkZones")
340
341 if err := params.Validate(); err != nil {
342 return nil, fmt.Errorf("%s: %w: %s", ErrDeleteBulkZones, ErrStructValidation, err)
343 }
344
345 bulkZonesURL := "/config-dns/v2/zones/delete-requests"
346 if params.BypassSafetyChecks != nil {
347 bulkZonesURL += fmt.Sprintf("?bypassSafetyChecks=%t", *params.BypassSafetyChecks)
348 }
349
350 req, err := http.NewRequestWithContext(ctx, http.MethodPost, bulkZonesURL, nil)
351 if err != nil {
352 return nil, fmt.Errorf("failed to create DeleteBulkZones request: %w", err)
353 }
354
355 var result DeleteBulkZonesResponse
356 resp, err := d.Exec(req, &result, params.ZonesList)
357 if err != nil {
358 return nil, fmt.Errorf("DeleteBulkZones request failed: %w", err)
359 }
360 defer session.CloseResponseBody(resp)
361
362 if resp.StatusCode != http.StatusCreated {
363 return nil, d.Error(resp)
364 }
365
366 return &result, nil
367 }
368