github.com/nais/knorten@v0.0.0-20240104110906-55926958e361/pkg/gcp/gsm.go (about) 1 package gcp 2 3 import ( 4 "context" 5 "fmt" 6 7 secretmanager "cloud.google.com/go/secretmanager/apiv1" 8 "cloud.google.com/go/secretmanager/apiv1/secretmanagerpb" 9 "github.com/googleapis/gax-go/v2/apierror" 10 "google.golang.org/grpc/codes" 11 ) 12 13 func CreateSecret(ctx context.Context, gcpProject, gcpRegion, secretID string, labels map[string]string) (*secretmanagerpb.Secret, error) { 14 client, err := secretmanager.NewClient(ctx) 15 if err != nil { 16 return nil, err 17 } 18 defer client.Close() 19 20 labels["created-by"] = "knorten" 21 22 req := &secretmanagerpb.CreateSecretRequest{ 23 Parent: "projects/" + gcpProject, 24 SecretId: secretID, 25 Secret: &secretmanagerpb.Secret{ 26 Labels: labels, 27 Replication: &secretmanagerpb.Replication{ 28 Replication: &secretmanagerpb.Replication_UserManaged_{ 29 UserManaged: &secretmanagerpb.Replication_UserManaged{ 30 Replicas: []*secretmanagerpb.Replication_UserManaged_Replica{ 31 { 32 Location: gcpRegion, 33 }, 34 }, 35 }, 36 }, 37 }, 38 }, 39 } 40 41 s, err := client.CreateSecret(ctx, req) 42 if err != nil { 43 apiError, ok := apierror.FromError(err) 44 if ok { 45 if apiError.GRPCStatus().Code() == codes.AlreadyExists { 46 return client.GetSecret(ctx, &secretmanagerpb.GetSecretRequest{ 47 Name: fmt.Sprintf("projects/%v/secrets/%v", gcpProject, secretID), 48 }) 49 } 50 } 51 return nil, err 52 } 53 54 return s, nil 55 } 56 57 func DeleteSecret(ctx context.Context, gcpProject, secretID string) error { 58 client, err := secretmanager.NewClient(ctx) 59 if err != nil { 60 return err 61 } 62 defer client.Close() 63 64 project := fmt.Sprintf("projects/%v", gcpProject) 65 _ = client.ListSecrets(ctx, &secretmanagerpb.ListSecretsRequest{ 66 Parent: project, 67 PageSize: int32(500), 68 }) 69 70 req := &secretmanagerpb.DeleteSecretRequest{ 71 Name: fmt.Sprintf("%v/secrets/%v", project, secretID), 72 } 73 74 err = client.DeleteSecret(ctx, req) 75 if err != nil { 76 apiError, ok := apierror.FromError(err) 77 if ok { 78 if apiError.GRPCStatus().Code() == codes.NotFound { 79 return nil 80 } 81 } 82 83 return err 84 } 85 86 return nil 87 }