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

     1  package gtm
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  )
     8  
     9  // Resources contains operations available on a Resource resource.
    10  type Resources interface {
    11  	// ListResources retrieves all Resources
    12  	//
    13  	// See: https://techdocs.akamai.com/gtm/reference/get-resources
    14  	ListResources(context.Context, string) ([]*Resource, error)
    15  	// GetResource retrieves a Resource with the given name.
    16  	//
    17  	// See: https://techdocs.akamai.com/gtm/reference/get-resource
    18  	GetResource(context.Context, string, string) (*Resource, error)
    19  	// CreateResource creates the datacenter identified by the receiver argument in the specified domain.
    20  	//
    21  	// See: https://techdocs.akamai.com/gtm/reference/put-resource
    22  	CreateResource(context.Context, *Resource, string) (*ResourceResponse, error)
    23  	// DeleteResource deletes the datacenter identified by the receiver argument from the domain specified.
    24  	//
    25  	// See: https://techdocs.akamai.com/gtm/reference/delete-resource
    26  	DeleteResource(context.Context, *Resource, string) (*ResponseStatus, error)
    27  	// UpdateResource updates the datacenter identified in the receiver argument in the provided domain.
    28  	//
    29  	// See: https://techdocs.akamai.com/gtm/reference/put-resource
    30  	UpdateResource(context.Context, *Resource, string) (*ResponseStatus, error)
    31  }
    32  
    33  // ResourceInstance contains information about the resources that constrain the properties within the data center
    34  type ResourceInstance struct {
    35  	DatacenterID         int  `json:"datacenterId"`
    36  	UseDefaultLoadObject bool `json:"useDefaultLoadObject"`
    37  	LoadObject
    38  }
    39  
    40  // Resource represents a GTM resource
    41  type Resource struct {
    42  	Type                        string              `json:"type"`
    43  	HostHeader                  string              `json:"hostHeader,omitempty"`
    44  	LeastSquaresDecay           float64             `json:"leastSquaresDecay,omitempty"`
    45  	Description                 string              `json:"description,omitempty"`
    46  	LeaderString                string              `json:"leaderString,omitempty"`
    47  	ConstrainedProperty         string              `json:"constrainedProperty,omitempty"`
    48  	ResourceInstances           []*ResourceInstance `json:"resourceInstances,omitempty"`
    49  	AggregationType             string              `json:"aggregationType,omitempty"`
    50  	Links                       []*Link             `json:"links,omitempty"`
    51  	LoadImbalancePercentage     float64             `json:"loadImbalancePercentage,omitempty"`
    52  	UpperBound                  int                 `json:"upperBound,omitempty"`
    53  	Name                        string              `json:"name"`
    54  	MaxUMultiplicativeIncrement float64             `json:"maxUMultiplicativeIncrement,omitempty"`
    55  	DecayRate                   float64             `json:"decayRate,omitempty"`
    56  }
    57  
    58  // ResourceList is the structure returned by List Resources
    59  type ResourceList struct {
    60  	ResourceItems []*Resource `json:"items"`
    61  }
    62  
    63  // Validate validates Resource
    64  func (r *Resource) Validate() error {
    65  	if len(r.Name) < 1 {
    66  		return fmt.Errorf("resource is missing Name")
    67  	}
    68  	if len(r.Type) < 1 {
    69  		return fmt.Errorf("resource is missing Type")
    70  	}
    71  
    72  	return nil
    73  }
    74  
    75  func (g *gtm) ListResources(ctx context.Context, domainName string) ([]*Resource, error) {
    76  	logger := g.Log(ctx)
    77  	logger.Debug("ListResources")
    78  
    79  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources", domainName)
    80  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
    81  	if err != nil {
    82  		return nil, fmt.Errorf("failed to create ListResources request: %w", err)
    83  	}
    84  	setVersionHeader(req, schemaVersion)
    85  
    86  	var result ResourceList
    87  	resp, err := g.Exec(req, &result)
    88  	if err != nil {
    89  		return nil, fmt.Errorf("ListResources request failed: %w", err)
    90  	}
    91  
    92  	if resp.StatusCode != http.StatusOK {
    93  		return nil, g.Error(resp)
    94  	}
    95  
    96  	return result.ResourceItems, nil
    97  }
    98  
    99  func (g *gtm) GetResource(ctx context.Context, resourceName, domainName string) (*Resource, error) {
   100  	logger := g.Log(ctx)
   101  	logger.Debug("GetResource")
   102  
   103  	getURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, resourceName)
   104  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil)
   105  	if err != nil {
   106  		return nil, fmt.Errorf("failed to create GetResource request: %w", err)
   107  	}
   108  	setVersionHeader(req, schemaVersion)
   109  
   110  	var result Resource
   111  	resp, err := g.Exec(req, &result)
   112  	if err != nil {
   113  		return nil, fmt.Errorf("GetResource request failed: %w", err)
   114  	}
   115  
   116  	if resp.StatusCode != http.StatusOK {
   117  		return nil, g.Error(resp)
   118  	}
   119  
   120  	return &result, nil
   121  }
   122  
   123  func (g *gtm) CreateResource(ctx context.Context, resource *Resource, domainName string) (*ResourceResponse, error) {
   124  	logger := g.Log(ctx)
   125  	logger.Debug("CreateResource")
   126  
   127  	return resource.save(ctx, g, domainName)
   128  }
   129  
   130  func (g *gtm) UpdateResource(ctx context.Context, resource *Resource, domainName string) (*ResponseStatus, error) {
   131  	logger := g.Log(ctx)
   132  	logger.Debug("UpdateResource")
   133  
   134  	stat, err := resource.save(ctx, g, domainName)
   135  	if err != nil {
   136  		return nil, err
   137  	}
   138  	return stat.Status, err
   139  }
   140  
   141  // save is a function that saves Resource in given domain. Common path for Create and Update.
   142  func (r *Resource) save(ctx context.Context, g *gtm, domainName string) (*ResourceResponse, error) {
   143  	if err := r.Validate(); err != nil {
   144  		return nil, fmt.Errorf("resource validation failed. %w", err)
   145  	}
   146  
   147  	putURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, r.Name)
   148  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   149  	if err != nil {
   150  		return nil, fmt.Errorf("failed to create Resource request: %w", err)
   151  	}
   152  	setVersionHeader(req, schemaVersion)
   153  
   154  	var result ResourceResponse
   155  	resp, err := g.Exec(req, &result, r)
   156  	if err != nil {
   157  		return nil, fmt.Errorf("resource request failed: %w", err)
   158  	}
   159  
   160  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   161  		return nil, g.Error(resp)
   162  	}
   163  
   164  	return &result, nil
   165  }
   166  
   167  func (g *gtm) DeleteResource(ctx context.Context, resource *Resource, domainName string) (*ResponseStatus, error) {
   168  	logger := g.Log(ctx)
   169  	logger.Debug("DeleteResource")
   170  
   171  	if err := resource.Validate(); err != nil {
   172  		logger.Errorf("Resource validation failed. %w", err)
   173  		return nil, fmt.Errorf("DeleteResource validation failed. %w", err)
   174  	}
   175  
   176  	delURL := fmt.Sprintf("/config-gtm/v1/domains/%s/resources/%s", domainName, resource.Name)
   177  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, delURL, nil)
   178  	if err != nil {
   179  		return nil, fmt.Errorf("failed to create Delete request: %w", err)
   180  	}
   181  	setVersionHeader(req, schemaVersion)
   182  
   183  	var result ResponseBody
   184  	resp, err := g.Exec(req, &result)
   185  	if err != nil {
   186  		return nil, fmt.Errorf("DeleteResource request failed: %w", err)
   187  	}
   188  
   189  	if resp.StatusCode != http.StatusOK {
   190  		return nil, g.Error(resp)
   191  	}
   192  
   193  	return result.Status, nil
   194  }