Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CDPCP-9511 Ability to set CDP Region #32

Merged
merged 1 commit into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 30 additions & 6 deletions cdp-sdk-go/cdp/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,47 +75,71 @@ func NewClient(config *Config) (*Client, error) {
}

func NewIamClient(config *Config) (*iamclient.Iam, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("iam", true))
apiEndpoint, err := config.GetEndpoint("iam", true)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
return iamclient.New(transport, nil), nil
}

func NewEnvironmentsClient(config *Config) (*environmentsclient.Environments, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("environments", false))
apiEndpoint, err := config.GetEndpoint("environments", false)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
return environmentsclient.New(transport, nil), nil
}

func NewDatalakeClient(config *Config) (*datalakeclient.Datalake, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("datalake", false))
apiEndpoint, err := config.GetEndpoint("datalake", false)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
return datalakeclient.New(transport, nil), nil
}

func NewDatahubClient(config *Config) (*datahubclient.Datahub, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("datahub", false))
apiEndpoint, err := config.GetEndpoint("datahub", false)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
return datahubclient.New(transport, nil), nil
}

func NewMlClient(config *Config) (*mlclient.Ml, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("ml", false))
apiEndpoint, err := config.GetEndpoint("ml", false)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
return mlclient.New(transport, nil), nil
}

