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  }