github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/imaging/policyset.go (about) 1 package imaging 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 10 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 11 12 validation "github.com/go-ozzo/ozzo-validation/v4" 13 ) 14 15 type ( 16 // PolicySets is an Image and Video Manager API interface for PolicySets 17 // 18 // See: https://techdocs.akamai.com/ivm/reference/api 19 PolicySets interface { 20 // ListPolicySets lists all PolicySets of specified type for the current account 21 ListPolicySets(context.Context, ListPolicySetsRequest) ([]PolicySet, error) 22 23 // GetPolicySet gets specific PolicySet by PolicySetID 24 GetPolicySet(context.Context, GetPolicySetRequest) (*PolicySet, error) 25 26 // CreatePolicySet creates configuration for an PolicySet 27 CreatePolicySet(context.Context, CreatePolicySetRequest) (*PolicySet, error) 28 29 // UpdatePolicySet creates configuration for an PolicySet 30 UpdatePolicySet(context.Context, UpdatePolicySetRequest) (*PolicySet, error) 31 32 // DeletePolicySet deletes configuration for an PolicySet 33 DeletePolicySet(context.Context, DeletePolicySetRequest) error 34 } 35 36 // ListPolicySetsRequest describes the parameters of the ListPolicySets request 37 ListPolicySetsRequest struct { 38 ContractID string 39 Network Network 40 } 41 42 // GetPolicySetRequest describes the parameters of the get GetPolicySet request 43 GetPolicySetRequest struct { 44 PolicySetID string 45 ContractID string 46 Network Network 47 } 48 49 // CreatePolicySet describes the body of the CreatePolicySet request 50 CreatePolicySet struct { 51 Name string `json:"name"` 52 Region Region `json:"region"` 53 Type MediaType `json:"type"` 54 DefaultPolicy PolicyInput `json:"defaultPolicy,omitempty"` 55 } 56 57 // CreatePolicySetRequest describes the parameters of the CreatePolicySet request 58 CreatePolicySetRequest struct { 59 ContractID string 60 CreatePolicySet 61 } 62 63 // UpdatePolicySet describes the body of the UpdatePolicySet request 64 UpdatePolicySet struct { 65 Name string `json:"name"` 66 Region Region `json:"region"` 67 } 68 69 // UpdatePolicySetRequest describes the parameters of the UpdatePolicySet request 70 UpdatePolicySetRequest struct { 71 PolicySetID string 72 ContractID string 73 UpdatePolicySet 74 } 75 76 // PolicySet is a response returned by CRU operations 77 PolicySet struct { 78 ID string `json:"id"` 79 Name string `json:"name"` 80 Region Region `json:"region"` 81 Type string `json:"type"` 82 User string `json:"user"` 83 Properties []string `json:"properties"` 84 LastModified string `json:"lastModified"` 85 } 86 87 // DeletePolicySetRequest describes the parameters of the delete PolicySet request 88 DeletePolicySetRequest struct { 89 PolicySetID string 90 ContractID string 91 } 92 93 // MediaType of media this Policy Set manages 94 MediaType string 95 96 // Network represents the network where policy set is stored 97 Network string 98 99 // Region represents the geographic region which media using this Policy Set is optimized for 100 Region string 101 ) 102 103 const ( 104 // RegionUS represents US region 105 RegionUS Region = "US" 106 // RegionEMEA represents EMEA region 107 RegionEMEA Region = "EMEA" 108 // RegionAsia represents Asia region 109 RegionAsia Region = "ASIA" 110 // RegionAustralia represents Australia region 111 RegionAustralia Region = "AUSTRALIA" 112 // RegionJapan represents Japan region 113 RegionJapan Region = "JAPAN" 114 // RegionChina represents China region 115 RegionChina Region = "CHINA" 116 ) 117 118 const ( 119 // TypeImage represents policy set for Images 120 TypeImage MediaType = "IMAGE" 121 // TypeVideo represents policy set for Videos 122 TypeVideo MediaType = "VIDEO" 123 ) 124 125 const ( 126 // NetworkStaging represents staging network 127 NetworkStaging Network = "staging" 128 // NetworkProduction represents production network 129 NetworkProduction Network = "production" 130 // NetworkBoth represent both staging and production network at the same time 131 NetworkBoth Network = "" 132 ) 133 134 var ( 135 // ErrListPolicySets is returned when ListPolicySets fails 136 ErrListPolicySets = errors.New("list policy sets") 137 // ErrGetPolicySet is returned when GetPolicySet fails 138 ErrGetPolicySet = errors.New("get policy set") 139 // ErrCreatePolicySet is returned when CreatePolicySet fails 140 ErrCreatePolicySet = errors.New("create policy set") 141 // ErrUpdatePolicySet is returned when UpdatePolicySet fails 142 ErrUpdatePolicySet = errors.New("update policy set") 143 // ErrDeletePolicySet is returned when DeletePolicySet fails 144 ErrDeletePolicySet = errors.New("delete policy set") 145 ) 146 147 // Validate validates ListPolicySetsRequest 148 func (v ListPolicySetsRequest) Validate() error { 149 errs := validation.Errors{ 150 "ContractID": validation.Validate(v.ContractID, validation.Required), 151 "Network": validation.Validate(v.Network, validation.In(NetworkStaging, NetworkProduction, NetworkBoth). 152 Error(fmt.Sprintf("network has to be '%s', '%s' or empty for both networks at the same time", NetworkStaging, NetworkProduction))), 153 } 154 return edgegriderr.ParseValidationErrors(errs) 155 } 156 157 // Validate validates GetPolicySetRequest 158 func (v GetPolicySetRequest) Validate() error { 159 errs := validation.Errors{ 160 "PolicySetID": validation.Validate(v.PolicySetID, validation.Required), 161 "ContractID": validation.Validate(v.ContractID, validation.Required), 162 "Network": validation.Validate(v.Network, validation.In(NetworkStaging, NetworkProduction, NetworkBoth). 163 Error(fmt.Sprintf("network has to be '%s', '%s' or empty for both networks at the same time", NetworkStaging, NetworkProduction))), 164 } 165 return edgegriderr.ParseValidationErrors(errs) 166 } 167 168 // Validate validates CreatePolicySetRequest 169 func (v CreatePolicySetRequest) Validate() error { 170 errs := validation.Errors{ 171 "ContractID": validation.Validate(v.ContractID, validation.Required), 172 "Name": validation.Validate(v.Name, validation.Required), 173 "Region": validation.Validate(v.Region, validation.Required, validation.In(RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina).Error( 174 fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s', '%s', '%s', '%s', '%s'", v.Region, RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina))), 175 "Type": validation.Validate(v.Type, validation.Required, validation.In(TypeImage, TypeVideo).Error( 176 fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s'", v.Type, TypeImage, TypeVideo))), 177 "DefaultPolicy": validation.Validate(v.DefaultPolicy), 178 } 179 return edgegriderr.ParseValidationErrors(errs) 180 } 181 182 // Validate validates UpdatePolicySetRequest 183 func (v UpdatePolicySetRequest) Validate() error { 184 errs := validation.Errors{ 185 "ContractID": validation.Validate(v.ContractID, validation.Required), 186 "Name": validation.Validate(v.Name, validation.Required), 187 "Region": validation.Validate(v.Region, validation.Required, validation.In(RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina).Error( 188 fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s', '%s', '%s', '%s', '%s'", v.Region, RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina))), 189 } 190 return edgegriderr.ParseValidationErrors(errs) 191 } 192 193 // Validate validates DeletePolicySetRequest 194 func (v DeletePolicySetRequest) Validate() error { 195 errs := validation.Errors{ 196 "PolicySetID": validation.Validate(v.PolicySetID, validation.Required), 197 "ContractID": validation.Validate(v.ContractID, validation.Required), 198 } 199 return edgegriderr.ParseValidationErrors(errs) 200 } 201 202 func (i *imaging) ListPolicySets(ctx context.Context, params ListPolicySetsRequest) ([]PolicySet, error) { 203 logger := i.Log(ctx) 204 logger.Debug("ListPolicySets") 205 206 if err := params.Validate(); err != nil { 207 return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicySets, ErrStructValidation, err) 208 } 209 210 var uri *url.URL 211 var err error 212 if params.Network != NetworkBoth { 213 uri, err = url.Parse(fmt.Sprintf("/imaging/v2/network/%s/policysets/", params.Network)) 214 } else { 215 uri, err = url.Parse("/imaging/v2/policysets/") 216 } 217 if err != nil { 218 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicySets, err) 219 } 220 221 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 222 if err != nil { 223 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicySets, err) 224 } 225 226 req.Header.Set("Contract", params.ContractID) 227 228 var result []PolicySet 229 resp, err := i.Exec(req, &result) 230 if err != nil { 231 return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicySets, err) 232 } 233 234 if resp.StatusCode != http.StatusOK { 235 return nil, fmt.Errorf("%s: %w", ErrListPolicySets, i.Error(resp)) 236 } 237 238 return result, nil 239 } 240 241 func (i *imaging) GetPolicySet(ctx context.Context, params GetPolicySetRequest) (*PolicySet, error) { 242 logger := i.Log(ctx) 243 logger.Debug("GetPolicySet") 244 245 if err := params.Validate(); err != nil { 246 return nil, fmt.Errorf("%s: %w:\n%s", ErrGetPolicySet, ErrStructValidation, err) 247 } 248 249 var uri *url.URL 250 var err error 251 if params.Network != NetworkBoth { 252 uri, err = url.Parse(fmt.Sprintf("/imaging/v2/network/%s/policysets/%s", params.Network, params.PolicySetID)) 253 } else { 254 uri, err = url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID)) 255 } 256 if err != nil { 257 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetPolicySet, err) 258 } 259 260 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 261 if err != nil { 262 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicySet, err) 263 } 264 265 req.Header.Set("Contract", params.ContractID) 266 267 var result PolicySet 268 resp, err := i.Exec(req, &result) 269 if err != nil { 270 return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicySet, err) 271 } 272 273 if resp.StatusCode != http.StatusOK { 274 return nil, fmt.Errorf("%s: %w", ErrGetPolicySet, i.Error(resp)) 275 } 276 277 return &result, nil 278 } 279 280 func (i *imaging) CreatePolicySet(ctx context.Context, params CreatePolicySetRequest) (*PolicySet, error) { 281 logger := i.Log(ctx) 282 logger.Debug("CreatePolicySet") 283 284 if err := params.Validate(); err != nil { 285 return nil, fmt.Errorf("%s: %w:\n%s", ErrCreatePolicySet, ErrStructValidation, err) 286 } 287 288 uri := "/imaging/v2/policysets/" 289 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 290 if err != nil { 291 return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreatePolicySet, err) 292 } 293 294 req.Header.Set("Contract", params.ContractID) 295 296 var result PolicySet 297 resp, err := i.Exec(req, &result, params.CreatePolicySet) 298 if err != nil { 299 return nil, fmt.Errorf("%w: request failed: %s", ErrCreatePolicySet, err) 300 } 301 302 if resp.StatusCode != http.StatusCreated { 303 return nil, fmt.Errorf("%s: %w", ErrCreatePolicySet, i.Error(resp)) 304 } 305 306 return &result, nil 307 } 308 309 func (i *imaging) UpdatePolicySet(ctx context.Context, params UpdatePolicySetRequest) (*PolicySet, error) { 310 logger := i.Log(ctx) 311 logger.Debug("UpdatePolicySet") 312 313 if err := params.Validate(); err != nil { 314 return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdatePolicySet, ErrStructValidation, err) 315 } 316 317 uri, err := url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID)) 318 if err != nil { 319 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrUpdatePolicySet, err) 320 } 321 322 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri.String(), nil) 323 if err != nil { 324 return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdatePolicySet, err) 325 } 326 327 req.Header.Set("Contract", params.ContractID) 328 329 var result PolicySet 330 331 resp, err := i.Exec(req, &result, params.UpdatePolicySet) 332 if err != nil { 333 return nil, fmt.Errorf("%w: request failed: %s", ErrUpdatePolicySet, err) 334 } 335 336 if resp.StatusCode != http.StatusOK { 337 return nil, fmt.Errorf("%s: %w", ErrUpdatePolicySet, i.Error(resp)) 338 } 339 340 return &result, nil 341 } 342 343 func (i *imaging) DeletePolicySet(ctx context.Context, params DeletePolicySetRequest) error { 344 logger := i.Log(ctx) 345 logger.Debug("DeletePolicySet") 346 347 if err := params.Validate(); err != nil { 348 return fmt.Errorf("%s: %w:\n%s", ErrDeletePolicySet, ErrStructValidation, err) 349 } 350 351 uri, err := url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID)) 352 if err != nil { 353 return fmt.Errorf("%w: failed to parse url: %s", ErrDeletePolicySet, err) 354 } 355 356 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri.String(), nil) 357 if err != nil { 358 return fmt.Errorf("%w: failed to create request: %s", ErrDeletePolicySet, err) 359 } 360 361 req.Header.Set("Contract", params.ContractID) 362 363 resp, err := i.Exec(req, nil) 364 if err != nil { 365 return fmt.Errorf("%w: request failed: %s", ErrDeletePolicySet, err) 366 } 367 368 if resp.StatusCode != http.StatusNoContent { 369 return fmt.Errorf("%s: %w", ErrDeletePolicySet, i.Error(resp)) 370 } 371 372 return nil 373 }