github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/gtm/cidrmap.go (about)

     1  package gtm
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  )
     8  
     9  // CIDRMaps contains operations available on a CIDR map resource.
    10  type CIDRMaps interface {
    11  	// ListCIDRMaps retrieves all CIDRMaps.
    12  	//
    13  	// See: https://techdocs.akamai.com/gtm/reference/get-cidr-maps
    14  	ListCIDRMaps(context.Context, string) ([]*CIDRMap, error)
    15  	// GetCIDRMap retrieves a CIDRMap with the given name.
    16  	//
    17  	// See: https://techdocs.akamai.com/gtm/reference/get-cidr-map
    18  	GetCIDRMap(context.Context, string, string) (*CIDRMap, error)
    19  	// CreateCIDRMap creates the datacenter identified by the receiver argument in the specified domain.
    20  	//
    21  	// See: https://techdocs.akamai.com/gtm/reference/put-cidr-map
    22  	CreateCIDRMap(context.Context, *CIDRMap, string) (*CIDRMapResponse, error)
    23  	// DeleteCIDRMap deletes the datacenter identified by the receiver argument from the domain specified.
    24  	//
    25  	// See: https://techdocs.akamai.com/gtm/reference/delete-cidr-maps
    26  	DeleteCIDRMap(context.Context, *CIDRMap, string) (*ResponseStatus, error)
    27  	// UpdateCIDRMap updates the datacenter identified in the receiver argument in the provided domain.
    28  	//
    29  	// See: https://techdocs.akamai.com/gtm/reference/put-cidr-map
    30  	UpdateCIDRMap(context.Context, *CIDRMap, string) (*ResponseStatus, error)
    31  }
    32  
    33  // CIDRAssignment represents a GTM CIDR assignment element
    34  type CIDRAssignment struct {
    35  	DatacenterBase
    36  	Blocks []string `json:"blocks"`
    37  }
    38  
    39  // CIDRMap represents a GTM CIDRMap element
    40  type CIDRMap struct {
    41  	DefaultDatacenter *DatacenterBase   `json:"defaultDatacenter"`
    42  	Assignments       []*CIDRAssignment `json:"assignments,omitempty"`
    43  	Name              string            `json:"name"`
    44  	Links             []*Link           `json:"links,omitempty"`
    45  }
    46  
    47  // CIDRMapList represents a GTM returned CIDRMap list body
    48  type CIDRMapList struct {
    49  	CIDRMapItems []*CIDRMap `json:"items"`
    50  }
    51  
    52  // Validate validates CIDRMap
    53  func (c *CIDRMap) Validate() error {
    54  	if len(c.Name) < 1 {
    55  		return fmt.Errorf("CIDRMap is missing Name")
    56  	}
    57  	if c.DefaultDatacenter == nil {
    58  		return fmt.Errorf("CIDRMap is missing DefaultDatacenter")
    59  	}
    60  
    61  	return nil
    62  }
    63  
    64  func (g *gtm) ListCIDRMaps(ctx context.Context, domainName string) ([]*CIDRMap, error) {
    65  	logger := g.Log(ctx)
    66  	logger.Debug("ListCIDRMaps")
    67  
    68  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps", domainName)
    69  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
    70  	if err != nil {
    71  		return nil, fmt.Errorf("failed to create ListCIDRMaps request: %w", err)
    72  	}
    73  	setVersionHeader(req, schemaVersion)
    74  
    75  	var result CIDRMapList
    76  	resp, err := g.Exec(req, &result)
    77  	if err != nil {
    78  		return nil, fmt.Errorf("ListCIDRMaps request failed: %w", err)
    79  	}
    80  
    81  	if resp.StatusCode != http.StatusOK {
    82  		return nil, g.Error(resp)
    83  	}
    84  
    85  	return result.CIDRMapItems, nil
    86  }
    87  
    88  func (g *gtm) GetCIDRMap(ctx context.Context, mapName, domainName string) (*CIDRMap, error) {
    89  	logger := g.Log(ctx)
    90  	logger.Debug("GetCIDRMap")
    91  
    92  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, mapName)
    93  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
    94  	if err != nil {
    95  		return nil, fmt.Errorf("failed to create GetCIDRMap request: %w", err)
    96  	}
    97  	setVersionHeader(req, schemaVersion)
    98  
    99  	var result CIDRMap
   100  	resp, err := g.Exec(req, &result)
   101  	if err != nil {
   102  		return nil, fmt.Errorf("GetCIDRMap request failed: %w", err)
   103  	}
   104  
   105  	if resp.StatusCode != http.StatusOK {
   106  		return nil, g.Error(resp)
   107  	}
   108  
   109  	return &result, nil
   110  }
   111  
   112  func (g *gtm) CreateCIDRMap(ctx context.Context, cidr *CIDRMap, domainName string) (*CIDRMapResponse, error) {
   113  	logger := g.Log(ctx)
   114  	logger.Debug("CreateCIDRMap")
   115  
   116  	return cidr.save(ctx, g, domainName)
   117  }
   118  
   119  func (g *gtm) UpdateCIDRMap(ctx context.Context, cidr *CIDRMap, domainName string) (*ResponseStatus, error) {
   120  	logger := g.Log(ctx)
   121  	logger.Debug("UpdateCIDRMap")
   122  
   123  	stat, err := cidr.save(ctx, g, domainName)
   124  	if err != nil {
   125  		return nil, err
   126  	}
   127  	return stat.Status, err
   128  }
   129  
   130  // Save CIDRMap in given domain. Common path for Create and Update.
   131  func (c *CIDRMap) save(ctx context.Context, g *gtm, domainName string) (*CIDRMapResponse, error) {
   132  
   133  	if err := c.Validate(); err != nil {
   134  		return nil, fmt.Errorf("CIDRMap validation failed. %w", err)
   135  	}
   136  
   137  	putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, c.Name)
   138  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   139  	if err != nil {
   140  		return nil, fmt.Errorf("failed to create CIDRMap request: %w", err)
   141  	}
   142  	setVersionHeader(req, schemaVersion)
   143  
   144  	var result CIDRMapResponse
   145  	resp, err := g.Exec(req, &result, c)
   146  	if err != nil {
   147  		return nil, fmt.Errorf("CIDRMap request failed: %w", err)
   148  	}
   149  
   150  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   151  		return nil, g.Error(resp)
   152  	}
   153  
   154  	return &result, nil
   155  }
   156  
   157  func (g *gtm) DeleteCIDRMap(ctx context.Context, cidr *CIDRMap, domainName string) (*ResponseStatus, error) {
   158  	logger := g.Log(ctx)
   159  	logger.Debug("DeleteCIDRMap")
   160  
   161  	if err := cidr.Validate(); err != nil {
   162  		return nil, fmt.Errorf("CIDRMap validation failed. %w", err)
   163  	}
   164  
   165  	delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name)
   166  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil)
   167  	if err != nil {
   168  		return nil, fmt.Errorf("failed to create Delete request: %w", err)
   169  	}
   170  	setVersionHeader(req, schemaVersion)
   171  
   172  	var result ResponseBody
   173  	resp, err := g.Exec(req, &result)
   174  	if err != nil {
   175  		return nil, fmt.Errorf("CIDRMap request failed: %w", err)
   176  	}
   177  
   178  	if resp.StatusCode != http.StatusOK {
   179  		return nil, g.Error(resp)
   180  	}
   181  
   182  	return result.Status, nil
   183  }