github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cps/deployment_schedules.go (about)

     1  package cps
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  
     9  	validation "github.com/go-ozzo/ozzo-validation/v4"
    10  )
    11  
    12  type (
    13  	// DeploymentSchedules is a CPS deployment schedules API interface
    14  	DeploymentSchedules interface {
    15  		// GetDeploymentSchedule fetches the current deployment schedule settings describing when a change deploys to the network
    16  		//
    17  		// See: https://techdocs.akamai.com/cps/reference/get-change-deployment-schedule
    18  		GetDeploymentSchedule(context.Context, GetDeploymentScheduleRequest) (*DeploymentSchedule, error)
    19  
    20  		// UpdateDeploymentSchedule updates the current deployment schedule
    21  		//
    22  		// See: https://techdocs.akamai.com/cps/reference/put-change-deployment-schedule
    23  		UpdateDeploymentSchedule(context.Context, UpdateDeploymentScheduleRequest) (*UpdateDeploymentScheduleResponse, error)
    24  	}
    25  
    26  	// GetDeploymentScheduleRequest contains parameters for GetDeploymentSchedule
    27  	GetDeploymentScheduleRequest struct {
    28  		ChangeID     int
    29  		EnrollmentID int
    30  	}
    31  
    32  	// UpdateDeploymentScheduleRequest contains parameters for UpdateDeploymentSchedule
    33  	UpdateDeploymentScheduleRequest struct {
    34  		ChangeID     int
    35  		EnrollmentID int
    36  		DeploymentSchedule
    37  	}
    38  
    39  	// UpdateDeploymentScheduleResponse contains response for UpdateDeploymentSchedule
    40  	UpdateDeploymentScheduleResponse struct {
    41  		Change string `json:"change"`
    42  	}
    43  
    44  	// DeploymentSchedule contains the schedule for when you want this change deploy
    45  	DeploymentSchedule struct {
    46  		NotAfter  *string `json:"notAfter,omitempty"`
    47  		NotBefore *string `json:"notBefore,omitempty"`
    48  	}
    49  )
    50  
    51  // Validate validates GetDeploymentScheduleRequest
    52  func (c GetDeploymentScheduleRequest) Validate() error {
    53  	return validation.Errors{
    54  		"ChangeID":     validation.Validate(c.ChangeID, validation.Required),
    55  		"EnrollmentID": validation.Validate(c.EnrollmentID, validation.Required),
    56  	}.Filter()
    57  }
    58  
    59  // Validate validates UpdateDeploymentScheduleRequest
    60  func (c UpdateDeploymentScheduleRequest) Validate() error {
    61  	return validation.Errors{
    62  		"ChangeID":     validation.Validate(c.ChangeID, validation.Required),
    63  		"EnrollmentID": validation.Validate(c.EnrollmentID, validation.Required),
    64  	}.Filter()
    65  }
    66  
    67  var (
    68  	// ErrGetDeploymentSchedule is returned when GetDeploymentSchedule fails
    69  	ErrGetDeploymentSchedule = errors.New("get deployment schedule")
    70  	// ErrUpdateDeploymentSchedule is returned when UpdateDeploymentSchedule fails
    71  	ErrUpdateDeploymentSchedule = errors.New("update deployment schedule")
    72  )
    73  
    74  func (c *cps) GetDeploymentSchedule(ctx context.Context, params GetDeploymentScheduleRequest) (*DeploymentSchedule, error) {
    75  	logger := c.Log(ctx)
    76  	logger.Debug("GetDeploymentSchedule")
    77  
    78  	if err := params.Validate(); err != nil {
    79  		return nil, fmt.Errorf("%s: %w: %s", ErrGetDeploymentSchedule, ErrStructValidation, err)
    80  	}
    81  
    82  	uri := fmt.Sprintf("/cps/v2/enrollments/%d/changes/%d/deployment-schedule", params.EnrollmentID, params.ChangeID)
    83  
    84  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
    85  	if err != nil {
    86  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetDeploymentSchedule, err)
    87  	}
    88  	req.Header.Set("Accept", "application/vnd.akamai.cps.deployment-schedule.v1+json")
    89  
    90  	var result DeploymentSchedule
    91  	resp, err := c.Exec(req, &result)
    92  	if err != nil {
    93  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetDeploymentSchedule, err)
    94  	}
    95  
    96  	if resp.StatusCode != http.StatusOK {
    97  		return nil, fmt.Errorf("%s: %w", ErrGetDeploymentSchedule, c.Error(resp))
    98  	}
    99  
   100  	return &result, nil
   101  }
   102  
   103  func (c *cps) UpdateDeploymentSchedule(ctx context.Context, params UpdateDeploymentScheduleRequest) (*UpdateDeploymentScheduleResponse, error) {
   104  	logger := c.Log(ctx)
   105  	logger.Debug("UpdateDeploymentSchedule")
   106  
   107  	if err := params.Validate(); err != nil {
   108  		return nil, fmt.Errorf("%s: %w: %s", ErrUpdateDeploymentSchedule, ErrStructValidation, err)
   109  	}
   110  
   111  	uri := fmt.Sprintf("/cps/v2/enrollments/%d/changes/%d/deployment-schedule", params.EnrollmentID, params.ChangeID)
   112  
   113  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   114  	if err != nil {
   115  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdateDeploymentSchedule, err)
   116  	}
   117  	req.Header.Set("Accept", "application/vnd.akamai.cps.change-id.v1+json")
   118  	req.Header.Set("Content-Type", "application/vnd.akamai.cps.deployment-schedule.v1+json; charset=utf-8")
   119  
   120  	var result UpdateDeploymentScheduleResponse
   121  	resp, err := c.Exec(req, &result, params.DeploymentSchedule)
   122  	if err != nil {
   123  		return nil, fmt.Errorf("%w: request failed: %s", ErrUpdateDeploymentSchedule, err)
   124  	}
   125  
   126  	if resp.StatusCode != http.StatusOK {
   127  		return nil, fmt.Errorf("%s: %w", ErrUpdateDeploymentSchedule, c.Error(resp))
   128  	}
   129  
   130  	return &result, nil
   131  }