github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/configgtm/cidrmap.go (about)

     1  package gtm
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  )
     8  
     9  //
    10  // Handle Operations on gtm cidrmaps
    11  // Based on 1.4 schema
    12  //
    13  
    14  // CidrMaps contains operations available on a Cidrmap resource
    15  // See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html
    16  type CidrMaps interface {
    17  	// NewCidrMap creates a new CidrMap object.
    18  	NewCidrMap(context.Context, string) *CidrMap
    19  	// Instantiate new Assignment struct
    20  	NewCidrAssignment(context.Context, *CidrMap, int, string) *CidrAssignment
    21  	// ListCidrMaps retreieves all CidrMaps
    22  	// See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getcidrmaps
    23  	ListCidrMaps(context.Context, string) ([]*CidrMap, error)
    24  	// GetCidrMap retrieves a CidrMap with the given name.
    25  	// See: https://developer.akamai.com/api/web_performance/global_traffic_management/v1.html#getcidrmap
    26  	GetCidrMap(context.Context, string, string) (*CidrMap, 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#putcidrmap
    29  	CreateCidrMap(context.Context, *CidrMap, string) (*CidrMapResponse, 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#deletecidrmap
    32  	DeleteCidrMap(context.Context, *CidrMap, 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#putcidrmap
    35  	UpdateCidrMap(context.Context, *CidrMap, string) (*ResponseStatus, error)
    36  }
    37  
    38  //CidrAssignment represents a GTM cidr assignment element
    39  type CidrAssignment struct {
    40  	DatacenterBase
    41  	Blocks []string `json:"blocks"`
    42  }
    43  
    44  // CidrMap  represents a GTM cidrMap element
    45  type CidrMap struct {
    46  	DefaultDatacenter *DatacenterBase   `json:"defaultDatacenter"`
    47  	Assignments       []*CidrAssignment `json:"assignments,omitempty"`
    48  	Name              string            `json:"name"`
    49  	Links             []*Link           `json:"links,omitempty"`
    50  }
    51  
    52  // CidrMapList represents a GTM returned cidrmap list body
    53  type CidrMapList struct {
    54  	CidrMapItems []*CidrMap `json:"items"`
    55  }
    56  
    57  // Validate validates CidrMap
    58  func (cidr *CidrMap) Validate() error {
    59  	if len(cidr.Name) < 1 {
    60  		return fmt.Errorf("CidrMap is missing Name")
    61  	}
    62  	if cidr.DefaultDatacenter == nil {
    63  		return fmt.Errorf("CidrMap is missing DefaultDatacenter")
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  // NewCidrMap creates a new CidrMap object
    70  func (p *gtm) NewCidrMap(ctx context.Context, name string) *CidrMap {
    71  
    72  	logger := p.Log(ctx)
    73  	logger.Debug("NewCidrMap")
    74  
    75  	cidrmap := &CidrMap{Name: name}
    76  	return cidrmap
    77  }
    78  
    79  // ListCidrMaps retrieves all CidrMaps
    80  func (p *gtm) ListCidrMaps(ctx context.Context, domainName string) ([]*CidrMap, error) {
    81  
    82  	logger := p.Log(ctx)
    83  	logger.Debug("ListCidrMaps")
    84  
    85  	var cidrs CidrMapList
    86  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps", domainName)
    87  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
    88  	if err != nil {
    89  		return nil, fmt.Errorf("failed to create ListCidrMaps request: %w", err)
    90  	}
    91  	setVersionHeader(req, schemaVersion)
    92  	resp, err := p.Exec(req, &cidrs)
    93  	if err != nil {
    94  		return nil, fmt.Errorf("ListCidrMaps request failed: %w", err)
    95  	}
    96  
    97  	if resp.StatusCode != http.StatusOK {
    98  		return nil, p.Error(resp)
    99  	}
   100  
   101  	return cidrs.CidrMapItems, nil
   102  }
   103  
   104  // GetCidrMap retrieves a CidrMap with the given name.
   105  func (p *gtm) GetCidrMap(ctx context.Context, name, domainName string) (*CidrMap, error) {
   106  
   107  	logger := p.Log(ctx)
   108  	logger.Debug("GetCidrMap")
   109  
   110  	var cidr CidrMap
   111  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, name)
   112  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
   113  	if err != nil {
   114  		return nil, fmt.Errorf("failed to create GetCidrMap request: %w", err)
   115  	}
   116  	setVersionHeader(req, schemaVersion)
   117  	resp, err := p.Exec(req, &cidr)
   118  	if err != nil {
   119  		return nil, fmt.Errorf("GetCidrMap request failed: %w", err)
   120  	}
   121  
   122  	if resp.StatusCode != http.StatusOK {
   123  		return nil, p.Error(resp)
   124  	}
   125  
   126  	return &cidr, nil
   127  }
   128  
   129  // NewCidrAssignment instantiate new Assignment struct
   130  func (p *gtm) NewCidrAssignment(ctx context.Context, _ *CidrMap, dcid int, nickname string) *CidrAssignment {
   131  
   132  	logger := p.Log(ctx)
   133  	logger.Debug("NewCidrAssignment")
   134  
   135  	cidrAssign := &CidrAssignment{}
   136  	cidrAssign.DatacenterId = dcid
   137  	cidrAssign.Nickname = nickname
   138  
   139  	return cidrAssign
   140  }
   141  
   142  // CreateCidrMap creates CidrMap in provided domain
   143  func (p *gtm) CreateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*CidrMapResponse, error) {
   144  
   145  	logger := p.Log(ctx)
   146  	logger.Debug("CreateCidrMap")
   147  
   148  	// Use common code. Any specific validation needed?
   149  	return cidr.save(ctx, p, domainName)
   150  }
   151  
   152  // UpdateCidrMap updates CidrMap in given domain
   153  func (p *gtm) UpdateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) {
   154  
   155  	logger := p.Log(ctx)
   156  	logger.Debug("UpdateCidrMap")
   157  
   158  	// common code
   159  	stat, err := cidr.save(ctx, p, domainName)
   160  	if err != nil {
   161  		return nil, err
   162  	}
   163  	return stat.Status, err
   164  }
   165  
   166  // save CidrMap in given domain. Common path for Create and Update.
   167  func (cidr *CidrMap) save(ctx context.Context, p *gtm, domainName string) (*CidrMapResponse, error) {
   168  
   169  	if err := cidr.Validate(); err != nil {
   170  		return nil, fmt.Errorf("CidrMap validation failed. %w", err)
   171  	}
   172  
   173  	putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name)
   174  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   175  	if err != nil {
   176  		return nil, fmt.Errorf("failed to create AsMap request: %w", err)
   177  	}
   178  
   179  	var mapresp CidrMapResponse
   180  	setVersionHeader(req, schemaVersion)
   181  	resp, err := p.Exec(req, &mapresp, cidr)
   182  	if err != nil {
   183  		return nil, fmt.Errorf("CidrMap request failed: %w", err)
   184  	}
   185  
   186  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   187  		return nil, p.Error(resp)
   188  	}
   189  
   190  	return &mapresp, nil
   191  }
   192  
   193  // DeleteCidrMap deletes CidrMap in provided domain
   194  func (p *gtm) DeleteCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) {
   195  
   196  	logger := p.Log(ctx)
   197  	logger.Debug("DeleteCidrMap")
   198  
   199  	if err := cidr.Validate(); err != nil {
   200  		logger.Errorf("CidrMap validation failed. %w", err)
   201  		return nil, fmt.Errorf("CidrMap validation failed. %w", err)
   202  	}
   203  
   204  	delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.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("CidrMap 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  }