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 }