Skip to content

Instantly share code, notes, and snippets.

@carnei-ro
Created February 23, 2024 17:27
Show Gist options
  • Save carnei-ro/373789fa1867f1de46536077a9399dd1 to your computer and use it in GitHub Desktop.
Save carnei-ro/373789fa1867f1de46536077a9399dd1 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"log"
"os"
httptransport "github.com/go-openapi/runtime/client"
resource_manager "github.com/hashicorp/hcp-sdk-go/clients/cloud-resource-manager/stable/2019-12-10/client"
"github.com/hashicorp/hcp-sdk-go/clients/cloud-resource-manager/stable/2019-12-10/client/project_service"
hcpvaultsecrets "github.com/hashicorp/hcp-sdk-go/clients/cloud-vault-secrets/stable/2023-06-13/client"
"github.com/hashicorp/hcp-sdk-go/clients/cloud-vault-secrets/stable/2023-06-13/client/secret_service"
hcpconfig "github.com/hashicorp/hcp-sdk-go/config"
hcpclient "github.com/hashicorp/hcp-sdk-go/httpclient"
)
func hcpClient() (*httptransport.Runtime, error) {
client_id := os.Getenv("HCP_CLIENT_ID")
client_secret := os.Getenv("HCP_CLIENT_SECRET")
hcpConfig, err := hcpconfig.NewHCPConfig(
hcpconfig.WithClientCredentials(
client_id,
client_secret,
),
)
if err != nil {
return nil, err
}
cl, err := hcpclient.New(hcpclient.Config{
HCPConfig: hcpConfig,
})
if err != nil {
return nil, err
}
return cl, nil
}
func resourceManagerClient() (*resource_manager.CloudResourceManager, error) {
cl, err := hcpClient()
if err != nil {
return nil, err
}
rmClient := resource_manager.New(cl, nil)
return rmClient, nil
}
func vaultSecretsClient() (*hcpvaultsecrets.CloudVaultSecrets, error) {
cl, err := hcpClient()
if err != nil {
return nil, err
}
vsClient := hcpvaultsecrets.New(cl, nil)
return vsClient, nil
}
func getOrganizationID(rmClient *resource_manager.CloudResourceManager) (string, error) {
orgID := os.Getenv("HCP_ORGANIZATION_ID")
if orgID != "" {
return orgID, nil
}
organizations, err := rmClient.OrganizationService.OrganizationServiceList(nil, nil)
if err != nil {
return "", err
}
orgName := os.Getenv("HCP_ORGANIZATION_NAME")
if orgName != "" {
for _, org := range organizations.Payload.Organizations {
if org.Name == orgName {
return org.ID, nil
}
}
}
if len(organizations.Payload.Organizations) == 0 {
return "", fmt.Errorf("no organizations found")
}
return organizations.Payload.Organizations[0].ID, nil
}
func getProjectID(rmClient *resource_manager.CloudResourceManager, organizationID string) (string, error) {
projectID := os.Getenv("HCP_PROJECT_ID")
if projectID != "" {
return projectID, nil
}
scopeType := "ORGANIZATION"
projects, err := rmClient.ProjectService.ProjectServiceList(
project_service.NewProjectServiceListParams().WithScopeType(&scopeType).WithScopeID(&organizationID),
nil,
)
if err != nil {
return "", err
}
projectName := os.Getenv("HCP_PROJECT_NAME")
if projectName != "" {
for _, project := range projects.Payload.Projects {
if project.Name == projectName {
return project.ID, nil
}
}
}
if len(projects.Payload.Projects) == 0 {
return "", fmt.Errorf("no projects found")
}
return projects.Payload.Projects[0].ID, nil
}
func getSecrets(vsClient *hcpvaultsecrets.CloudVaultSecrets, organizationID string, projectID string, appName string) (map[string]string, error) {
secrets, err := vsClient.SecretService.OpenAppSecrets(
secret_service.NewOpenAppSecretsParams().
WithAppName(appName).
WithLocationOrganizationID(organizationID).
WithLocationProjectID(projectID),
nil,
)
if err != nil {
return nil, err
}
secretsMap := make(map[string]string)
for _, secret := range secrets.Payload.Secrets {
secretsMap[secret.Name] = secret.Version.Value
}
return secretsMap, nil
}
func main() {
rmClient, err := resourceManagerClient()
if err != nil {
log.Fatalln(err)
}
organizationID, err := getOrganizationID(rmClient)
if err != nil {
log.Fatalln(err)
}
projectID, err := getProjectID(rmClient, organizationID)
if err != nil {
log.Fatalln(err)
}
fmt.Println("Organization ID: ", organizationID)
fmt.Println("Project ID: ", projectID)
vaultSecretsClient, err := vaultSecretsClient()
if err != nil {
log.Fatalln(err)
}
appName := os.Getenv("HCP_APPLICATION_NAME")
secrets, err := getSecrets(vaultSecretsClient, organizationID, projectID, appName)
if err != nil {
log.Fatalln(err)
}
fmt.Println("Secrets: ", secrets)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment