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