github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/policy_version_activation.go (about) 1 package cloudlets 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "fmt" 8 "net/http" 9 "net/url" 10 11 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 12 13 validation "github.com/go-ozzo/ozzo-validation/v4" 14 ) 15 16 type ( 17 // PolicyVersionActivations is a cloudlets PolicyVersionActivations API interface. 18 PolicyVersionActivations interface { 19 // ListPolicyActivations returns the complete activation history for the selected policy in reverse chronological order. 20 // 21 // See: https://techdocs.akamai.com/cloudlets/v2/reference/get-policy-activations 22 ListPolicyActivations(context.Context, ListPolicyActivationsRequest) ([]PolicyActivation, error) 23 24 // ActivatePolicyVersion activates the selected cloudlet policy version. 25 // 26 // See: https://techdocs.akamai.com/cloudlets/v2/reference/post-policy-version-activations 27 ActivatePolicyVersion(context.Context, ActivatePolicyVersionRequest) ([]PolicyActivation, error) 28 } 29 30 // ListPolicyActivationsRequest contains the request parameters for ListPolicyActivations 31 ListPolicyActivationsRequest struct { 32 PolicyID int64 33 Network PolicyActivationNetwork 34 PropertyName string 35 } 36 37 // ActivatePolicyVersionRequest contains the request parameters for ActivatePolicyVersion 38 ActivatePolicyVersionRequest struct { 39 PolicyID int64 40 Async bool 41 Version int64 42 PolicyVersionActivation 43 } 44 45 // PolicyVersionActivation is the body content for an ActivatePolicyVersion request 46 PolicyVersionActivation struct { 47 Network PolicyActivationNetwork `json:"network"` 48 AdditionalPropertyNames []string `json:"additionalPropertyNames,omitempty"` 49 } 50 51 // PolicyActivationNetwork is the activation network type for policy 52 PolicyActivationNetwork string 53 ) 54 55 var ( 56 // ErrListPolicyActivations is returned when ListPolicyActivations fails 57 ErrListPolicyActivations = errors.New("list policy activations") 58 // ErrActivatePolicyVersion is returned when ActivatePolicyVersion fails 59 ErrActivatePolicyVersion = errors.New("activate policy version") 60 ) 61 62 const ( 63 // PolicyActivationNetworkStaging is the staging network for policy 64 PolicyActivationNetworkStaging PolicyActivationNetwork = "staging" 65 // PolicyActivationNetworkProduction is the production network for policy 66 PolicyActivationNetworkProduction PolicyActivationNetwork = "prod" 67 ) 68 69 // Validate validates ListPolicyActivationsRequest 70 func (r ListPolicyActivationsRequest) Validate() error { 71 errs := validation.Errors{ 72 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 73 "Network": validation.Validate( 74 r.Network, 75 validation.In(PolicyActivationNetworkStaging, PolicyActivationNetworkProduction).Error( 76 fmt.Sprintf("value '%s' is invalid. Must be one of: 'staging', 'prod' or '' (empty)", (&r).Network)), 77 ), 78 } 79 return edgegriderr.ParseValidationErrors(errs) 80 } 81 82 // Validate validates ActivatePolicyVersionRequest 83 func (r ActivatePolicyVersionRequest) Validate() error { 84 errs := validation.Errors{ 85 "PolicyID": validation.Validate(r.PolicyID, validation.Required), 86 "Version": validation.Validate(r.Version, validation.Required), 87 "RequestBody.AdditionalPropertyNames": validation.Validate(r.PolicyVersionActivation.AdditionalPropertyNames, validation.Required), 88 "RequestBody.Network": validation.Validate( 89 r.PolicyVersionActivation.Network, 90 validation.Required, 91 validation.In(PolicyActivationNetworkStaging, PolicyActivationNetworkProduction).Error( 92 fmt.Sprintf("value '%s' is invalid. Must be one of: 'staging' or 'prod'", (&r).PolicyVersionActivation.Network)), 93 ), 94 } 95 return edgegriderr.ParseValidationErrors(errs) 96 } 97 98 // UnmarshalJSON unifies json network field into well defined values 99 func (n *PolicyActivationNetwork) UnmarshalJSON(data []byte) error { 100 d := bytes.Trim(data, "\"") 101 102 switch string(d) { 103 case "STAGING", "staging": 104 *n = PolicyActivationNetworkStaging 105 case "PRODUCTION", "production", "prod": 106 *n = PolicyActivationNetworkProduction 107 default: 108 return fmt.Errorf("cannot unmarshall PolicyActivationNetwork: %q", d) 109 } 110 return nil 111 } 112 113 func (c *cloudlets) ListPolicyActivations(ctx context.Context, params ListPolicyActivationsRequest) ([]PolicyActivation, error) { 114 c.Log(ctx).Debug("ListPolicyActivations") 115 116 if err := params.Validate(); err != nil { 117 return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicyActivations, ErrStructValidation, err) 118 } 119 120 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/policies/%d/activations", params.PolicyID)) 121 if err != nil { 122 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyActivations, err) 123 } 124 125 q := uri.Query() 126 if params.Network != "" { 127 q.Set("network", string(params.Network)) 128 } 129 if params.PropertyName != "" { 130 q.Set("propertyName", params.PropertyName) 131 } 132 uri.RawQuery = q.Encode() 133 134 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 135 if err != nil { 136 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyActivations, err) 137 } 138 139 var result []PolicyActivation 140 response, err := c.Exec(req, &result) 141 if err != nil { 142 return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyActivations, err) 143 } 144 145 if response.StatusCode != http.StatusOK { 146 return nil, fmt.Errorf("%s: %w", ErrListPolicyActivations, c.Error(response)) 147 } 148 149 return result, nil 150 } 151 152 func (c *cloudlets) ActivatePolicyVersion(ctx context.Context, params ActivatePolicyVersionRequest) ([]PolicyActivation, error) { 153 c.Log(ctx).Debug("ActivatePolicyVersion") 154 155 if err := params.Validate(); err != nil { 156 return nil, fmt.Errorf("%s: %w:\n%s", ErrActivatePolicyVersion, ErrStructValidation, err) 157 } 158 159 uri, err := url.Parse(fmt.Sprintf( 160 "/cloudlets/api/v2/policies/%d/versions/%d/activations", 161 params.PolicyID, params.Version)) 162 if err != nil { 163 return nil, fmt.Errorf("%w: failed to create POST URI: %s", ErrActivatePolicyVersion, err) 164 } 165 166 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil) 167 if err != nil { 168 return nil, fmt.Errorf("%w: failed to create POST request: %s", ErrActivatePolicyVersion, err) 169 } 170 171 var result []PolicyActivation 172 response, err := c.Exec(req, &result, params.PolicyVersionActivation) 173 if err != nil { 174 return nil, fmt.Errorf("%w: request failed: %s", ErrActivatePolicyVersion, err) 175 } 176 177 if response.StatusCode >= http.StatusBadRequest { 178 return nil, fmt.Errorf("%w: %s", ErrActivatePolicyVersion, c.Error(response)) 179 } 180 181 return result, nil 182 }