github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/networklists/network_list.go (about) 1 package networklists 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "net/url" 8 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // The NetworkList interface supports creating, retrieving, modifying and removing network lists. 14 // 15 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#networklist 16 NetworkList interface { 17 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#getlists 18 GetNetworkLists(ctx context.Context, params GetNetworkListsRequest) (*GetNetworkListsResponse, error) 19 20 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#getlist 21 GetNetworkList(ctx context.Context, params GetNetworkListRequest) (*GetNetworkListResponse, error) 22 23 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#postlists 24 CreateNetworkList(ctx context.Context, params CreateNetworkListRequest) (*CreateNetworkListResponse, error) 25 26 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#putlist 27 UpdateNetworkList(ctx context.Context, params UpdateNetworkListRequest) (*UpdateNetworkListResponse, error) 28 29 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#deletelist 30 RemoveNetworkList(ctx context.Context, params RemoveNetworkListRequest) (*RemoveNetworkListResponse, error) 31 } 32 33 // GetNetworkListRequest contains request parameters for GetNetworkList method 34 GetNetworkListRequest struct { 35 UniqueID string `json:"-"` 36 } 37 38 // GetNetworkListsRequest contains request parameters for GetNetworkLists method 39 GetNetworkListsRequest struct { 40 Name string `json:"name"` 41 Type string `json:"type"` 42 } 43 44 // GetNetworkListsResponse contains response from GetNetworkLists method 45 GetNetworkListsResponse struct { 46 Links *NetworkListsResponseLinks `json:"links,omitempty"` 47 NetworkLists []GetNetworkListsResponseListElement `json:"networkLists"` 48 } 49 50 // GetNetworkListsResponseListElement contains information about a single network list 51 GetNetworkListsResponseListElement struct { 52 ElementCount int `json:"elementCount"` 53 Links *NetworkListsLinks `json:"links,omitempty"` 54 Name string `json:"name"` 55 NetworkListType string `json:"networkListType"` 56 ReadOnly bool `json:"readOnly"` 57 Shared bool `json:"shared"` 58 SyncPoint int `json:"syncPoint"` 59 Type string `json:"type"` 60 UniqueID string `json:"uniqueId"` 61 AccessControlGroup string `json:"accessControlGroup,omitempty"` 62 Description string `json:"description,omitempty"` 63 } 64 65 // GetNetworkListResponse contains response from GetNetworkList method 66 GetNetworkListResponse struct { 67 Name string `json:"name"` 68 UniqueID string `json:"uniqueId"` 69 ContractID string `json:"contractId"` 70 GroupID int `json:"groupId"` 71 SyncPoint int `json:"syncPoint"` 72 Type string `json:"type"` 73 Description string `json:"description,omitempty"` 74 NetworkListType string `json:"networkListType"` 75 ElementCount int `json:"elementCount"` 76 ReadOnly bool `json:"readOnly"` 77 Shared bool `json:"shared"` 78 List []string `json:"list"` 79 Links struct { 80 ActivateInProduction struct { 81 Href string `json:"href"` 82 Method string `json:"method"` 83 } `json:"activateInProduction"` 84 ActivateInStaging struct { 85 Href string `json:"href"` 86 Method string `json:"method"` 87 } `json:"activateInStaging"` 88 AppendItems struct { 89 Href string `json:"href"` 90 Method string `json:"method"` 91 } `json:"appendItems"` 92 Retrieve struct { 93 Href string `json:"href"` 94 } `json:"retrieve"` 95 StatusInProduction struct { 96 Href string `json:"href"` 97 } `json:"statusInProduction"` 98 StatusInStaging struct { 99 Href string `json:"href"` 100 } `json:"statusInStaging"` 101 Update struct { 102 Href string `json:"href"` 103 Method string `json:"method"` 104 } `json:"update"` 105 } `json:"links"` 106 } 107 108 // CreateNetworkListRequest contains request parameters for CreateNetworkList method 109 CreateNetworkListRequest struct { 110 Name string `json:"name"` 111 Type string `json:"type"` 112 Description string `json:"description"` 113 ContractID string `json:"contractId,omitempty"` 114 GroupID int `json:"groupId,omitempty"` 115 List []string `json:"list"` 116 } 117 118 // UpdateNetworkListRequest contains request parameters for CreateNetworkLists method 119 UpdateNetworkListRequest struct { 120 Name string `json:"name"` 121 Type string `json:"type"` 122 Description string `json:"description"` 123 ContractID string `json:"contractId,omitempty"` 124 GroupID int `json:"groupId,omitempty"` 125 SyncPoint int `json:"syncPoint"` 126 List []string `json:"list"` 127 UniqueID string `json:"uniqueId"` 128 } 129 130 // UpdateNetworkListResponse contains response from CreateNetworkList method 131 UpdateNetworkListResponse struct { 132 Links struct { 133 Create struct { 134 Href string `json:"href"` 135 Method string `json:"method"` 136 } `json:"create"` 137 } `json:"links"` 138 NetworkLists []struct { 139 ElementCount int `json:"elementCount"` 140 Links struct { 141 ActivateInProduction struct { 142 Href string `json:"href"` 143 Method string `json:"method"` 144 } `json:"activateInProduction"` 145 ActivateInStaging struct { 146 Href string `json:"href"` 147 Method string `json:"method"` 148 } `json:"activateInStaging"` 149 AppendItems struct { 150 Href string `json:"href"` 151 Method string `json:"method"` 152 } `json:"appendItems"` 153 Retrieve struct { 154 Href string `json:"href"` 155 } `json:"retrieve"` 156 StatusInProduction struct { 157 Href string `json:"href"` 158 } `json:"statusInProduction"` 159 StatusInStaging struct { 160 Href string `json:"href"` 161 } `json:"statusInStaging"` 162 Update struct { 163 Href string `json:"href"` 164 Method string `json:"method"` 165 } `json:"update"` 166 } `json:"links"` 167 Name string `json:"name"` 168 NetworkListType string `json:"networkListType"` 169 ReadOnly bool `json:"readOnly"` 170 Shared bool `json:"shared"` 171 SyncPoint int `json:"syncPoint"` 172 Type string `json:"type"` 173 UniqueID string `json:"uniqueId"` 174 AccessControlGroup string `json:"accessControlGroup,omitempty"` 175 Description string `json:"description,omitempty"` 176 } `json:"networkLists"` 177 } 178 179 // RemoveNetworkListRequest contains request parameters for RemoveNetworkList method 180 RemoveNetworkListRequest struct { 181 UniqueID string `json:"-"` 182 } 183 184 // RemoveNetworkListResponse contains response from RemoveNetworkList method 185 RemoveNetworkListResponse struct { 186 Status int `json:"status"` 187 UniqueID string `json:"uniqueId"` 188 SyncPoint int `json:"syncPoint"` 189 } 190 191 // CreateNetworkListResponse contains response from CreateNetworkList method 192 CreateNetworkListResponse struct { 193 Name string `json:"name"` 194 Description string `json:"description,omitempty"` 195 UniqueID string `json:"uniqueId"` 196 SyncPoint int `json:"syncPoint"` 197 Type string `json:"type"` 198 NetworkListType string `json:"networkListType"` 199 ElementCount int `json:"elementCount"` 200 ReadOnly bool `json:"readOnly"` 201 Shared bool `json:"shared"` 202 List []string `json:"list"` 203 Links struct { 204 ActivateInProduction struct { 205 Href string `json:"href"` 206 Method string `json:"method"` 207 } `json:"activateInProduction"` 208 ActivateInStaging struct { 209 Href string `json:"href"` 210 Method string `json:"method"` 211 } `json:"activateInStaging"` 212 AppendItems struct { 213 Href string `json:"href"` 214 Method string `json:"method"` 215 } `json:"appendItems"` 216 Retrieve struct { 217 Href string `json:"href"` 218 } `json:"retrieve"` 219 StatusInProduction struct { 220 Href string `json:"href"` 221 } `json:"statusInProduction"` 222 StatusInStaging struct { 223 Href string `json:"href"` 224 } `json:"statusInStaging"` 225 Update struct { 226 Href string `json:"href"` 227 Method string `json:"method"` 228 } `json:"update"` 229 } `json:"links"` 230 } 231 232 // LinkInfo contains hypermedia link 233 LinkInfo struct { 234 Href string `json:"href,omitempty"` 235 Method string `json:"method,omitempty"` 236 } 237 238 // nolint:revive 239 // NetworkListsResponseLinks contains LinkInfo 240 NetworkListsResponseLinks struct { 241 Create *LinkInfo `json:"create,omitempty"` 242 } 243 244 // nolint:revive 245 // NetworkListsLinks encapsulates the set of API hypermedia 246 NetworkListsLinks struct { 247 ActivateInProduction *LinkInfo `json:"activateInProduction,omitempty"` 248 ActivateInStaging *LinkInfo `json:"activateInStaging,omitempty"` 249 AppendItems *LinkInfo `json:"appendItems,omitempty"` 250 Retrieve *LinkInfo `json:"retrieve,omitempty"` 251 StatusInProduction *LinkInfo `json:"statusInProduction,omitempty"` 252 StatusInStaging *LinkInfo `json:"statusInStaging,omitempty"` 253 Update *LinkInfo `json:"update,omitempty"` 254 } 255 ) 256 257 // Validate validates GetNetworkListRequest 258 func (v GetNetworkListRequest) Validate() error { 259 return validation.Errors{ 260 "UniqueID": validation.Validate(v.UniqueID, validation.Required), 261 }.Filter() 262 } 263 264 // Validate validates CreateNetworkListRequest 265 func (v CreateNetworkListRequest) Validate() error { 266 return validation.Errors{ 267 "Name": validation.Validate(v.Name, validation.Required), 268 }.Filter() 269 } 270 271 // Validate validates UpdateNetworkListRequest 272 func (v UpdateNetworkListRequest) Validate() error { 273 return validation.Errors{ 274 "Name": validation.Validate(v.Name, validation.Required), 275 }.Filter() 276 } 277 278 // Validate validates RemoveNetworkListRequest 279 func (v RemoveNetworkListRequest) Validate() error { 280 return validation.Errors{ 281 "UniqueID": validation.Validate(v.UniqueID, validation.Required), 282 }.Filter() 283 } 284 285 func (p *networklists) GetNetworkList(ctx context.Context, params GetNetworkListRequest) (*GetNetworkListResponse, error) { 286 if err := params.Validate(); err != nil { 287 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 288 } 289 290 logger := p.Log(ctx) 291 logger.Debug("GetNetworkList") 292 293 var rval GetNetworkListResponse 294 295 uri := fmt.Sprintf( 296 "/network-list/v2/network-lists/%s", 297 params.UniqueID) 298 299 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 300 if err != nil { 301 return nil, fmt.Errorf("failed to create getnetworklist request: %s", err.Error()) 302 } 303 304 resp, err := p.Exec(req, &rval) 305 if err != nil { 306 return nil, fmt.Errorf("getnetworklist request failed: %s", err.Error()) 307 } 308 309 if resp.StatusCode != http.StatusOK { 310 return nil, p.Error(resp) 311 } 312 313 return &rval, nil 314 315 } 316 317 func (p *networklists) GetNetworkLists(ctx context.Context, params GetNetworkListsRequest) (*GetNetworkListsResponse, error) { 318 319 logger := p.Log(ctx) 320 logger.Debug("GetNetworkLists") 321 322 var rval GetNetworkListsResponse 323 var rvalfiltered GetNetworkListsResponse 324 325 uri := 326 "/network-list/v2/network-lists" 327 328 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 329 if err != nil { 330 return nil, fmt.Errorf("failed to create getnetworklists request: %s", err.Error()) 331 } 332 333 resp, err := p.Exec(req, &rval) 334 if err != nil { 335 return nil, fmt.Errorf("getnetworklists request failed: %s", err.Error()) 336 } 337 338 if resp.StatusCode != http.StatusOK { 339 return nil, p.Error(resp) 340 } 341 342 if params.Name == "" && params.Type == "" { 343 return &rval, nil 344 } 345 346 rvalfiltered.Links = rval.Links 347 for _, val := range rval.NetworkLists { 348 if (params.Name == "" || params.Name == val.Name) && (params.Type == "" || params.Type == val.Type) { 349 rvalfiltered.NetworkLists = append(rvalfiltered.NetworkLists, val) 350 } 351 } 352 353 return &rvalfiltered, nil 354 } 355 356 // Update will update a NetworkList. 357 // 358 // API Docs: // network_lists v2 359 // 360 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#putnetworklist 361 362 func (p *networklists) UpdateNetworkList(ctx context.Context, params UpdateNetworkListRequest) (*UpdateNetworkListResponse, error) { 363 if err := params.Validate(); err != nil { 364 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 365 } 366 367 logger := p.Log(ctx) 368 logger.Debug("UpdateNetworkList") 369 370 putURL := fmt.Sprintf( 371 "/network-list/v2/network-lists/%s", 372 params.UniqueID, 373 ) 374 375 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 376 if err != nil { 377 return nil, fmt.Errorf("failed to create update NetworkListrequest: %s", err.Error()) 378 } 379 380 var rval UpdateNetworkListResponse 381 resp, err := p.Exec(req, &rval, params) 382 if err != nil { 383 return nil, fmt.Errorf("update NetworkList request failed: %s", err.Error()) 384 } 385 386 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 387 return nil, p.Error(resp) 388 } 389 390 return &rval, nil 391 } 392 393 // Create will create a new networklist. 394 // 395 // 396 // API Docs: // network_lists v2 397 // 398 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#postnetworklist 399 func (p *networklists) CreateNetworkList(ctx context.Context, params CreateNetworkListRequest) (*CreateNetworkListResponse, error) { 400 if err := params.Validate(); err != nil { 401 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 402 } 403 404 logger := p.Log(ctx) 405 logger.Debug("CreateNetworkList") 406 407 uri := 408 "/network-list/v2/network-lists" 409 410 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 411 if err != nil { 412 return nil, fmt.Errorf("failed to create create networklist request: %s", err.Error()) 413 } 414 415 var rval CreateNetworkListResponse 416 417 resp, err := p.Exec(req, &rval, params) 418 if err != nil { 419 return nil, fmt.Errorf("create networklistrequest failed: %s", err.Error()) 420 } 421 422 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 423 return nil, p.Error(resp) 424 } 425 426 return &rval, nil 427 428 } 429 430 // Delete will delete a NetworkList 431 // 432 // 433 // API Docs: // network_lists v2 434 // 435 // https://developer.akamai.com/api/cloud_security/network_lists/v2.html#deletenetworklist 436 437 func (p *networklists) RemoveNetworkList(ctx context.Context, params RemoveNetworkListRequest) (*RemoveNetworkListResponse, error) { 438 if err := params.Validate(); err != nil { 439 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 440 } 441 442 var rval RemoveNetworkListResponse 443 444 logger := p.Log(ctx) 445 logger.Debug("RemoveNetworkList") 446 447 uri, err := url.Parse(fmt.Sprintf( 448 "/network-list/v2/network-lists/%s", 449 params.UniqueID), 450 ) 451 if err != nil { 452 return nil, fmt.Errorf("failed to parse url: %s", err.Error()) 453 } 454 455 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri.String(), nil) 456 if err != nil { 457 return nil, fmt.Errorf("failed to create RemoveNetworkList request: %s", err.Error()) 458 } 459 460 resp, err := p.Exec(req, &rval) 461 if err != nil { 462 return nil, fmt.Errorf("RemoveNetworkList request failed: %s", err.Error()) 463 } 464 465 if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { 466 return nil, p.Error(resp) 467 } 468 469 return &rval, nil 470 }