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 }