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