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