util.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. limitations under the License.
  10. */
  11. package gcp
  12. import (
  13. "context"
  14. "fmt"
  15. secretmanager "cloud.google.com/go/secretmanager/apiv1"
  16. "golang.org/x/oauth2/google"
  17. "google.golang.org/api/option"
  18. secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
  19. gcpsm "github.com/external-secrets/external-secrets/pkg/provider/gcp/secretmanager"
  20. )
  21. // CreateAWSSecretsManagerSecret creates a sm secret with the given value.
  22. func createGCPSecretsManagerSecret(projectID, secretName, secretValue string, credentials []byte) (*secretmanagerpb.Secret, error) {
  23. ctx := context.Background()
  24. config, err := google.JWTConfigFromJSON(credentials, gcpsm.CloudPlatformRole)
  25. if err != nil {
  26. return nil, fmt.Errorf("unable to procces JSON credentials: %w", err)
  27. }
  28. ts := config.TokenSource(ctx)
  29. client, err := secretmanager.NewClient(ctx, option.WithTokenSource(ts))
  30. if err != nil {
  31. return nil, fmt.Errorf("failed to setup client: %w", err)
  32. }
  33. defer client.Close()
  34. // Create the request to create the secret.
  35. createSecretReq := &secretmanagerpb.CreateSecretRequest{
  36. Parent: fmt.Sprintf("projects/%s", projectID),
  37. SecretId: secretName,
  38. Secret: &secretmanagerpb.Secret{
  39. Replication: &secretmanagerpb.Replication{
  40. Replication: &secretmanagerpb.Replication_Automatic_{
  41. Automatic: &secretmanagerpb.Replication_Automatic{},
  42. },
  43. },
  44. },
  45. }
  46. secret, err := client.CreateSecret(ctx, createSecretReq)
  47. if err != nil {
  48. return nil, fmt.Errorf("failed to create secret: %w", err)
  49. }
  50. // Declare the payload to store.
  51. payload := []byte(secretValue)
  52. // Build the request.
  53. addSecretVersionReq := &secretmanagerpb.AddSecretVersionRequest{
  54. Parent: secret.Name,
  55. Payload: &secretmanagerpb.SecretPayload{
  56. Data: payload,
  57. },
  58. }
  59. // Call the API.
  60. _, err = client.AddSecretVersion(ctx, addSecretVersionReq)
  61. if err != nil {
  62. return nil, fmt.Errorf("failed to add secret version: %w", err)
  63. }
  64. return secret, err
  65. }
  66. // deleteSecret deletes the secret with the given name and all of its versions.
  67. func deleteGCPSecretsManagerSecret(secretName string, credentials []byte) error {
  68. ctx := context.Background()
  69. config, err := google.JWTConfigFromJSON(credentials, gcpsm.CloudPlatformRole)
  70. if err != nil {
  71. return fmt.Errorf("unable to procces JSON credentials: %w", err)
  72. }
  73. ts := config.TokenSource(ctx)
  74. client, err := secretmanager.NewClient(ctx, option.WithTokenSource(ts))
  75. if err != nil {
  76. return fmt.Errorf("failed to setup client: %w", err)
  77. }
  78. defer client.Close()
  79. // Build the request.
  80. req := &secretmanagerpb.DeleteSecretRequest{
  81. Name: secretName,
  82. }
  83. // Call the API.
  84. if err := client.DeleteSecret(ctx, req); err != nil {
  85. return fmt.Errorf("failed to delete secret: %w", err)
  86. }
  87. return nil
  88. }