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  }