func NewDwClient(config *Config) (*dwclient.Dw, error) {
transport, err := buildClientTransportWithDefaultHttpTransport(config, config.GetEndpoint("dw", false))
apiEndpoint, err := config.GetEndpoint("dw", false)
if err != nil {
return nil, err
}
transport, err := buildClientTransportWithDefaultHttpTransport(config, apiEndpoint)
if err != nil {
return nil, err
}
Expand Down
168 changes: 126 additions & 42 deletions cdp-sdk-go/cdp/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ import (
"github.com/mitchellh/go-homedir"
)

// exported constants
const (
RegionUsWest1 = "us-west-1"
RegionEu1 = "eu-1"
RegionAp1 = "ap-1"
RegionUsg1 = "usg-1"
)

const (
// These environment variables (and the ones below in the code are shared between the python CDP CLI, the Java SDK,
// GoLang SDK and the Terraform provider for CDP. These should be treated as a compatibility surface.
Expand All @@ -40,18 +48,23 @@ const (

defaultLocalEnvironment = "false"

defaultCdpApiEndpointUrl = "https://api.us-west-1.cdp.cloudera.com/"
defaultAltusApiEndpointUrl = "https://%sapi.us-west-1.altus.cloudera.com/"
cdpApiEndpoint = "https://api.%s.cdp.cloudera.com/"
cdpApiEndpointGov = "https://api.%s.cdp.clouderagovt.com/"
altusApiEndpoint = "https://%%sapi.%s.altus.cloudera.com/"

cdpDir = ".cdp"
credentialsFile = "credentials"
configFile = "config"

// CDP defaults to using 'us-west-1'
defaultCdpRegion = RegionUsWest1
)

type Config struct {
CdpApiEndpointUrl string
AltusApiEndpointUrl string
Profile string
CdpRegion string
Credentials *Credentials
BaseApiPath string
ConfigFile string
Expand Down Expand Up @@ -88,14 +101,22 @@ func (config *Config) loadConfig() error {
}
config.properties = config.convertProfileMap(properties)

credentialsFile, err := config.GetCdpCredentialsFile()
if err != nil {
return err
}
cdpProfile, err := config.GetCdpProfile()
if err != nil {
return err
}
// Default provider chain. By default, it first checks whether the given Config contains any, then it
// checks the environment variables, and lastly it checks the credentials from the shared credentials file
// under ~/.cdp/credentials.
config.credentialsProvider = &ChainCredentialsProvider{
ProviderChain: []CredentialsProvider{
&StaticCredentialsProvider{Credentials: config.Credentials},
&EnvCredentialsProvider{},
NewFileCredentialsProvider(config.GetCdpCredentialsFile(), config.GetCdpProfile()),
NewFileCredentialsProvider(credentialsFile, cdpProfile),
},
}

Expand All @@ -117,6 +138,11 @@ func (config *Config) WithProfile(profile string) *Config {
return config
}

func (config *Config) WithCdpRegion(cdpRegion string) *Config {
config.CdpRegion = cdpRegion
return config
}

func (config *Config) WithCredentials(credentials *Credentials) *Config {
config.Credentials = credentials
return config
Expand Down Expand Up @@ -192,58 +218,68 @@ var propertySchemas = map[string]propertySchema{
defaultFunc: defaultCdpCredentialsFile,
},
"cdp_profile": {
envVars: []string{cdpDefaultProfileEnvVar, cdpProfileEnvVar},
configKey: "",
defaultFunc: func() (string, error) {
return cdpDefaultProfile, nil
},
envVars: []string{cdpDefaultProfileEnvVar, cdpProfileEnvVar},
configKey: "",
defaultFunc: stringSupplier(cdpDefaultProfile),
},
"cdp_region": {
envVars: []string{"CDP_REGION"},
configKey: "cdp_region",
defaultFunc: stringSupplier(defaultCdpRegion),
},
"cdp_endpoint_url": {
envVars: []string{"CDP_ENDPOINT_URL"},
configKey: "cdp_endpoint_url",
defaultFunc: func() (string, error) {
return defaultCdpApiEndpointUrl, nil
},
envVars: []string{"CDP_ENDPOINT_URL"},
configKey: "cdp_endpoint_url",
defaultFunc: stringSupplier(""),
},
"altus_endpoint_url": {
envVars: []string{"ENDPOINT_URL"},
configKey: "endpoint_url",
defaultFunc: func() (string, error) {
return defaultAltusApiEndpointUrl, nil
},
envVars: []string{"ENDPOINT_URL"},
configKey: "endpoint_url",
defaultFunc: stringSupplier(""),
},
"local_environment": {
envVars: []string{"LOCAL_ENVIRONMENT"},
configKey: "local_environment",
defaultFunc: func() (string, error) {
return defaultLocalEnvironment, nil
},
envVars: []string{"LOCAL_ENVIRONMENT"},
configKey: "local_environment",
defaultFunc: stringSupplier(defaultLocalEnvironment),
},
}

func (config *Config) GetCdpProfile() string {
val, _ := config.getVal(config.Profile, propertySchemas["cdp_profile"])
return val
func (config *Config) GetCdpProfile() (string, error) {
return config.getVal(config.Profile, propertySchemas["cdp_profile"])
}

func (config *Config) GetCdpApiEndpoint() string {
val, _ := config.getVal(config.CdpApiEndpointUrl, propertySchemas["cdp_endpoint_url"])
return val
func (config *Config) GetCdpRegion() (string, error) {
return config.getVal(config.CdpRegion, propertySchemas["cdp_region"])
}

func (config *Config) GetAltusApiEndpoint() string {
val, _ := config.getVal(config.AltusApiEndpointUrl, propertySchemas["altus_endpoint_url"])
return val
func (config *Config) GetCdpApiEndpoint() (string, error) {
val, err := config.getVal(config.CdpApiEndpointUrl, propertySchemas["cdp_endpoint_url"])
if err != nil {
return val, err
}
if val == "" {
return defaultCdpEndpoint(config)
}
return val, err
}

func (config *Config) GetAltusApiEndpoint() (string, error) {
val, err := config.getVal(config.AltusApiEndpointUrl, propertySchemas["altus_endpoint_url"])
if err != nil {
return val, err
}
if val == "" {
return defaultAltusEndpoint(config)
}
return val, err
}

func (config *Config) GetCdpConfigFile() string {
val, _ := config.getVal(config.ConfigFile, propertySchemas["cdp_config_file"])
return val
func (config *Config) GetCdpConfigFile() (string, error) {
return config.getVal(config.ConfigFile, propertySchemas["cdp_config_file"])
}

func (config *Config) GetCdpCredentialsFile() string {
val, _ := config.getVal(config.CredentialsFile, propertySchemas["cdp_credentials_file"])
return val
func (config *Config) GetCdpCredentialsFile() (string, error) {
return config.getVal(config.CredentialsFile, propertySchemas["cdp_credentials_file"])
}

func (config *Config) GetLocalEnvironment() bool {
Expand All @@ -252,9 +288,16 @@ func (config *Config) GetLocalEnvironment() bool {
return boolVal
}

func (config *Config) GetEndpoint(serviceName string, isAltusService bool) string {
func (config *Config) GetEndpoint(serviceName string, isAltusService bool) (string, error) {
if isAltusService {
return fmt.Sprintf(config.GetAltusApiEndpoint(), serviceName)
altusEndpoint, err := config.GetAltusApiEndpoint()
if err != nil {
return "", err
}
if strings.Contains(altusEndpoint, "%s") {
return fmt.Sprintf(altusEndpoint, serviceName), nil
}
return altusEndpoint, nil
} else {
return config.GetCdpApiEndpoint()
}
Expand Down Expand Up @@ -296,8 +339,45 @@ func defaultCdpConfigFile() (string, error) {
return path, nil
}

func defaultCdpEndpoint(config *Config) (string, error) {
cdpRegion, err := config.GetCdpRegion()
if err != nil {
return "", err
}
switch cdpRegion {
case RegionUsg1:
return fmt.Sprintf(cdpApiEndpointGov, cdpRegion), nil
default:
return fmt.Sprintf(cdpApiEndpoint, cdpRegion), nil
}
}

func defaultAltusEndpoint(config *Config) (string, error) {
cdpRegion, err := config.GetCdpRegion()
if err != nil {
return "", err
}
switch cdpRegion {
case RegionUsWest1:
return fmt.Sprintf(altusApiEndpoint, cdpRegion), nil
default:
return defaultCdpEndpoint(config)
}
}

// stringSupplier returns a function that returns the input string and nil for error.
func stringSupplier(s string) func() (string, error) {
return func() (string, error) {
return s, nil
}
}

func (config *Config) loadConfigFile() (map[string]map[string]string, error) {
properties, err := rawParseConfigFile(config.GetCdpConfigFile())
configFile, err := config.GetCdpConfigFile()
if err != nil {
return nil, err
}
properties, err := rawParseConfigFile(configFile)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -357,7 +437,11 @@ func (config *Config) getVal(val string, meta propertySchema) (string, error) {
}

if meta.configKey != "" {
scopedConfig := config.properties[config.GetCdpProfile()]
profile, err := config.GetCdpProfile()
if err != nil {
return "", err
}
scopedConfig := config.properties[profile]
val, ok := scopedConfig[meta.configKey]
if ok && strings.TrimSpace(val) != "" {
return strings.TrimSpace(val), nil
Expand Down
Loading
Loading