| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package configutil |
| |
| import ( |
| "fmt" |
| "os" |
| |
| "github.com/hashicorp/go-multierror" |
| "github.com/hashicorp/hcl" |
| "github.com/hashicorp/hcl/hcl/ast" |
| sdkResource "github.com/hashicorp/hcp-sdk-go/resource" |
| ) |
| |
| // HCPLinkConfig is the HCP Link configuration for the server. |
| type HCPLinkConfig struct { |
| UnusedKeys UnusedKeyMap `hcl:",unusedKeyPositions"` |
| |
| ResourceIDRaw string `hcl:"resource_id"` |
| Resource *sdkResource.Resource `hcl:"-"` |
| EnableAPICapability bool `hcl:"enable_api_capability"` |
| EnablePassThroughCapability bool `hcl:"enable_passthrough_capability"` |
| ClientID string `hcl:"client_id"` |
| ClientSecret string `hcl:"client_secret"` |
| } |
| |
| func parseCloud(result *SharedConfig, list *ast.ObjectList) error { |
| if len(list.Items) > 1 { |
| return fmt.Errorf("only one 'cloud' block is permitted") |
| } |
| |
| // Get our one item |
| item := list.Items[0] |
| |
| if result.HCPLinkConf == nil { |
| result.HCPLinkConf = &HCPLinkConfig{} |
| } |
| |
| if err := hcl.DecodeObject(&result.HCPLinkConf, item.Val); err != nil { |
| return multierror.Prefix(err, "cloud:") |
| } |
| |
| // let's check if the Client ID and Secret are set in the environment |
| if envClientID := os.Getenv("HCP_CLIENT_ID"); envClientID != "" { |
| result.HCPLinkConf.ClientID = envClientID |
| } |
| if envClientSecret := os.Getenv("HCP_CLIENT_SECRET"); envClientSecret != "" { |
| result.HCPLinkConf.ClientSecret = envClientSecret |
| } |
| |
| // three pieces are necessary if the cloud stanza is configured |
| if result.HCPLinkConf.ResourceIDRaw == "" || result.HCPLinkConf.ClientID == "" || result.HCPLinkConf.ClientSecret == "" { |
| return multierror.Prefix(fmt.Errorf("failed to find the required cloud stanza configurations. all resource ID, client ID and client secret are required"), "cloud:") |
| } |
| |
| res, err := sdkResource.FromString(result.HCPLinkConf.ResourceIDRaw) |
| if err != nil { |
| return multierror.Prefix(fmt.Errorf("failed to parse resource_id for HCP Link"), "cloud:") |
| } |
| result.HCPLinkConf.Resource = &res |
| |
| // ENV var takes precedence over the config value |
| if apiCapEnv := os.Getenv("HCP_LINK_ENABLE_API_CAPABILITY"); apiCapEnv != "" { |
| result.HCPLinkConf.EnableAPICapability = true |
| } |
| |
| if passthroughCapEnv := os.Getenv("HCP_LINK_ENABLE_PASSTHROUGH_CAPABILITY"); passthroughCapEnv != "" { |
| result.HCPLinkConf.EnablePassThroughCapability = true |
| } |
| |
| return nil |
| } |