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  }