github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/v3/policy_activation.go (about) 1 package v3 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 "strconv" 10 "time" 11 12 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 13 validation "github.com/go-ozzo/ozzo-validation/v4" 14 ) 15 16 // ListPolicyActivationsRequest contains request parameters for ListPolicyActivations. 17 type ListPolicyActivationsRequest struct { 18 PolicyID int64 19 Page int 20 Size int 21 } 22 23 // GetPolicyActivationRequest contains request parameters for GetPolicyActivation. 24 type GetPolicyActivationRequest struct { 25 PolicyID int64 26 ActivationID int64 27 } 28 29 // ActivatePolicyRequest contains request parameters for ActivatePolicy. 30 type ActivatePolicyRequest struct { 31 PolicyID int64 32 Network Network 33 PolicyVersion int64 34 } 35 36 // DeactivatePolicyRequest contains request parameters for DeactivatePolicy. 37 type DeactivatePolicyRequest struct { 38 PolicyID int64 39 Network Network 40 PolicyVersion int64 41 } 42 43 type policyActivationRequest struct { 44 Operation PolicyActivationOperation `json:"operation"` 45 Network Network `json:"network"` 46 PolicyVersion int64 `json:"policyVersion"` 47 } 48 49 // PolicyActivation represents a single policy activation. 50 type PolicyActivation struct { 51 CreatedBy string `json:"createdBy"` 52 CreatedDate time.Time `json:"createdDate"` 53 FinishDate *time.Time `json:"finishDate"` 54 ID int64 `json:"id"` 55 Network Network `json:"network"` 56 Operation PolicyActivationOperation `json:"operation"` 57 PolicyID int64 `json:"policyId"` 58 Status ActivationStatus `json:"status"` 59 PolicyVersion int64 `json:"policyVersion"` 60 PolicyVersionDeleted bool `json:"policyVersionDeleted"` 61 Links []Link `json:"links"` 62 } 63 64 // PolicyActivations represents the response data from ListPolicyActivations. 65 type PolicyActivations struct { 66 Page Page `json:"page"` 67 PolicyActivations []PolicyActivation `json:"content"` 68 Links []Link `json:"links"` 69 } 70 71 // PolicyActivationOperation is an enum for policy activation operation 72 type PolicyActivationOperation string 73 74 const ( 75 // OperationActivation represents an operation used for activating a policy 76 OperationActivation PolicyActivationOperation = "ACTIVATION" 77 // OperationDeactivation represents an operation used for deactivating a policy 78 OperationDeactivation PolicyActivationOperation = "DEACTIVATION" 79 ) 80 81 // ActivationStatus represents information about policy activation status. 82 type ActivationStatus string 83 84 const ( 85 // ActivationStatusInProgress informs that activation is in progress. 86 ActivationStatusInProgress ActivationStatus = "IN_PROGRESS" 87 // ActivationStatusSuccess informs that activation succeeded. 88 ActivationStatusSuccess ActivationStatus = "SUCCESS" 89 // ActivationStatusFailed informs that activation failed. 90 ActivationStatusFailed ActivationStatus = "FAILED" 91 ) 92 93 // Network represents network on which policy version or property can be activated on. 94 type Network string 95 96 const ( 97 // StagingNetwork represents staging network. 98 StagingNetwork Network = "STAGING" 99 // ProductionNetwork represents production network. 100 ProductionNetwork Network = "PRODUCTION" 101 ) 102 103 var ( 104 // ErrListPolicyActivations is returned when ListPolicyActivations fails. 105 ErrListPolicyActivations = errors.New("list policy activations") 106 // ErrActivatePolicy is returned when ActivatePolicy fails. 107 ErrActivatePolicy = errors.New("activate policy") 108 // ErrDeactivatePolicy is returned when DeactivatePolicy fails. 109 ErrDeactivatePolicy = errors.New("deactivate policy") 110 // ErrGetPolicyActivation is returned when GetPolicyActivation fails. 111 ErrGetPolicyActivation = errors.New("get policy activation") 112 ) 113 114 // Validate validates ListPolicyActivationsRequest. 115 func (r ListPolicyActivationsRequest) Validate() error { 116 return edgegriderr.ParseValidationErrors(validation.Errors{ 117 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 118 "Page": validation.Validate(r.Page, validation.Min(0)), 119 "Size": validation.Validate(r.Size, validation.Min(10)), 120 }) 121 } 122 123 // Validate validates GetPolicyActivationRequest. 124 func (r GetPolicyActivationRequest) Validate() error { 125 return edgegriderr.ParseValidationErrors(validation.Errors{ 126 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 127 "ActivationID": validation.Validate(r.ActivationID, validation.Required), 128 }) 129 } 130 131 // Validate validates ActivatePolicyRequest. 132 func (r ActivatePolicyRequest) Validate() error { 133 return edgegriderr.ParseValidationErrors(validation.Errors{ 134 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 135 "PolicyVersion": validation.Validate(r.PolicyVersion, validation.Required), 136 "Network": validation.Validate(r.Network, validation.Required, validation.In(StagingNetwork, ProductionNetwork).Error( 137 fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", r.Network))), 138 }) 139 } 140 141 // Validate validates DeactivatePolicyRequest. 142 func (r DeactivatePolicyRequest) Validate() error { 143 return edgegriderr.ParseValidationErrors(validation.Errors{ 144 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 145 "PolicyVersion": validation.Validate(r.PolicyVersion, validation.Required), 146 "Network": validation.Validate(r.Network, validation.Required, validation.In(StagingNetwork, ProductionNetwork).Error( 147 fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", r.Network))), 148 }) 149 } 150 151 func (c *cloudlets) ListPolicyActivations(ctx context.Context, params ListPolicyActivationsRequest) (*PolicyActivations, error) { 152 c.Log(ctx).Debug("ListPolicyActivations") 153 154 if err := params.Validate(); err != nil { 155 return nil, fmt.Errorf("%s: %w: %s", ErrListPolicyActivations, ErrStructValidation, err) 156 } 157 158 uri, err := url.Parse(fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID)) 159 if err != nil { 160 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyActivations, err) 161 } 162 163 q := uri.Query() 164 if params.Size != 0 { 165 q.Add("size", strconv.Itoa(params.Size)) 166 } 167 if params.Page != 0 { 168 q.Add("page", strconv.Itoa(params.Page)) 169 } 170 uri.RawQuery = q.Encode() 171 172 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 173 if err != nil { 174 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyActivations, err) 175 } 176 177 var result PolicyActivations 178 resp, err := c.Exec(req, &result) 179 if err != nil { 180 return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyActivations, err) 181 } 182 183 if resp.StatusCode != http.StatusOK { 184 return nil, fmt.Errorf("%s: %w", ErrListPolicyActivations, c.Error(resp)) 185 } 186 187 return &result, nil 188 } 189 190 func (c *cloudlets) ActivatePolicy(ctx context.Context, params ActivatePolicyRequest) (*PolicyActivation, error) { 191 c.Log(ctx).Debug("ActivatePolicy") 192 193 if err := params.Validate(); err != nil { 194 return nil, fmt.Errorf("%s: %w: %s", ErrActivatePolicy, ErrStructValidation, err) 195 } 196 197 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID) 198 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 199 if err != nil { 200 return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivatePolicy, err) 201 } 202 203 reqBody := policyActivationRequest{ 204 Network: params.Network, 205 PolicyVersion: params.PolicyVersion, 206 Operation: OperationActivation, 207 } 208 209 var result PolicyActivation 210 resp, err := c.Exec(req, &result, reqBody) 211 if err != nil { 212 return nil, fmt.Errorf("%w: request failed: %s", ErrActivatePolicy, err) 213 } 214 215 if resp.StatusCode != http.StatusAccepted { 216 return nil, fmt.Errorf("%s: %w", ErrActivatePolicy, c.Error(resp)) 217 } 218 219 return &result, nil 220 } 221 222 func (c *cloudlets) DeactivatePolicy(ctx context.Context, params DeactivatePolicyRequest) (*PolicyActivation, error) { 223 c.Log(ctx).Debug("DeactivatePolicy") 224 225 if err := params.Validate(); err != nil { 226 return nil, fmt.Errorf("%s: %w: %s", ErrDeactivatePolicy, ErrStructValidation, err) 227 } 228 229 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations", params.PolicyID) 230 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 231 if err != nil { 232 return nil, fmt.Errorf("%w: failed to create request: %s", ErrDeactivatePolicy, err) 233 } 234 235 reqBody := policyActivationRequest{ 236 Network: params.Network, 237 PolicyVersion: params.PolicyVersion, 238 Operation: OperationDeactivation, 239 } 240 241 var result PolicyActivation 242 resp, err := c.Exec(req, &result, reqBody) 243 if err != nil { 244 return nil, fmt.Errorf("%w: request failed: %s", ErrDeactivatePolicy, err) 245 } 246 247 if resp.StatusCode != http.StatusAccepted { 248 return nil, fmt.Errorf("%s: %w", ErrDeactivatePolicy, c.Error(resp)) 249 } 250 251 return &result, nil 252 } 253 254 func (c *cloudlets) GetPolicyActivation(ctx context.Context, params GetPolicyActivationRequest) (*PolicyActivation, error) { 255 c.Log(ctx).Debug("GetPolicyActivation") 256 257 if err := params.Validate(); err != nil { 258 return nil, fmt.Errorf("%s: %w: %s", ErrGetPolicyActivation, ErrStructValidation, err) 259 } 260 261 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/activations/%d", params.PolicyID, params.ActivationID) 262 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 263 if err != nil { 264 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicyActivation, err) 265 } 266 267 var result PolicyActivation 268 resp, err := c.Exec(req, &result) 269 if err != nil { 270 return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicyActivation, err) 271 } 272 273 if resp.StatusCode != http.StatusOK { 274 return nil, fmt.Errorf("%s: %w", ErrGetPolicyActivation, c.Error(resp)) 275 } 276 277 return &result, nil 278 }