in pkg/berglas/create.go [106:190]
func (c *Client) secretManagerCreate(ctx context.Context, i *SecretManagerCreateRequest) (*Secret, error) {
project := i.Project
if project == "" {
return nil, fmt.Errorf("missing project")
}
name := i.Name
if name == "" {
return nil, fmt.Errorf("missing secret name")
}
plaintext := i.Plaintext
if plaintext == nil {
return nil, fmt.Errorf("missing plaintext")
}
var replication *secretspb.Replication
if len(i.Locations) == 0 {
replication = &secretspb.Replication{
Replication: &secretspb.Replication_Automatic_{
Automatic: &secretspb.Replication_Automatic{},
},
}
} else {
sort.Strings(i.Locations)
replicas := make([]*secretspb.Replication_UserManaged_Replica, len(i.Locations))
for n, loc := range i.Locations {
replicas[n] = &secretspb.Replication_UserManaged_Replica{Location: loc}
}
replication = &secretspb.Replication{
Replication: &secretspb.Replication_UserManaged_{
UserManaged: &secretspb.Replication_UserManaged{
Replicas: replicas,
},
},
}
}
logger := logging.FromContext(ctx).With(
"project", project,
"name", name,
)
logger.DebugContext(ctx, "create.start")
defer logger.DebugContext(ctx, "create.finish")
logger.DebugContext(ctx, "creating secret")
secretResp, err := c.secretManagerClient.CreateSecret(ctx, &secretspb.CreateSecretRequest{
Parent: fmt.Sprintf("projects/%s", project),
SecretId: name,
Secret: &secretspb.Secret{Replication: replication},
})
if err != nil {
terr, ok := grpcstatus.FromError(err)
if ok && terr.Code() == grpccodes.AlreadyExists {
return nil, errSecretAlreadyExists
}
return nil, fmt.Errorf("failed to create secret: %w", err)
}
logger.DebugContext(ctx, "creating secret version")
versionResp, err := c.secretManagerClient.AddSecretVersion(ctx, &secretspb.AddSecretVersionRequest{
Parent: secretResp.Name,
Payload: &secretspb.SecretPayload{
Data: plaintext,
},
})
if err != nil {
return nil, fmt.Errorf("failed to create secret version: %w", err)
}
return &Secret{
Parent: project,
Name: name,
Version: path.Base(versionResp.Name),
Plaintext: plaintext,
UpdatedAt: timestampToTime(versionResp.CreateTime),
Locations: i.Locations,
}, nil
}