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

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"time"
     8  
     9  	validation "github.com/go-ozzo/ozzo-validation/v4"
    10  )
    11  
    12  type (
    13  	// The ConfigurationClone interface supports cloning an existing configuration and retrieving a configuration version.
    14  	//
    15  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#configurationclone
    16  	ConfigurationClone interface {
    17  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getconfigurationversion
    18  		GetConfigurationClone(ctx context.Context, params GetConfigurationCloneRequest) (*GetConfigurationCloneResponse, error)
    19  
    20  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#postsummarylistofconfigurationversions
    21  		CreateConfigurationClone(ctx context.Context, params CreateConfigurationCloneRequest) (*CreateConfigurationCloneResponse, error)
    22  	}
    23  
    24  	// GetConfigurationCloneRequest is used to retrieve information about an existing security configuration.
    25  	GetConfigurationCloneRequest struct {
    26  		ConfigID     int       `json:"configId"`
    27  		ConfigName   string    `json:"configName"`
    28  		Version      int       `json:"version"`
    29  		VersionNotes string    `json:"versionNotes"`
    30  		CreateDate   time.Time `json:"createDate"`
    31  		CreatedBy    string    `json:"createdBy"`
    32  		BasedOn      int       `json:"basedOn"`
    33  		Production   struct {
    34  			Status string    `json:"status"`
    35  			Time   time.Time `json:"time"`
    36  		} `json:"production"`
    37  		Staging struct {
    38  			Status string `json:"status"`
    39  		} `json:"staging"`
    40  	}
    41  
    42  	// GetConfigurationCloneResponse is returned from a call to GetConfigurationClone.
    43  	GetConfigurationCloneResponse struct {
    44  		ConfigID     int       `json:"configId"`
    45  		ConfigName   string    `json:"configName"`
    46  		Version      int       `json:"version"`
    47  		VersionNotes string    `json:"versionNotes"`
    48  		CreateDate   time.Time `json:"createDate"`
    49  		CreatedBy    string    `json:"createdBy"`
    50  		BasedOn      int       `json:"basedOn"`
    51  		Production   struct {
    52  			Status string    `json:"status"`
    53  			Time   time.Time `json:"time"`
    54  		} `json:"production"`
    55  		Staging struct {
    56  			Status string `json:"status"`
    57  		} `json:"staging"`
    58  	}
    59  
    60  	// CreateConfigurationCloneRequest is used to clone an existing security configuration.
    61  	CreateConfigurationCloneRequest struct {
    62  		Name        string   `json:"name"`
    63  		Description string   `json:"description"`
    64  		ContractID  string   `json:"contractId"`
    65  		GroupID     int      `json:"groupId"`
    66  		Hostnames   []string `json:"hostnames"`
    67  		CreateFrom  struct {
    68  			ConfigID int `json:"configId"`
    69  			Version  int `json:"version"`
    70  		} `json:"createFrom"`
    71  	}
    72  
    73  	// CreateConfigurationCloneResponse is returned from a call to CreateConfigurationClone.
    74  	CreateConfigurationCloneResponse struct {
    75  		ConfigID    int    `json:"configId"`
    76  		Version     int    `json:"version"`
    77  		Description string `json:"description"`
    78  		Name        string `json:"name"`
    79  	}
    80  )
    81  
    82  // Validate validates a GetConfigurationCloneRequest.
    83  func (v GetConfigurationCloneRequest) Validate() error {
    84  	return validation.Errors{
    85  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    86  		"Version":  validation.Validate(v.Version, validation.Required),
    87  	}.Filter()
    88  }
    89  
    90  // Validate validates a CreateConfigurationCloneRequest.
    91  func (v CreateConfigurationCloneRequest) Validate() error {
    92  	return validation.Errors{
    93  		"CreateFromConfigID": validation.Validate(v.CreateFrom.ConfigID, validation.Required),
    94  	}.Filter()
    95  }
    96  
    97  func (p *appsec) GetConfigurationClone(ctx context.Context, params GetConfigurationCloneRequest) (*GetConfigurationCloneResponse, error) {
    98  	logger := p.Log(ctx)
    99  	logger.Debug("GetConfigurationClone")
   100  
   101  	if err := params.Validate(); err != nil {
   102  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   103  	}
   104  
   105  	uri := fmt.Sprintf(
   106  		"/appsec/v1/configs/%d/versions/%d",
   107  		params.ConfigID,
   108  		params.Version)
   109  
   110  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   111  	if err != nil {
   112  		return nil, fmt.Errorf("failed to create GetConfigurationClone request: %w", err)
   113  	}
   114  
   115  	var result GetConfigurationCloneResponse
   116  	resp, err := p.Exec(req, &result)
   117  	if err != nil {
   118  		return nil, fmt.Errorf("get configuration clone request failed: %w", err)
   119  	}
   120  	if resp.StatusCode != http.StatusOK {
   121  		return nil, p.Error(resp)
   122  	}
   123  
   124  	return &result, nil
   125  }
   126  
   127  func (p *appsec) CreateConfigurationClone(ctx context.Context, params CreateConfigurationCloneRequest) (*CreateConfigurationCloneResponse, error) {
   128  	logger := p.Log(ctx)
   129  	logger.Debug("CreateConfigurationClone")
   130  
   131  	if err := params.Validate(); err != nil {
   132  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   133  	}
   134  
   135  	uri := "/appsec/v1/configs/"
   136  
   137  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   138  	if err != nil {
   139  		return nil, fmt.Errorf("failed to create CreateConfigurationClone request: %w", err)
   140  	}
   141  
   142  	var result CreateConfigurationCloneResponse
   143  	resp, err := p.Exec(req, &result, params)
   144  	if err != nil {
   145  		return nil, fmt.Errorf("create configuration clone request failed: %w", err)
   146  	}
   147  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   148  		return nil, p.Error(resp)
   149  	}
   150  
   151  	return &result, nil
   152  }