github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/activations.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 Activations interface supports the activation and deactivation of security configurations.
    14  	//
    15  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#activation
    16  	Activations interface {
    17  		// GetActivations returns the status of an activation.
    18  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getactivationid
    19  		GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error)
    20  
    21  		// GetActivationHistory lists the activation history for a configuration.
    22  		// https://techdocs.akamai.com/application-security/reference/get-activation-history
    23  		GetActivationHistory(ctx context.Context, params GetActivationHistoryRequest) (*GetActivationHistoryResponse, error)
    24  
    25  		// CreateActivations activates a configuration. If acknowledgeWarnings is true and warnings are
    26  		// returned on the first attempt, a second attempt is made acknowledging the warnings.
    27  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#postactivations
    28  		CreateActivations(ctx context.Context, params CreateActivationsRequest, acknowledgeWarnings bool) (*CreateActivationsResponse, error)
    29  
    30  		// RemoveActivations deactivates a configuration.
    31  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#postactivations
    32  		RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error)
    33  	}
    34  
    35  	// GetActivationsRequest is used to request the status of an activation request.
    36  	GetActivationsRequest struct {
    37  		ActivationID int `json:"activationId"`
    38  	}
    39  
    40  	// GetActivationsResponse is returned from a call to GetActivations.
    41  	GetActivationsResponse struct {
    42  		DispatchCount     int          `json:"dispatchCount"`
    43  		ActivationID      int          `json:"activationId"`
    44  		Action            string       `json:"action"`
    45  		Status            StatusValue  `json:"status"`
    46  		Network           NetworkValue `json:"network"`
    47  		Estimate          string       `json:"estimate"`
    48  		CreatedBy         string       `json:"createdBy"`
    49  		CreateDate        time.Time    `json:"createDate"`
    50  		ActivationConfigs []struct {
    51  			ConfigID              int    `json:"configId"`
    52  			ConfigName            string `json:"configName"`
    53  			ConfigVersion         int    `json:"configVersion"`
    54  			PreviousConfigVersion int    `json:"previousConfigVersion"`
    55  		} `json:"activationConfigs"`
    56  	}
    57  
    58  	// GetActivationHistoryRequest is used to request the activation history for a configuration.
    59  	GetActivationHistoryRequest struct {
    60  		ConfigID int `json:"configId"`
    61  	}
    62  
    63  	// GetActivationHistoryResponse lists the activation history for a configuration.
    64  	GetActivationHistoryResponse struct {
    65  		ConfigID          int          `json:"configId"`
    66  		ActivationHistory []Activation `json:"activationHistory,omitempty"`
    67  	}
    68  
    69  	// Activation represents the status of a configuration activation.
    70  	Activation struct {
    71  		ActivationID       int       `json:"activationId"`
    72  		Version            int       `json:"version"`
    73  		Status             string    `json:"status"`
    74  		Network            string    `json:"Network"`
    75  		ActivatedBy        string    `json:"activatedBy"`
    76  		ActivationDate     time.Time `json:"activationDate"`
    77  		Notes              string    `json:"notes"`
    78  		NotificationEmails []string  `json:"notificationEmails"`
    79  	}
    80  
    81  	// CreateActivationsRequest is used to request activation or deactivation of a configuration.
    82  	CreateActivationsRequest struct {
    83  		Action             string   `json:"action"`
    84  		Network            string   `json:"network"`
    85  		Note               string   `json:"note"`
    86  		NotificationEmails []string `json:"notificationEmails"`
    87  		ActivationConfigs  []struct {
    88  			ConfigID      int `json:"configId"`
    89  			ConfigVersion int `json:"configVersion"`
    90  		} `json:"activationConfigs"`
    91  	}
    92  
    93  	// CreateActivationsResponse is returned from a call to CreateActivations.
    94  	CreateActivationsResponse struct {
    95  		DispatchCount     int          `json:"dispatchCount"`
    96  		ActivationID      int          `json:"activationId"`
    97  		Action            string       `json:"action"`
    98  		Status            StatusValue  `json:"status"`
    99  		Network           NetworkValue `json:"network"`
   100  		Estimate          string       `json:"estimate"`
   101  		CreatedBy         string       `json:"createdBy"`
   102  		CreateDate        time.Time    `json:"createDate"`
   103  		ActivationConfigs []struct {
   104  			ConfigID              int    `json:"configId"`
   105  			ConfigName            string `json:"configName"`
   106  			ConfigVersion         int    `json:"configVersion"`
   107  			PreviousConfigVersion int    `json:"previousConfigVersion"`
   108  		} `json:"activationConfigs"`
   109  	}
   110  
   111  	// ActivationConfigs describes a specific configuration version to be activated or deactivated.
   112  	ActivationConfigs struct {
   113  		ConfigID      int `json:"configId"`
   114  		ConfigVersion int `json:"configVersion"`
   115  	}
   116  
   117  	// RemoveActivationsRequest is used to request deactivation of one or more configurations.
   118  	RemoveActivationsRequest struct {
   119  		ActivationID       int      `json:"-"`
   120  		Action             string   `json:"action"`
   121  		Network            string   `json:"network"`
   122  		Note               string   `json:"note"`
   123  		NotificationEmails []string `json:"notificationEmails"`
   124  		ActivationConfigs  []struct {
   125  			ConfigID      int `json:"configId"`
   126  			ConfigVersion int `json:"configVersion"`
   127  		} `json:"activationConfigs"`
   128  	}
   129  
   130  	// RemoveActivationsResponse is returned from a call to RemoveActivations.
   131  	RemoveActivationsResponse struct {
   132  		DispatchCount     int          `json:"dispatchCount"`
   133  		ActivationID      int          `json:"activationId"`
   134  		Action            string       `json:"action"`
   135  		Status            StatusValue  `json:"status"`
   136  		Network           NetworkValue `json:"network"`
   137  		Estimate          string       `json:"estimate"`
   138  		CreatedBy         string       `json:"createdBy"`
   139  		CreateDate        time.Time    `json:"createDate"`
   140  		ActivationConfigs []struct {
   141  			ConfigID              int    `json:"configId"`
   142  			ConfigName            string `json:"configName"`
   143  			ConfigVersion         int    `json:"configVersion"`
   144  			PreviousConfigVersion int    `json:"previousConfigVersion"`
   145  		} `json:"activationConfigs"`
   146  	}
   147  )
   148  
   149  // Validate validates a GetActivationsRequest.
   150  func (v GetActivationsRequest) Validate() error {
   151  	return validation.Errors{
   152  		"activationid": validation.Validate(v.ActivationID, validation.Required),
   153  	}.Filter()
   154  }
   155  
   156  // Validate validates a GetActivationHistoryRequest.
   157  func (v GetActivationHistoryRequest) Validate() error {
   158  	return validation.Errors{
   159  		"configId": validation.Validate(v.ConfigID, validation.Required),
   160  	}.Filter()
   161  }
   162  
   163  func (p *appsec) GetActivations(ctx context.Context, params GetActivationsRequest) (*GetActivationsResponse, error) {
   164  	logger := p.Log(ctx)
   165  	logger.Debug("GetActivations")
   166  
   167  	if err := params.Validate(); err != nil {
   168  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   169  	}
   170  
   171  	uri := fmt.Sprintf(
   172  		"/appsec/v1/activations/%d",
   173  		params.ActivationID)
   174  
   175  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   176  	if err != nil {
   177  		return nil, fmt.Errorf("failed to create GetActivations request: %w", err)
   178  	}
   179  
   180  	var result GetActivationsResponse
   181  	resp, errp := p.Exec(req, &result)
   182  	if errp != nil {
   183  		return nil, fmt.Errorf("get activations request failed: %w", errp)
   184  	}
   185  
   186  	if resp.StatusCode != http.StatusOK {
   187  		return nil, p.Error(resp)
   188  	}
   189  
   190  	return &result, nil
   191  }
   192  
   193  func (p *appsec) GetActivationHistory(ctx context.Context, params GetActivationHistoryRequest) (*GetActivationHistoryResponse, error) {
   194  	logger := p.Log(ctx)
   195  	logger.Debug("GetActivationHistory")
   196  
   197  	if err := params.Validate(); err != nil {
   198  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   199  	}
   200  
   201  	uri := fmt.Sprintf(
   202  		"/appsec/v1/configs/%d/activations",
   203  		params.ConfigID)
   204  
   205  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   206  	if err != nil {
   207  		return nil, fmt.Errorf("failed to create GetActivationHistory request: %w", err)
   208  	}
   209  
   210  	var result GetActivationHistoryResponse
   211  	resp, err := p.Exec(req, &result)
   212  	if err != nil {
   213  		return nil, fmt.Errorf("get activation history request failed: %w", err)
   214  	}
   215  
   216  	if resp.StatusCode != http.StatusOK {
   217  		return nil, p.Error(resp)
   218  	}
   219  
   220  	return &result, nil
   221  }
   222  
   223  func (p *appsec) CreateActivations(ctx context.Context, params CreateActivationsRequest, _ bool) (*CreateActivationsResponse, error) {
   224  	logger := p.Log(ctx)
   225  	logger.Debug("CreateActivations")
   226  
   227  	uri := "/appsec/v1/activations"
   228  
   229  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   230  	if err != nil {
   231  		return nil, fmt.Errorf("failed to create CreateActivations request: %w", err)
   232  	}
   233  
   234  	var result CreateActivationsResponse
   235  	resp, err := p.Exec(req, &result, params)
   236  	if err != nil {
   237  		return nil, fmt.Errorf("create activations request failed: %w", err)
   238  	}
   239  	if resp.StatusCode != http.StatusOK {
   240  		return nil, p.Error(resp)
   241  	}
   242  
   243  	uriget := fmt.Sprintf(
   244  		"/appsec/v1/activations/%d",
   245  		result.ActivationID,
   246  	)
   247  
   248  	req, err = http.NewRequestWithContext(ctx, http.MethodGet, uriget, nil)
   249  	if err != nil {
   250  		return nil, fmt.Errorf("failed to create GetActivation request: %w", err)
   251  	}
   252  
   253  	resp, err = p.Exec(req, &result)
   254  	if err != nil {
   255  		return nil, fmt.Errorf("get activation request failed: %w", err)
   256  	}
   257  	if resp.StatusCode != http.StatusOK {
   258  		return nil, p.Error(resp)
   259  	}
   260  
   261  	return &result, nil
   262  }
   263  
   264  func (p *appsec) RemoveActivations(ctx context.Context, params RemoveActivationsRequest) (*RemoveActivationsResponse, error) {
   265  	logger := p.Log(ctx)
   266  	logger.Debug("RemoveActivations")
   267  
   268  	uri := "/appsec/v1/activations"
   269  
   270  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   271  	if err != nil {
   272  		return nil, fmt.Errorf("failed to create RemoveActivations request: %w", err)
   273  	}
   274  
   275  	var result RemoveActivationsResponse
   276  	resp, errp := p.Exec(req, &result, params)
   277  	if errp != nil {
   278  		return nil, fmt.Errorf("remove activations request failed: %w", errp)
   279  	}
   280  	if resp.StatusCode != http.StatusOK {
   281  		return nil, p.Error(resp)
   282  	}
   283  
   284  	return &result, nil
   285  }
   286  
   287  // ActivationValue is used to create an "enum" of possible Activation.ActivationType values
   288  type ActivationValue string
   289  
   290  // NetworkValue is used to create an "enum" of possible Activation.Network values
   291  type NetworkValue string
   292  
   293  // StatusValue is used to create an "enum" of possible Activation.Status values
   294  type StatusValue string
   295  
   296  const (
   297  
   298  	// ActivationTypeActivate is used to activate a configuration.
   299  	ActivationTypeActivate ActivationValue = "ACTIVATE"
   300  
   301  	// ActivationTypeDeactivate is used to deactivate a configuration.
   302  	ActivationTypeDeactivate ActivationValue = "DEACTIVATE"
   303  
   304  	// NetworkProduction is used to activate/deactivate a configuration in the production network.
   305  	NetworkProduction NetworkValue = "PRODUCTION"
   306  
   307  	// NetworkStaging is used to activate/deactivate a configuration in the staging network.
   308  	NetworkStaging NetworkValue = "STAGING"
   309  
   310  	// StatusActive indicates that a configuration has been activated.
   311  	StatusActive StatusValue = "ACTIVATED"
   312  
   313  	// StatusInactive indicates that a configuration is inactive.
   314  	StatusInactive StatusValue = "INACTIVE"
   315  
   316  	// StatusPending indicates that an activation/deactivation request has been received.
   317  	StatusPending StatusValue = "RECEIVED"
   318  
   319  	// StatusAborted indicates that an activation/deactivation request has been aborted.
   320  	StatusAborted StatusValue = "ABORTED"
   321  
   322  	// StatusFailed indicates that an activation/deactivation request has failed.
   323  	StatusFailed StatusValue = "FAILED"
   324  
   325  	// StatusDeactivated indicates that an configuration has been deactivated.
   326  	StatusDeactivated StatusValue = "DEACTIVATED"
   327  
   328  	// StatusPendingDeactivation indicates that a deactivation request is in progress.
   329  	StatusPendingDeactivation StatusValue = "PENDING_DEACTIVATION"
   330  
   331  	// StatusNew indicates that a deactivation request is new.
   332  	StatusNew StatusValue = "NEW"
   333  )