Skip to content

Commit 10731c5

Browse files
authored
feat: add secret protection (#1770)
1 parent 7255970 commit 10731c5

File tree

1 file changed

+94
-2
lines changed

1 file changed

+94
-2
lines changed

api/secret/v1alpha1/secret_sdk.go

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,8 @@ type Secret struct {
271271
// Name: name of the secret.
272272
Name string `json:"name"`
273273
// Status: current status of the secret.
274-
// * `ready`: the secret is ready.
275-
// * `locked`: the secret is locked.
274+
// * `ready`: the secret can be read, modified and deleted.
275+
// * `locked`: no action can be performed on the secret. This status can only be applied and removed by Scaleway.
276276
// Default value: ready
277277
Status SecretStatus `json:"status"`
278278
// CreatedAt: date and time of the secret's creation.
@@ -287,6 +287,8 @@ type Secret struct {
287287
Description *string `json:"description"`
288288
// IsManaged: returns `true` for secrets that are managed by another product.
289289
IsManaged bool `json:"is_managed"`
290+
// IsProtected: returns `true` for protected secrets that cannot be deleted.
291+
IsProtected bool `json:"is_protected"`
290292
// Type: type of the secret.
291293
// See `Secret.Type` enum for description of values.
292294
// Default value: unknown_secret_type
@@ -624,6 +626,96 @@ func (s *API) DeleteSecret(req *DeleteSecretRequest, opts ...scw.RequestOption)
624626
return nil
625627
}
626628

629+
type ProtectSecretRequest struct {
630+
// Region: region to target. If none is passed will use default region from the config.
631+
Region scw.Region `json:"-"`
632+
// SecretID: ID of the secret to protect.
633+
SecretID string `json:"-"`
634+
}
635+
636+
// ProtectSecret: protect a secret.
637+
// Protect a given secret specified by the `secret_id` parameter. A protected secret can be read and modified but cannot be deleted.
638+
func (s *API) ProtectSecret(req *ProtectSecretRequest, opts ...scw.RequestOption) (*Secret, error) {
639+
var err error
640+
641+
if req.Region == "" {
642+
defaultRegion, _ := s.client.GetDefaultRegion()
643+
req.Region = defaultRegion
644+
}
645+
646+
if fmt.Sprint(req.Region) == "" {
647+
return nil, errors.New("field Region cannot be empty in request")
648+
}
649+
650+
if fmt.Sprint(req.SecretID) == "" {
651+
return nil, errors.New("field SecretID cannot be empty in request")
652+
}
653+
654+
scwReq := &scw.ScalewayRequest{
655+
Method: "POST",
656+
Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/protect",
657+
Headers: http.Header{},
658+
}
659+
660+
err = scwReq.SetBody(req)
661+
if err != nil {
662+
return nil, err
663+
}
664+
665+
var resp Secret
666+
667+
err = s.client.Do(scwReq, &resp, opts...)
668+
if err != nil {
669+
return nil, err
670+
}
671+
return &resp, nil
672+
}
673+
674+
type UnprotectSecretRequest struct {
675+
// Region: region to target. If none is passed will use default region from the config.
676+
Region scw.Region `json:"-"`
677+
// SecretID: ID of the secret to unprotect.
678+
SecretID string `json:"-"`
679+
}
680+
681+
// UnprotectSecret: unprotect a secret.
682+
// Unprotect a given secret specified by the `secret_id` parameter. An unprotected secret can be read, modified and deleted.
683+
func (s *API) UnprotectSecret(req *UnprotectSecretRequest, opts ...scw.RequestOption) (*Secret, error) {
684+
var err error
685+
686+
if req.Region == "" {
687+
defaultRegion, _ := s.client.GetDefaultRegion()
688+
req.Region = defaultRegion
689+
}
690+
691+
if fmt.Sprint(req.Region) == "" {
692+
return nil, errors.New("field Region cannot be empty in request")
693+
}
694+
695+
if fmt.Sprint(req.SecretID) == "" {
696+
return nil, errors.New("field SecretID cannot be empty in request")
697+
}
698+
699+
scwReq := &scw.ScalewayRequest{
700+
Method: "POST",
701+
Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/unprotect",
702+
Headers: http.Header{},
703+
}
704+
705+
err = scwReq.SetBody(req)
706+
if err != nil {
707+
return nil, err
708+
}
709+
710+
var resp Secret
711+
712+
err = s.client.Do(scwReq, &resp, opts...)
713+
if err != nil {
714+
return nil, err
715+
}
716+
return &resp, nil
717+
}
718+
627719
type AddSecretOwnerRequest struct {
628720
// Region: region to target. If none is passed will use default region from the config.
629721
Region scw.Region `json:"-"`

0 commit comments

Comments
 (0)