github.com/akamai/AkamaiOPEN-edgegrid-golang@v1.2.2/configgtm-v1_5/datacenter.go (about) 1 package configgtm 2 3 import ( 4 "errors" 5 "fmt" 6 "strconv" 7 "strings" 8 9 "github.com/akamai/AkamaiOPEN-edgegrid-golang/client-v1" 10 ) 11 12 // 13 // Handle Operations on gtm datacenters 14 // Based on 1.5 schema 15 // 16 17 // Datacenter represents a GTM datacenter 18 type Datacenter struct { 19 City string `json:"city,omitempty"` 20 CloneOf int `json:"cloneOf,omitempty"` 21 CloudServerHostHeaderOverride bool `json:"cloudServerHostHeaderOverride"` 22 CloudServerTargeting bool `json:"cloudServerTargeting"` 23 Continent string `json:"continent,omitempty"` 24 Country string `json:"country,omitempty"` 25 DefaultLoadObject *LoadObject `json:"defaultLoadObject,omitempty"` 26 Latitude float64 `json:"latitude,omitempty"` 27 Links []*Link `json:"links,omitempty"` 28 Longitude float64 `json:"longitude,omitempty"` 29 Nickname string `json:"nickname,omitempty"` 30 PingInterval int `json:"pingInterval,omitempty"` 31 PingPacketSize int `json:"pingPacketSize,omitempty"` 32 DatacenterId int `json:"datacenterId,omitempty"` 33 ScorePenalty int `json:"scorePenalty,omitempty"` 34 ServermonitorLivenessCount int `json:"servermonitorLivenessCount,omitempty"` 35 ServermonitorLoadCount int `json:"servermonitorLoadCount,omitempty"` 36 ServermonitorPool string `json:"servermonitorPool,omitempty"` 37 StateOrProvince string `json:"stateOrProvince,omitempty"` 38 Virtual bool `json:"virtual"` 39 } 40 41 type DatacenterList struct { 42 DatacenterItems []*Datacenter `json:"items"` 43 } 44 45 // NewDatacenterResponse instantiates a new DatacenterResponse structure 46 func NewDatacenterResponse() *DatacenterResponse { 47 dcResp := &DatacenterResponse{} 48 return dcResp 49 } 50 51 // NewDatacenter creates a new Datacenter object 52 func NewDatacenter() *Datacenter { 53 dc := &Datacenter{} 54 return dc 55 } 56 57 // ListDatacenters retreieves all Datacenters 58 func ListDatacenters(domainName string) ([]*Datacenter, error) { 59 dcs := &DatacenterList{} 60 req, err := client.NewRequest( 61 Config, 62 "GET", 63 fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters", domainName), 64 nil, 65 ) 66 if err != nil { 67 return nil, err 68 } 69 70 setVersionHeader(req, schemaVersion) 71 72 printHttpRequest(req, true) 73 74 res, err := client.Do(Config, req) 75 if err != nil { 76 return nil, err 77 } 78 79 printHttpResponse(res, true) 80 81 if client.IsError(res) && res.StatusCode != 404 { 82 return nil, client.NewAPIError(res) 83 } else if res.StatusCode == 404 { 84 return nil, CommonError{entityName: "Datacenter"} 85 } else { 86 err = client.BodyJSON(res, dcs) 87 if err != nil { 88 return nil, err 89 } 90 91 return dcs.DatacenterItems, nil 92 } 93 } 94 95 // GetDatacenter retrieves a Datacenter with the given name. NOTE: Id arg is int! 96 func GetDatacenter(dcID int, domainName string) (*Datacenter, error) { 97 98 dc := NewDatacenter() 99 req, err := client.NewRequest( 100 Config, 101 "GET", 102 fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters/%s", domainName, strconv.Itoa(dcID)), 103 nil, 104 ) 105 if err != nil { 106 return nil, err 107 } 108 109 setVersionHeader(req, schemaVersion) 110 111 printHttpRequest(req, true) 112 113 res, err := client.Do(Config, req) 114 if err != nil { 115 return nil, err 116 } 117 118 printHttpRequest(req, true) 119 120 if client.IsError(res) && res.StatusCode != 404 { 121 return nil, client.NewAPIError(res) 122 } else if res.StatusCode == 404 { 123 return nil, CommonError{entityName: "Datacenter", name: strconv.Itoa(dcID)} 124 } else { 125 err = client.BodyJSON(res, dc) 126 if err != nil { 127 return nil, err 128 } 129 130 return dc, nil 131 } 132 } 133 134 // Create the datacenter identified by the receiver argument in the specified domain. 135 func (dc *Datacenter) Create(domainName string) (*DatacenterResponse, error) { 136 137 req, err := client.NewJSONRequest( 138 Config, 139 "POST", 140 fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters", domainName), 141 dc, 142 ) 143 if err != nil { 144 return nil, err 145 } 146 147 setVersionHeader(req, schemaVersion) 148 149 printHttpRequest(req, true) 150 151 res, err := client.Do(Config, req) 152 153 // Network 154 if err != nil { 155 return nil, CommonError{ 156 entityName: "Domain", 157 name: domainName, 158 httpErrorMessage: err.Error(), 159 err: err, 160 } 161 } 162 163 printHttpResponse(res, true) 164 165 // API error 166 if client.IsError(res) { 167 err := client.NewAPIError(res) 168 return nil, CommonError{entityName: "Domain", name: domainName, apiErrorMessage: err.Detail, err: err} 169 } 170 171 responseBody := NewDatacenterResponse() 172 // Unmarshall whole response body for updated DC and in case want status 173 err = client.BodyJSON(res, responseBody) 174 if err != nil { 175 return nil, err 176 } 177 178 return responseBody, nil 179 180 } 181 182 var MapDefaultDC int = 5400 183 var Ipv4DefaultDC int = 5401 184 var Ipv6DefaultDC int = 5402 185 186 // Create Default Datacenter for Maps 187 func CreateMapsDefaultDatacenter(domainName string) (*Datacenter, error) { 188 189 return createDefaultDC(MapDefaultDC, domainName) 190 191 } 192 193 // Create Default Datacenter for IPv4 Selector 194 func CreateIPv4DefaultDatacenter(domainName string) (*Datacenter, error) { 195 196 return createDefaultDC(Ipv4DefaultDC, domainName) 197 198 } 199 200 // Create Default Datacenter for IPv6 Selector 201 func CreateIPv6DefaultDatacenter(domainName string) (*Datacenter, error) { 202 203 return createDefaultDC(Ipv6DefaultDC, domainName) 204 205 } 206 207 // Worker function to create Default Datacenter identified id in the specified domain. 208 func createDefaultDC(defaultID int, domainName string) (*Datacenter, error) { 209 210 if defaultID != MapDefaultDC && defaultID != Ipv4DefaultDC && defaultID != Ipv6DefaultDC { 211 return nil, errors.New("Invalid default datacenter id provided for creation") 212 } 213 // check if already exists 214 dc, err := GetDatacenter(defaultID, domainName) 215 if err == nil { 216 return dc, err 217 } else { 218 if !strings.Contains(err.Error(), "not found") || !strings.Contains(err.Error(), "Datacenter") { 219 return nil, err 220 } 221 } 222 defaultURL := fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters/", domainName) 223 switch defaultID { 224 case MapDefaultDC: 225 defaultURL += "default-datacenter-for-maps" 226 case Ipv4DefaultDC: 227 defaultURL += "datacenter-for-ip-version-selector-ipv4" 228 case Ipv6DefaultDC: 229 defaultURL += "datacenter-for-ip-version-selector-ipv6" 230 } 231 req, err := client.NewJSONRequest( 232 Config, 233 "POST", 234 defaultURL, 235 "", 236 ) 237 if err != nil { 238 return nil, err 239 } 240 setVersionHeader(req, schemaVersion) 241 printHttpRequest(req, true) 242 res, err := client.Do(Config, req) 243 // Network 244 if err != nil { 245 return nil, CommonError{ 246 entityName: "Domain", 247 name: domainName, 248 httpErrorMessage: err.Error(), 249 err: err, 250 } 251 } 252 printHttpResponse(res, true) 253 // API error 254 if client.IsError(res) { 255 err := client.NewAPIError(res) 256 return nil, CommonError{entityName: "Domain", name: domainName, apiErrorMessage: err.Detail, err: err} 257 } 258 responseBody := NewDatacenterResponse() 259 // Unmarshall whole response body for updated DC and in case want status 260 err = client.BodyJSON(res, responseBody) 261 if err != nil { 262 return nil, err 263 } 264 265 return responseBody.Resource, nil 266 267 } 268 269 // Update the datacenter identified in the receiver argument in the provided domain. 270 func (dc *Datacenter) Update(domainName string) (*ResponseStatus, error) { 271 272 req, err := client.NewJSONRequest( 273 Config, 274 "PUT", 275 fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters/%s", domainName, strconv.Itoa(dc.DatacenterId)), 276 dc, 277 ) 278 if err != nil { 279 return nil, err 280 } 281 282 setVersionHeader(req, schemaVersion) 283 284 printHttpRequest(req, true) 285 286 res, err := client.Do(Config, req) 287 288 // Network error 289 if err != nil { 290 return nil, CommonError{ 291 entityName: "Datacenter", 292 name: strconv.Itoa(dc.DatacenterId), 293 httpErrorMessage: err.Error(), 294 err: err, 295 } 296 } 297 298 printHttpResponse(res, true) 299 300 // API error 301 if client.IsError(res) { 302 err := client.NewAPIError(res) 303 return nil, CommonError{entityName: "Datacenter", name: strconv.Itoa(dc.DatacenterId), apiErrorMessage: err.Detail, err: err} 304 } 305 306 responseBody := NewDatacenterResponse() 307 // Unmarshall whole response body for updated entity and in case want status 308 err = client.BodyJSON(res, responseBody) 309 if err != nil { 310 return nil, err 311 } 312 313 return responseBody.Status, nil 314 } 315 316 // Delete the datacenter identified by the receiver argument from the domain specified. 317 func (dc *Datacenter) Delete(domainName string) (*ResponseStatus, error) { 318 319 req, err := client.NewRequest( 320 Config, 321 "DELETE", 322 fmt.Sprintf("/config-gtm/v1/domains/%s/datacenters/%s", domainName, strconv.Itoa(dc.DatacenterId)), 323 nil, 324 ) 325 if err != nil { 326 return nil, err 327 } 328 329 setVersionHeader(req, schemaVersion) 330 331 printHttpRequest(req, true) 332 333 res, err := client.Do(Config, req) 334 if err != nil { 335 return nil, err 336 } 337 338 // Network error 339 if err != nil { 340 return nil, CommonError{ 341 entityName: "Datacenter", 342 name: strconv.Itoa(dc.DatacenterId), 343 httpErrorMessage: err.Error(), 344 err: err, 345 } 346 } 347 348 printHttpResponse(res, true) 349 350 // API error 351 if client.IsError(res) { 352 err := client.NewAPIError(res) 353 return nil, CommonError{entityName: "Datacenter", name: strconv.Itoa(dc.DatacenterId), apiErrorMessage: err.Detail, err: err} 354 } 355 356 responseBody := NewDatacenterResponse() 357 // Unmarshall whole response body in case want status 358 err = client.BodyJSON(res, responseBody) 359 if err != nil { 360 return nil, err 361 } 362 363 return responseBody.Status, nil 364 }