github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/configgtm/cidrmap.go (about) 1 package gtm 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 ) 8 9 // 10 // Handle Operations on gtm cidrmaps 11 // Based on 1.4 schema 12 // 13 14 // CidrMaps contains operations available on a Cidrmap resource 15 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html 16 type CidrMaps interface { 17 // NewCidrMap creates a new CidrMap object. 18 NewCidrMap(context.Context, string) *CidrMap 19 // Instantiate new Assignment struct 20 NewCidrAssignment(context.Context, *CidrMap, int, string) *CidrAssignment 21 // ListCidrMaps retreieves all CidrMaps 22 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getcidrmaps 23 ListCidrMaps(context.Context, string) ([]*CidrMap, error) 24 // GetCidrMap retrieves a CidrMap with the given name. 25 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getcidrmap 26 GetCidrMap(context.Context, string, string) (*CidrMap, error) 27 // Create the datacenter identified by the receiver argument in the specified domain. 28 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#putcidrmap 29 CreateCidrMap(context.Context, *CidrMap, string) (*CidrMapResponse, error) 30 // Delete the datacenter identified by the receiver argument from the domain specified. 31 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#deletecidrmap 32 DeleteCidrMap(context.Context, *CidrMap, string) (*ResponseStatus, error) 33 // Update the datacenter identified in the receiver argument in the provided domain. 34 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#putcidrmap 35 UpdateCidrMap(context.Context, *CidrMap, string) (*ResponseStatus, error) 36 } 37 38 //CidrAssignment represents a GTM cidr assignment element 39 type CidrAssignment struct { 40 DatacenterBase 41 Blocks []string `json:"blocks"` 42 } 43 44 // CidrMap represents a GTM cidrMap element 45 type CidrMap struct { 46 DefaultDatacenter *DatacenterBase `json:"defaultDatacenter"` 47 Assignments []*CidrAssignment `json:"assignments,omitempty"` 48 Name string `json:"name"` 49 Links []*Link `json:"links,omitempty"` 50 } 51 52 // CidrMapList represents a GTM returned cidrmap list body 53 type CidrMapList struct { 54 CidrMapItems []*CidrMap `json:"items"` 55 } 56 57 // Validate validates CidrMap 58 func (cidr *CidrMap) Validate() error { 59 if len(cidr.Name) < 1 { 60 return fmt.Errorf("CidrMap is missing Name") 61 } 62 if cidr.DefaultDatacenter == nil { 63 return fmt.Errorf("CidrMap is missing DefaultDatacenter") 64 } 65 66 return nil 67 } 68 69 // NewCidrMap creates a new CidrMap object 70 func (p *gtm) NewCidrMap(ctx context.Context, name string) *CidrMap { 71 72 logger := p.Log(ctx) 73 logger.Debug("NewCidrMap") 74 75 cidrmap := &CidrMap{Name: name} 76 return cidrmap 77 } 78 79 // ListCidrMaps retrieves all CidrMaps 80 func (p *gtm) ListCidrMaps(ctx context.Context, domainName string) ([]*CidrMap, error) { 81 82 logger := p.Log(ctx) 83 logger.Debug("ListCidrMaps") 84 85 var cidrs CidrMapList 86 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps", domainName) 87 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 88 if err != nil { 89 return nil, fmt.Errorf("failed to create ListCidrMaps request: %w", err) 90 } 91 setVersionHeader(req, schemaVersion) 92 resp, err := p.Exec(req, &cidrs) 93 if err != nil { 94 return nil, fmt.Errorf("ListCidrMaps request failed: %w", err) 95 } 96 97 if resp.StatusCode != http.StatusOK { 98 return nil, p.Error(resp) 99 } 100 101 return cidrs.CidrMapItems, nil 102 } 103 104 // GetCidrMap retrieves a CidrMap with the given name. 105 func (p *gtm) GetCidrMap(ctx context.Context, name, domainName string) (*CidrMap, error) { 106 107 logger := p.Log(ctx) 108 logger.Debug("GetCidrMap") 109 110 var cidr CidrMap 111 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, name) 112 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 113 if err != nil { 114 return nil, fmt.Errorf("failed to create GetCidrMap request: %w", err) 115 } 116 setVersionHeader(req, schemaVersion) 117 resp, err := p.Exec(req, &cidr) 118 if err != nil { 119 return nil, fmt.Errorf("GetCidrMap request failed: %w", err) 120 } 121 122 if resp.StatusCode != http.StatusOK { 123 return nil, p.Error(resp) 124 } 125 126 return &cidr, nil 127 } 128 129 // NewCidrAssignment instantiate new Assignment struct 130 func (p *gtm) NewCidrAssignment(ctx context.Context, _ *CidrMap, dcid int, nickname string) *CidrAssignment { 131 132 logger := p.Log(ctx) 133 logger.Debug("NewCidrAssignment") 134 135 cidrAssign := &CidrAssignment{} 136 cidrAssign.DatacenterId = dcid 137 cidrAssign.Nickname = nickname 138 139 return cidrAssign 140 } 141 142 // CreateCidrMap creates CidrMap in provided domain 143 func (p *gtm) CreateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*CidrMapResponse, error) { 144 145 logger := p.Log(ctx) 146 logger.Debug("CreateCidrMap") 147 148 // Use common code. Any specific validation needed? 149 return cidr.save(ctx, p, domainName) 150 } 151 152 // UpdateCidrMap updates CidrMap in given domain 153 func (p *gtm) UpdateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) { 154 155 logger := p.Log(ctx) 156 logger.Debug("UpdateCidrMap") 157 158 // common code 159 stat, err := cidr.save(ctx, p, domainName) 160 if err != nil { 161 return nil, err 162 } 163 return stat.Status, err 164 } 165 166 // save CidrMap in given domain. Common path for Create and Update. 167 func (cidr *CidrMap) save(ctx context.Context, p *gtm, domainName string) (*CidrMapResponse, error) { 168 169 if err := cidr.Validate(); err != nil { 170 return nil, fmt.Errorf("CidrMap validation failed. %w", err) 171 } 172 173 putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name) 174 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 175 if err != nil { 176 return nil, fmt.Errorf("failed to create AsMap request: %w", err) 177 } 178 179 var mapresp CidrMapResponse 180 setVersionHeader(req, schemaVersion) 181 resp, err := p.Exec(req, &mapresp, cidr) 182 if err != nil { 183 return nil, fmt.Errorf("CidrMap request failed: %w", err) 184 } 185 186 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 187 return nil, p.Error(resp) 188 } 189 190 return &mapresp, nil 191 } 192 193 // DeleteCidrMap deletes CidrMap in provided domain 194 func (p *gtm) DeleteCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) { 195 196 logger := p.Log(ctx) 197 logger.Debug("DeleteCidrMap") 198 199 if err := cidr.Validate(); err != nil { 200 logger.Errorf("CidrMap validation failed. %w", err) 201 return nil, fmt.Errorf("CidrMap validation failed. %w", err) 202 } 203 204 delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name) 205 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil) 206 if err != nil { 207 return nil, fmt.Errorf("failed to create Delete request: %w", err) 208 } 209 210 var mapresp ResponseBody 211 setVersionHeader(req, schemaVersion) 212 resp, err := p.Exec(req, &mapresp) 213 if err != nil { 214 return nil, fmt.Errorf("CidrMap request failed: %w", err) 215 } 216 217 if resp.StatusCode != http.StatusOK { 218 return nil, p.Error(resp) 219 } 220 221 return mapresp.Status, nil 222 }