github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/edgeworkers/deactivations.go (about) 1 package edgeworkers 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 10 validation "github.com/go-ozzo/ozzo-validation/v4" 11 ) 12 13 type ( 14 // Deactivations is an EdgeWorkers deactivations API interface 15 Deactivations interface { 16 // ListDeactivations lists all deactivations for a given EdgeWorker ID 17 // 18 // See: https://techdocs.akamai.com/edgeworkers/reference/get-deactivations-1 19 ListDeactivations(context.Context, ListDeactivationsRequest) (*ListDeactivationsResponse, error) 20 21 // GetDeactivation gets details for a specific deactivation 22 // 23 // See: https://techdocs.akamai.com/edgeworkers/reference/get-deactivation-1 24 GetDeactivation(context.Context, GetDeactivationRequest) (*Deactivation, error) 25 26 // DeactivateVersion deactivates an existing EdgeWorker version on the akamai network 27 // 28 // See: https://techdocs.akamai.com/edgeworkers/reference/post-deactivations-1 29 DeactivateVersion(context.Context, DeactivateVersionRequest) (*Deactivation, error) 30 } 31 32 // Deactivation is the response returned by GetDeactivation, DeactivateVersion and ListDeactivation 33 Deactivation struct { 34 EdgeWorkerID int `json:"edgeWorkerId"` 35 Version string `json:"version"` 36 DeactivationID int `json:"deactivationId"` 37 AccountID string `json:"accountId"` 38 Status string `json:"status"` 39 Network ActivationNetwork `json:"network"` 40 Note string `json:"note,omitempty"` 41 CreatedBy string `json:"createdBy"` 42 CreatedTime string `json:"createdTime"` 43 LastModifiedTime string `json:"lastModifiedTime"` 44 } 45 46 // ListDeactivationsRequest describes the parameters for the list deactivations request 47 ListDeactivationsRequest struct { 48 EdgeWorkerID int 49 Version string 50 } 51 52 // DeactivateVersionRequest describes the request parameters for DeactivateVersion 53 DeactivateVersionRequest struct { 54 EdgeWorkerID int 55 DeactivateVersion 56 } 57 58 // GetDeactivationRequest describes the request parameters for GetDeactivation 59 GetDeactivationRequest struct { 60 EdgeWorkerID int 61 DeactivationID int 62 } 63 64 // DeactivateVersion represents the request body used to deactivate a version 65 DeactivateVersion struct { 66 Network ActivationNetwork `json:"network"` 67 Note string `json:"note,omitempty"` 68 Version string `json:"version"` 69 } 70 71 // ListDeactivationsResponse describes the list deactivations response 72 ListDeactivationsResponse struct { 73 Deactivations []Deactivation `json:"deactivations"` 74 } 75 ) 76 77 // Validate validates ListDeactivationsRequest 78 func (r *ListDeactivationsRequest) Validate() error { 79 return validation.Errors{ 80 "EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required), 81 }.Filter() 82 } 83 84 // Validate validates DeactivateVersionRequest 85 func (r *DeactivateVersionRequest) Validate() error { 86 return validation.Errors{ 87 "EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required), 88 "DeactivateVersion": validation.Validate(&r.DeactivateVersion), 89 }.Filter() 90 } 91 92 // Validate validates DeactivateVersion 93 func (r *DeactivateVersion) Validate() error { 94 return validation.Errors{ 95 "Network": validation.Validate(r.Network, validation.Required, validation.In( 96 ActivationNetworkProduction, ActivationNetworkStaging, 97 ).Error(fmt.Sprintf("value '%s' is invalid. Must be one of: '%s' or '%s'", 98 r.Network, ActivationNetworkStaging, ActivationNetworkProduction))), 99 "Version": validation.Validate(r.Version, validation.Required), 100 }.Filter() 101 } 102 103 // Validate validates GetDeactivationRequest 104 func (r *GetDeactivationRequest) Validate() error { 105 return validation.Errors{ 106 "EdgeWorkerID": validation.Validate(r.EdgeWorkerID, validation.Required), 107 "DeactivationID": validation.Validate(r.DeactivationID, validation.Required), 108 }.Filter() 109 } 110 111 var ( 112 // ErrListDeactivations is returned when ListDeactivations fails 113 ErrListDeactivations = errors.New("list deactivations") 114 // ErrDeactivateVersion is returned when DeactivateVersion fails 115 ErrDeactivateVersion = errors.New("deactivate version") 116 // ErrGetDeactivation is returned when GetDeactivation fails 117 ErrGetDeactivation = errors.New("get deactivation") 118 ) 119 120 func (e *edgeworkers) ListDeactivations(ctx context.Context, params ListDeactivationsRequest) (*ListDeactivationsResponse, error) { 121 logger := e.Log(ctx) 122 logger.Debug("ListDeactivations") 123 124 if err := params.Validate(); err != nil { 125 return nil, fmt.Errorf("%s: %w: %s", ErrListDeactivations, ErrStructValidation, err.Error()) 126 } 127 128 uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations", params.EdgeWorkerID)) 129 if err != nil { 130 return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrListDeactivations, err.Error()) 131 } 132 133 q := uri.Query() 134 if params.Version != "" { 135 q.Add("version", params.Version) 136 } 137 uri.RawQuery = q.Encode() 138 139 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 140 if err != nil { 141 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListDeactivations, err.Error()) 142 } 143 144 var result ListDeactivationsResponse 145 resp, err := e.Exec(req, &result) 146 if err != nil { 147 return nil, fmt.Errorf("%w: request failed: %s", ErrListDeactivations, err.Error()) 148 } 149 150 if resp.StatusCode != http.StatusOK { 151 return nil, fmt.Errorf("%s: %w", ErrListDeactivations, e.Error(resp)) 152 } 153 154 return &result, nil 155 } 156 157 func (e *edgeworkers) DeactivateVersion(ctx context.Context, params DeactivateVersionRequest) (*Deactivation, error) { 158 logger := e.Log(ctx) 159 logger.Debug("DeactivateVersion") 160 161 if err := params.Validate(); err != nil { 162 return nil, fmt.Errorf("%s: %w: %s", ErrDeactivateVersion, ErrStructValidation, err.Error()) 163 } 164 165 uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations", params.EdgeWorkerID)) 166 if err != nil { 167 return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrDeactivateVersion, err.Error()) 168 } 169 170 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil) 171 if err != nil { 172 return nil, fmt.Errorf("%w: failed to create request: %s", ErrDeactivateVersion, err.Error()) 173 } 174 175 var result Deactivation 176 resp, err := e.Exec(req, &result, params.DeactivateVersion) 177 if err != nil { 178 return nil, fmt.Errorf("%w: request failed: %s", ErrDeactivateVersion, err.Error()) 179 } 180 181 if resp.StatusCode != http.StatusCreated { 182 return nil, fmt.Errorf("%s: %w", ErrDeactivateVersion, e.Error(resp)) 183 } 184 185 return &result, nil 186 } 187 188 func (e *edgeworkers) GetDeactivation(ctx context.Context, params GetDeactivationRequest) (*Deactivation, error) { 189 logger := e.Log(ctx) 190 logger.Debug("GetDeactivation") 191 192 if err := params.Validate(); err != nil { 193 return nil, fmt.Errorf("%s: %w: %s", ErrGetDeactivation, ErrStructValidation, err.Error()) 194 } 195 196 uri, err := url.Parse(fmt.Sprintf("/edgeworkers/v1/ids/%d/deactivations/%d", params.EdgeWorkerID, params.DeactivationID)) 197 if err != nil { 198 return nil, fmt.Errorf("%w: failed to parse URL: %s", ErrGetDeactivation, err.Error()) 199 } 200 201 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 202 203 var result Deactivation 204 resp, err := e.Exec(req, &result) 205 if err != nil { 206 return nil, fmt.Errorf("%w: request failed: %s", ErrGetDeactivation, err.Error()) 207 } 208 209 if resp.StatusCode != http.StatusOK { 210 return nil, fmt.Errorf("%s: %w", ErrGetDeactivation, e.Error(resp)) 211 } 212 213 return &result, nil 214 }