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