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 }