internal/secmgr/secrets.go (67 lines of code) (raw):
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package secmgr
import (
"context"
"fmt"
"internal/apiclient"
secretmanager "cloud.google.com/go/secretmanager/apiv1"
"cloud.google.com/go/secretmanager/apiv1/secretmanagerpb"
)
// secretExists the latest secret version
func secretExists(project string, name string) (version string, err error) {
// Create the client.
ctx := context.Background()
client, err := secretmanager.NewClient(ctx)
if err != nil {
return "", err
}
defer client.Close()
// Build the request.
req := &secretmanagerpb.GetSecretVersionRequest{
Name: fmt.Sprintf("projects/%s/secrets/%s/versions/latest", project, name),
}
// Call the API.
secretVersion, err := client.GetSecretVersion(ctx, req)
if err != nil {
return "", err
}
return secretVersion.Name, nil
}
// Create a new secret in secret manager
func Create(project string, secretId string, payload []byte) (version string, err error) {
if version, err = secretExists(project, secretId); err == nil {
return version, nil // secret exists, return
}
ctx := context.Background()
c, err := secretmanager.NewClient(ctx)
if err != nil {
return "", err
}
defer c.Close()
// secret manager location
replica := &secretmanagerpb.Replication_UserManaged_Replica{}
replica.Location = apiclient.GetRegion()
replicas := []*secretmanagerpb.Replication_UserManaged_Replica{}
replicas = append(replicas, replica)
// Create the request to create the secret.
req := &secretmanagerpb.CreateSecretRequest{
Parent: fmt.Sprintf("projects/%s", project),
SecretId: secretId,
Secret: &secretmanagerpb.Secret{
Replication: &secretmanagerpb.Replication{
Replication: &secretmanagerpb.Replication_UserManaged_{
UserManaged: &secretmanagerpb.Replication_UserManaged{
Replicas: replicas,
},
},
},
},
}
secret, err := c.CreateSecret(ctx, req)
if err != nil {
return "", err
}
// Build the request.
addSecretVersionReq := &secretmanagerpb.AddSecretVersionRequest{
Parent: secret.Name,
Payload: &secretmanagerpb.SecretPayload{
Data: payload,
},
}
// Call the API.
secretVersion, err := c.AddSecretVersion(ctx, addSecretVersionReq)
if err != nil {
return "", err
}
return secretVersion.Name, nil
}