env.go raw
1 package scw
2
3 import (
4 "os"
5 "strconv"
6
7 "github.com/scaleway/scaleway-sdk-go/logger"
8 )
9
10 // Environment variables
11 const (
12 // Up-to-date
13 ScwCacheDirEnv = "SCW_CACHE_DIR"
14 ScwConfigPathEnv = "SCW_CONFIG_PATH"
15 ScwAccessKeyEnv = "SCW_ACCESS_KEY"
16 ScwSecretKeyEnv = "SCW_SECRET_KEY" // #nosec G101
17 ScwActiveProfileEnv = "SCW_PROFILE"
18 ScwAPIURLEnv = "SCW_API_URL"
19 ScwInsecureEnv = "SCW_INSECURE"
20 ScwDefaultOrganizationIDEnv = "SCW_DEFAULT_ORGANIZATION_ID"
21 ScwDefaultProjectIDEnv = "SCW_DEFAULT_PROJECT_ID"
22 ScwDefaultRegionEnv = "SCW_DEFAULT_REGION"
23 ScwDefaultZoneEnv = "SCW_DEFAULT_ZONE"
24 ScwEnableBeta = "SCW_ENABLE_BETA"
25 DebugEnv = logger.DebugEnv
26
27 // All deprecated (cli&terraform)
28 terraformAccessKeyEnv = "SCALEWAY_ACCESS_KEY" // used both as access key and secret key
29 terraformSecretKeyEnv = "SCALEWAY_TOKEN"
30 terraformOrganizationEnv = "SCALEWAY_ORGANIZATION"
31 terraformRegionEnv = "SCALEWAY_REGION"
32 cliTLSVerifyEnv = "SCW_TLSVERIFY"
33 cliOrganizationEnv = "SCW_ORGANIZATION"
34 cliRegionEnv = "SCW_REGION"
35 cliSecretKeyEnv = "SCW_TOKEN"
36
37 // TBD
38 // cliVerboseEnv = "SCW_VERBOSE_API"
39 // cliDebugEnv = "DEBUG"
40 // cliNoCheckVersionEnv = "SCW_NOCHECKVERSION"
41 // cliTestWithRealAPIEnv = "TEST_WITH_REAL_API"
42 // cliSecureExecEnv = "SCW_SECURE_EXEC"
43 // cliGatewayEnv = "SCW_GATEWAY"
44 // cliSensitiveEnv = "SCW_SENSITIVE"
45 // cliAccountAPIEnv = "SCW_ACCOUNT_API"
46 // cliMetadataAPIEnv = "SCW_METADATA_API"
47 // cliMarketPlaceAPIEnv = "SCW_MARKETPLACE_API"
48 // cliComputePar1APIEnv = "SCW_COMPUTE_PAR1_API"
49 // cliComputeAms1APIEnv = "SCW_COMPUTE_AMS1_API"
50 // cliCommercialTypeEnv = "SCW_COMMERCIAL_TYPE"
51 // cliTargetArchEnv = "SCW_TARGET_ARCH"
52 )
53
54 const (
55 v1RegionFrPar = "par1"
56 v1RegionNlAms = "ams1"
57 )
58
59 func LoadEnvProfile() *Profile {
60 p := &Profile{}
61
62 accessKey, _, envExist := getEnv(ScwAccessKeyEnv, terraformAccessKeyEnv)
63 if envExist {
64 p.AccessKey = &accessKey
65 }
66
67 secretKey, _, envExist := getEnv(ScwSecretKeyEnv, cliSecretKeyEnv, terraformSecretKeyEnv, terraformAccessKeyEnv)
68 if envExist {
69 p.SecretKey = &secretKey
70 }
71
72 apiURL, _, envExist := getEnv(ScwAPIURLEnv)
73 if envExist {
74 p.APIURL = &apiURL
75 }
76
77 insecureValue, envKey, envExist := getEnv(ScwInsecureEnv, cliTLSVerifyEnv)
78 if envExist {
79 insecure, err := strconv.ParseBool(insecureValue)
80 if err != nil {
81 logger.Warningf("env variable %s cannot be parsed: %s is invalid boolean", envKey, insecureValue)
82 }
83
84 if envKey == cliTLSVerifyEnv {
85 insecure = !insecure // TLSVerify is the inverse of Insecure
86 }
87
88 p.Insecure = &insecure
89 }
90
91 organizationID, _, envExist := getEnv(ScwDefaultOrganizationIDEnv, cliOrganizationEnv, terraformOrganizationEnv)
92 if envExist {
93 p.DefaultOrganizationID = &organizationID
94 }
95
96 projectID, _, envExist := getEnv(ScwDefaultProjectIDEnv)
97 if envExist {
98 p.DefaultProjectID = &projectID
99 }
100
101 region, _, envExist := getEnv(ScwDefaultRegionEnv, cliRegionEnv, terraformRegionEnv)
102 if envExist {
103 region = v1RegionToV2(region)
104 p.DefaultRegion = ®ion
105 }
106
107 zone, _, envExist := getEnv(ScwDefaultZoneEnv)
108 if envExist {
109 p.DefaultZone = &zone
110 }
111
112 return p
113 }
114
115 func getEnv(upToDateKey string, deprecatedKeys ...string) (string, string, bool) {
116 value, exist := os.LookupEnv(upToDateKey)
117 if exist {
118 logger.Debugf("reading value from %s\n", upToDateKey)
119 return value, upToDateKey, true
120 }
121
122 for _, key := range deprecatedKeys {
123 value, exist := os.LookupEnv(key)
124 if exist {
125 logger.Debugf("reading value from %s\n", key)
126 logger.Warningf("%s is deprecated, please use %s instead\n", key, upToDateKey)
127 return value, key, true
128 }
129 }
130
131 return "", "", false
132 }
133
134 func v1RegionToV2(region string) string {
135 switch region {
136 case v1RegionFrPar:
137 logger.Warningf("par1 is a deprecated name for region, use fr-par instead")
138 return "fr-par"
139 case v1RegionNlAms:
140 logger.Warningf("ams1 is a deprecated name for region, use nl-ams instead")
141 return "nl-ams"
142 default:
143 return region
144 }
145 }
146