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 = &region
 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