github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/configgtm/asmap.go (about) 1 package gtm 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 ) 8 9 // 10 // Handle Operations on gtm asmaps 11 // Based on 1.4 schema 12 // 13 14 // ASMaps contains operations available on a ASmap resource 15 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html 16 type ASMaps interface { 17 // NewAsMap creates a new AsMap object. 18 NewAsMap(context.Context, string) *AsMap 19 // Instantiate new Assignment struct 20 NewASAssignment(context.Context, *AsMap, int, string) *AsAssignment 21 // ListAsMaps retreieves all AsMaps 22 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getasmaps 23 ListAsMaps(context.Context, string) ([]*AsMap, error) 24 // GetAsMap retrieves a AsMap with the given name. 25 // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getasmap 26 GetAsMap(context.Context, string, string) (*AsMap, 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#putasmap 29 CreateAsMap(context.Context, *AsMap, string) (*AsMapResponse, 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#deleteasmap 32 DeleteAsMap(context.Context, *AsMap, 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#putasmap 35 UpdateAsMap(context.Context, *AsMap, string) (*ResponseStatus, error) 36 } 37 38 // AsAssignment represents a GTM asmap assignment structure 39 type AsAssignment struct { 40 DatacenterBase 41 AsNumbers []int64 `json:"asNumbers"` 42 } 43 44 // AsMap represents a GTM AsMap 45 type AsMap struct { 46 DefaultDatacenter *DatacenterBase `json:"defaultDatacenter"` 47 Assignments []*AsAssignment `json:"assignments,omitempty"` 48 Name string `json:"name"` 49 Links []*Link `json:"links,omitempty"` 50 } 51 52 // AsMapList represents the returned GTM AsMap List body 53 type AsMapList struct { 54 AsMapItems []*AsMap `json:"items"` 55 } 56 57 // Validate validates AsMap 58 func (asm *AsMap) Validate() error { 59 60 if len(asm.Name) < 1 { 61 return fmt.Errorf("AsMap is missing Name") 62 } 63 if asm.DefaultDatacenter == nil { 64 return fmt.Errorf("AsMap is missing DefaultDatacenter") 65 } 66 67 return nil 68 } 69 70 // NewAsMap creates a new asMap 71 func (p *gtm) NewAsMap(ctx context.Context, name string) *AsMap { 72 73 logger := p.Log(ctx) 74 logger.Debug("NewAsMap") 75 76 asmap := &AsMap{Name: name} 77 return asmap 78 } 79 80 // ListAsMaps retreieves all AsMaps 81 func (p *gtm) ListAsMaps(ctx context.Context, domainName string) ([]*AsMap, error) { 82 83 logger := p.Log(ctx) 84 logger.Debug("ListAsMaps") 85 86 var aslist AsMapList 87 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/as-maps", domainName) 88 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 89 if err != nil { 90 return nil, fmt.Errorf("failed to create ListAsMaps request: %w", err) 91 } 92 setVersionHeader(req, schemaVersion) 93 resp, err := p.Exec(req, &aslist) 94 if err != nil { 95 return nil, fmt.Errorf("ListAsMaps request failed: %w", err) 96 } 97 98 if resp.StatusCode != http.StatusOK { 99 return nil, p.Error(resp) 100 } 101 102 return aslist.AsMapItems, nil 103 } 104 105 // GetAsMap retrieves a asMap with the given name. 106 func (p *gtm) GetAsMap(ctx context.Context, name, domainName string) (*AsMap, error) { 107 108 logger := p.Log(ctx) 109 logger.Debug("GetAsMap") 110 111 var as AsMap 112 getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/as-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 GetAsMap request: %w", err) 116 } 117 setVersionHeader(req, schemaVersion) 118 resp, err := p.Exec(req, &as) 119 if err != nil { 120 return nil, fmt.Errorf("GetAsMap request failed: %w", err) 121 } 122 123 if resp.StatusCode != http.StatusOK { 124 return nil, p.Error(resp) 125 } 126 127 return &as, nil 128 } 129 130 // Instantiate new Assignment struct 131 func (p *gtm) NewASAssignment(ctx context.Context, _ *AsMap, dcID int, nickname string) *AsAssignment { 132 133 logger := p.Log(ctx) 134 logger.Debug("NewAssignment") 135 136 asAssign := &AsAssignment{} 137 asAssign.DatacenterId = dcID 138 asAssign.Nickname = nickname 139 140 return asAssign 141 } 142 143 // Create asMap in provided domain 144 func (p *gtm) CreateAsMap(ctx context.Context, as *AsMap, domainName string) (*AsMapResponse, error) { 145 146 logger := p.Log(ctx) 147 logger.Debug("CreateAsMap") 148 149 // Use common code. Any specific validation needed? 150 return as.save(ctx, p, domainName) 151 } 152 153 // Update AsMap in given domain 154 func (p *gtm) UpdateAsMap(ctx context.Context, as *AsMap, domainName string) (*ResponseStatus, error) { 155 156 logger := p.Log(ctx) 157 logger.Debug("UpdateAsMap") 158 159 // common code 160 stat, err := as.save(ctx, p, domainName) 161 if err != nil { 162 return nil, err 163 } 164 return stat.Status, err 165 } 166 167 // Save AsMap in given domain. Common path for Create and Update. 168 func (asm *AsMap) save(ctx context.Context, p *gtm, domainName string) (*AsMapResponse, error) { 169 170 if err := asm.Validate(); err != nil { 171 return nil, fmt.Errorf("AsMap validation failed. %w", err) 172 } 173 174 putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/as-maps/%s", domainName, asm.Name) 175 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 176 if err != nil { 177 return nil, fmt.Errorf("failed to create AsMap request: %w", err) 178 } 179 180 var mapresp AsMapResponse 181 setVersionHeader(req, schemaVersion) 182 resp, err := p.Exec(req, &mapresp, asm) 183 if err != nil { 184 return nil, fmt.Errorf("AsMap 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 AsMap method 195 func (p *gtm) DeleteAsMap(ctx context.Context, as *AsMap, domainName string) (*ResponseStatus, error) { 196 197 logger := p.Log(ctx) 198 logger.Debug("DeleteAsMap") 199 200 if err := as.Validate(); err != nil { 201 return nil, fmt.Errorf("Resource validation failed. %w", err) 202 } 203 204 delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/as-maps/%s", domainName, as.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("AsMap 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 }