github.com/akamai/AkamaiOPEN-edgegrid-golang/v4@v4.1.0/pkg/gtm/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  type CidrMaps interface {
    16  	// NewCidrMap creates a new CidrMap object.
    17  	NewCidrMap(context.Context, string) *CidrMap
    18  	// NewCidrAssignment instantiates new Assignment struct.
    19  	NewCidrAssignment(context.Context, *CidrMap, int, string) *CidrAssignment
    20  	// ListCidrMaps retreieves all CidrMaps.
    21  	//
    22  	// See: https://techdocs.akamai.com/gtm/reference/get-cidr-maps
    23  	ListCidrMaps(context.Context, string) ([]*CidrMap, error)
    24  	// GetCidrMap retrieves a CidrMap with the given name.
    25  	//
    26  	// See: https://techdocs.akamai.com/gtm/reference/get-cidr-map
    27  	GetCidrMap(context.Context, string, string) (*CidrMap, error)
    28  	// CreateCidrMap creates the datacenter identified by the receiver argument in the specified domain.
    29  	//
    30  	// See: https://techdocs.akamai.com/gtm/reference/put-cidr-map
    31  	CreateCidrMap(context.Context, *CidrMap, string) (*CidrMapResponse, error)
    32  	// DeleteCidrMap deletes the datacenter identified by the receiver argument from the domain specified.
    33  	//
    34  	// See: https://techdocs.akamai.com/gtm/reference/delete-cidr-maps
    35  	DeleteCidrMap(context.Context, *CidrMap, string) (*ResponseStatus, error)
    36  	// UpdateCidrMap updates the datacenter identified in the receiver argument in the provided domain.
    37  	//
    38  	// See: https://techdocs.akamai.com/gtm/reference/put-cidr-map
    39  	UpdateCidrMap(context.Context, *CidrMap, string) (*ResponseStatus, error)
    40  }
    41  
    42  // CidrAssignment represents a GTM cidr assignment element
    43  type CidrAssignment struct {
    44  	DatacenterBase
    45  	Blocks []string `json:"blocks"`
    46  }
    47  
    48  // CidrMap  represents a GTM cidrMap element
    49  type CidrMap struct {
    50  	DefaultDatacenter *DatacenterBase   `json:"defaultDatacenter"`
    51  	Assignments       []*CidrAssignment `json:"assignments,omitempty"`
    52  	Name              string            `json:"name"`
    53  	Links             []*Link           `json:"links,omitempty"`
    54  }
    55  
    56  // CidrMapList represents a GTM returned cidrmap list body
    57  type CidrMapList struct {
    58  	CidrMapItems []*CidrMap `json:"items"`
    59  }
    60  
    61  // Validate validates CidrMap
    62  func (cidr *CidrMap) Validate() error {
    63  	if len(cidr.Name) < 1 {
    64  		return fmt.Errorf("CidrMap is missing Name")
    65  	}
    66  	if cidr.DefaultDatacenter == nil {
    67  		return fmt.Errorf("CidrMap is missing DefaultDatacenter")
    68  	}
    69  
    70  	return nil
    71  }
    72  
    73  func (p *gtm) NewCidrMap(ctx context.Context, name string) *CidrMap {
    74  
    75  	logger := p.Log(ctx)
    76  	logger.Debug("NewCidrMap")
    77  
    78  	cidrmap := &CidrMap{Name: name}
    79  	return cidrmap
    80  }
    81  
    82  func (p *gtm) ListCidrMaps(ctx context.Context, domainName string) ([]*CidrMap, error) {
    83  
    84  	logger := p.Log(ctx)
    85  	logger.Debug("ListCidrMaps")
    86  
    87  	var cidrs CidrMapList
    88  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps", domainName)
    89  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
    90  	if err != nil {
    91  		return nil, fmt.Errorf("failed to create ListCidrMaps request: %w", err)
    92  	}
    93  	setVersionHeader(req, schemaVersion)
    94  	resp, err := p.Exec(req, &cidrs)
    95  	if err != nil {
    96  		return nil, fmt.Errorf("ListCidrMaps request failed: %w", err)
    97  	}
    98  
    99  	if resp.StatusCode != http.StatusOK {
   100  		return nil, p.Error(resp)
   101  	}
   102  
   103  	return cidrs.CidrMapItems, nil
   104  }
   105  
   106  func (p *gtm) GetCidrMap(ctx context.Context, name, domainName string) (*CidrMap, error) {
   107  
   108  	logger := p.Log(ctx)
   109  	logger.Debug("GetCidrMap")
   110  
   111  	var cidr CidrMap
   112  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-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 GetCidrMap request: %w", err)
   116  	}
   117  	setVersionHeader(req, schemaVersion)
   118  	resp, err := p.Exec(req, &cidr)
   119  	if err != nil {
   120  		return nil, fmt.Errorf("GetCidrMap request failed: %w", err)
   121  	}
   122  
   123  	if resp.StatusCode != http.StatusOK {
   124  		return nil, p.Error(resp)
   125  	}
   126  
   127  	return &cidr, nil
   128  }
   129  
   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  func (p *gtm) CreateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*CidrMapResponse, error) {
   143  
   144  	logger := p.Log(ctx)
   145  	logger.Debug("CreateCidrMap")
   146  
   147  	// Use common code. Any specific validation needed?
   148  	return cidr.save(ctx, p, domainName)
   149  }
   150  
   151  func (p *gtm) UpdateCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) {
   152  
   153  	logger := p.Log(ctx)
   154  	logger.Debug("UpdateCidrMap")
   155  
   156  	// common code
   157  	stat, err := cidr.save(ctx, p, domainName)
   158  	if err != nil {
   159  		return nil, err
   160  	}
   161  	return stat.Status, err
   162  }
   163  
   164  // Save CidrMap in given domain. Common path for Create and Update.
   165  func (cidr *CidrMap) save(ctx context.Context, p *gtm, domainName string) (*CidrMapResponse, error) {
   166  
   167  	if err := cidr.Validate(); err != nil {
   168  		return nil, fmt.Errorf("CidrMap validation failed. %w", err)
   169  	}
   170  
   171  	putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name)
   172  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   173  	if err != nil {
   174  		return nil, fmt.Errorf("failed to create AsMap request: %w", err)
   175  	}
   176  
   177  	var mapresp CidrMapResponse
   178  	setVersionHeader(req, schemaVersion)
   179  	resp, err := p.Exec(req, &mapresp, cidr)
   180  	if err != nil {
   181  		return nil, fmt.Errorf("CidrMap request failed: %w", err)
   182  	}
   183  
   184  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   185  		return nil, p.Error(resp)
   186  	}
   187  
   188  	return &mapresp, nil
   189  }
   190  
   191  func (p *gtm) DeleteCidrMap(ctx context.Context, cidr *CidrMap, domainName string) (*ResponseStatus, error) {
   192  
   193  	logger := p.Log(ctx)
   194  	logger.Debug("DeleteCidrMap")
   195  
   196  	if err := cidr.Validate(); err != nil {
   197  		logger.Errorf("CidrMap validation failed. %w", err)
   198  		return nil, fmt.Errorf("CidrMap validation failed. %w", err)
   199  	}
   200  
   201  	delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/cidr-maps/%s", domainName, cidr.Name)
   202  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil)
   203  	if err != nil {
   204  		return nil, fmt.Errorf("failed to create Delete request: %w", err)
   205  	}
   206  
   207  	var mapresp ResponseBody
   208  	setVersionHeader(req, schemaVersion)
   209  	resp, err := p.Exec(req, &mapresp)
   210  	if err != nil {
   211  		return nil, fmt.Errorf("CidrMap request failed: %w", err)
   212  	}
   213  
   214  	if resp.StatusCode != http.StatusOK {
   215  		return nil, p.Error(resp)
   216  	}
   217  
   218  	return mapresp.Status, nil
   219  }