Skip to content

Commit 40ac504

Browse files
authored
feat(secret): add support for RestoreSecretRequest and RestoreSecretVersionRequest (scaleway#2426)
1 parent 5f0d193 commit 40ac504

File tree

1 file changed

+111
-4
lines changed

1 file changed

+111
-4
lines changed

api/secret/v1beta1/secret_sdk.go

Lines changed: 111 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,11 @@ func (enum *SecretType) UnmarshalJSON(data []byte) error {
302302
type SecretVersionStatus string
303303

304304
const (
305-
SecretVersionStatusUnknownStatus = SecretVersionStatus("unknown_status")
306-
SecretVersionStatusEnabled = SecretVersionStatus("enabled")
307-
SecretVersionStatusDisabled = SecretVersionStatus("disabled")
308-
SecretVersionStatusDeleted = SecretVersionStatus("deleted")
305+
SecretVersionStatusUnknownStatus = SecretVersionStatus("unknown_status")
306+
SecretVersionStatusEnabled = SecretVersionStatus("enabled")
307+
SecretVersionStatusDisabled = SecretVersionStatus("disabled")
308+
SecretVersionStatusDeleted = SecretVersionStatus("deleted")
309+
SecretVersionStatusScheduledForDeletion = SecretVersionStatus("scheduled_for_deletion")
309310
)
310311

311312
func (enum SecretVersionStatus) String() string {
@@ -322,6 +323,7 @@ func (enum SecretVersionStatus) Values() []SecretVersionStatus {
322323
"enabled",
323324
"disabled",
324325
"deleted",
326+
"scheduled_for_deletion",
325327
}
326328
}
327329

@@ -412,6 +414,7 @@ type SecretVersion struct {
412414
// Status: * `unknown_status`: the version is in an invalid state.
413415
// * `enabled`: the version is accessible.
414416
// * `disabled`: the version is not accessible but can be enabled.
417+
// * `scheduled_for_deletion`: the version is scheduled for deletion. It will be deleted in 7 days.
415418
// * `deleted`: the version is permanently deleted. It is not possible to recover it.
416419
// Default value: unknown_status
417420
Status SecretVersionStatus `json:"status"`
@@ -433,6 +436,9 @@ type SecretVersion struct {
433436

434437
// EphemeralProperties: returns the version's expiration date, whether it expires after being accessed once, and the action to perform (disable or delete) once the version expires.
435438
EphemeralProperties *EphemeralProperties `json:"ephemeral_properties"`
439+
440+
// DeletionRequestedAt: returns the time at which deletion was requested.
441+
DeletionRequestedAt *time.Time `json:"deletion_requested_at"`
436442
}
437443

438444
// Secret: secret.
@@ -485,6 +491,9 @@ type Secret struct {
485491
// UsedBy: list of Scaleway resources that can access and manage the secret.
486492
UsedBy []Product `json:"used_by"`
487493

494+
// DeletionRequestedAt: returns the time at which deletion was requested.
495+
DeletionRequestedAt *time.Time `json:"deletion_requested_at"`
496+
488497
// Region: region of the secret.
489498
Region scw.Region `json:"region"`
490499
}
@@ -892,6 +901,9 @@ type ListSecretsRequest struct {
892901
// Type: filter by secret type (optional).
893902
// Default value: unknown_type
894903
Type SecretType `json:"-"`
904+
905+
// ScheduledForDeletion: filter by whether the secret was scheduled for deletion / not scheduled for deletion (optional).
906+
ScheduledForDeletion *bool `json:"-"`
895907
}
896908

897909
// ListSecretsResponse: list secrets response.
@@ -972,6 +984,24 @@ type ProtectSecretRequest struct {
972984
SecretID string `json:"-"`
973985
}
974986

987+
// RestoreSecretRequest: restore secret request.
988+
type RestoreSecretRequest struct {
989+
// Region: region to target. If none is passed will use default region from the config.
990+
Region scw.Region `json:"-"`
991+
992+
SecretID string `json:"-"`
993+
}
994+
995+
// RestoreSecretVersionRequest: restore secret version request.
996+
type RestoreSecretVersionRequest struct {
997+
// Region: region to target. If none is passed will use default region from the config.
998+
Region scw.Region `json:"-"`
999+
1000+
SecretID string `json:"-"`
1001+
1002+
Revision string `json:"-"`
1003+
}
1004+
9751005
// SSHKey: ssh key.
9761006
type SSHKey struct {
9771007
// SSHPrivateKey: the private SSH key.
@@ -1205,6 +1235,7 @@ func (s *API) ListSecrets(req *ListSecretsRequest, opts ...scw.RequestOption) (*
12051235
parameter.AddToQuery(query, "path", req.Path)
12061236
parameter.AddToQuery(query, "ephemeral", req.Ephemeral)
12071237
parameter.AddToQuery(query, "type", req.Type)
1238+
parameter.AddToQuery(query, "scheduled_for_deletion", req.ScheduledForDeletion)
12081239

12091240
if fmt.Sprint(req.Region) == "" {
12101241
return nil, errors.New("field Region cannot be empty in request")
@@ -1801,3 +1832,79 @@ func (s *API) ListSecretTypes(req *ListSecretTypesRequest, opts ...scw.RequestOp
18011832
}
18021833
return &resp, nil
18031834
}
1835+
1836+
// RestoreSecretVersion: Restore a secret's version specified by the `region`, `secret_id` and `revision` parameters.
1837+
func (s *API) RestoreSecretVersion(req *RestoreSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) {
1838+
var err error
1839+
1840+
if req.Region == "" {
1841+
defaultRegion, _ := s.client.GetDefaultRegion()
1842+
req.Region = defaultRegion
1843+
}
1844+
1845+
if fmt.Sprint(req.Region) == "" {
1846+
return nil, errors.New("field Region cannot be empty in request")
1847+
}
1848+
1849+
if fmt.Sprint(req.SecretID) == "" {
1850+
return nil, errors.New("field SecretID cannot be empty in request")
1851+
}
1852+
1853+
if fmt.Sprint(req.Revision) == "" {
1854+
return nil, errors.New("field Revision cannot be empty in request")
1855+
}
1856+
1857+
scwReq := &scw.ScalewayRequest{
1858+
Method: "POST",
1859+
Path: "/secret-manager/v1beta1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "/restore",
1860+
}
1861+
1862+
err = scwReq.SetBody(req)
1863+
if err != nil {
1864+
return nil, err
1865+
}
1866+
1867+
var resp SecretVersion
1868+
1869+
err = s.client.Do(scwReq, &resp, opts...)
1870+
if err != nil {
1871+
return nil, err
1872+
}
1873+
return &resp, nil
1874+
}
1875+
1876+
// RestoreSecret: Restore a secret and all its versions scheduled for deletion specified by the `region` and `secret_id` parameters.
1877+
func (s *API) RestoreSecret(req *RestoreSecretRequest, opts ...scw.RequestOption) (*Secret, error) {
1878+
var err error
1879+
1880+
if req.Region == "" {
1881+
defaultRegion, _ := s.client.GetDefaultRegion()
1882+
req.Region = defaultRegion
1883+
}
1884+
1885+
if fmt.Sprint(req.Region) == "" {
1886+
return nil, errors.New("field Region cannot be empty in request")
1887+
}
1888+
1889+
if fmt.Sprint(req.SecretID) == "" {
1890+
return nil, errors.New("field SecretID cannot be empty in request")
1891+
}
1892+
1893+
scwReq := &scw.ScalewayRequest{
1894+
Method: "POST",
1895+
Path: "/secret-manager/v1beta1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/restore",
1896+
}
1897+
1898+
err = scwReq.SetBody(req)
1899+
if err != nil {
1900+
return nil, err
1901+
}
1902+
1903+
var resp Secret
1904+
1905+
err = s.client.Do(scwReq, &resp, opts...)
1906+
if err != nil {
1907+
return nil, err
1908+
}
1909+
return &resp, nil
1910+
}

0 commit comments

Comments
 (0)