Skip to content

Commit

Permalink
Clean up Lifecycle Manager (#2897)
Browse files Browse the repository at this point in the history
  • Loading branch information
gapra-msft authored Jan 15, 2025
1 parent fe5ad83 commit 903f41c
Show file tree
Hide file tree
Showing 30 changed files with 99 additions and 125 deletions.
6 changes: 3 additions & 3 deletions cmd/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -1349,7 +1349,7 @@ func (cca *CookedCopyCmdArgs) processRedirectionUpload(blobResource common.Resou
ctx := context.WithValue(context.TODO(), ste.ServiceAPIVersionOverride, ste.DefaultServiceApiVersion)

// Use the concurrency environment value
concurrencyEnvVar := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ConcurrencyValue())
concurrencyEnvVar := common.GetEnvironmentVariable(common.EEnvironmentVariable.ConcurrencyValue())

pipingUploadParallelism := pipingUploadParallelism
if concurrencyEnvVar != "" {
Expand Down Expand Up @@ -1485,7 +1485,7 @@ func (cca *CookedCopyCmdArgs) getSrcCredential(ctx context.Context, jpo *common.
func (cca *CookedCopyCmdArgs) processCopyJobPartOrders() (err error) {
ctx := context.WithValue(context.TODO(), ste.ServiceAPIVersionOverride, ste.DefaultServiceApiVersion)
// Make AUTO default for Azure Files since Azure Files throttles too easily unless user specified concurrency value
if jobsAdmin.JobsAdmin != nil && (cca.FromTo.From() == common.ELocation.File() || cca.FromTo.To() == common.ELocation.File()) && glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ConcurrencyValue()) == "" {
if jobsAdmin.JobsAdmin != nil && (cca.FromTo.From() == common.ELocation.File() || cca.FromTo.To() == common.ELocation.File()) && common.GetEnvironmentVariable(common.EEnvironmentVariable.ConcurrencyValue()) == "" {
jobsAdmin.JobsAdmin.SetConcurrencySettingsToAuto()
}

Expand Down Expand Up @@ -1971,7 +1971,7 @@ func getPerfDisplayText(perfDiagnosticStrings []string, constraint common.PerfCo
}

func shouldDisplayPerfStates() bool {
return glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ShowPerfStates()) != ""
return common.GetEnvironmentVariable(common.EEnvironmentVariable.ShowPerfStates()) != ""
}

func isStdinPipeIn() (bool, error) {
Expand Down
40 changes: 20 additions & 20 deletions cmd/credentialUtil.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,32 +89,32 @@ func GetOAuthTokenManagerInstance() (*common.UserOAuthTokenManager, error) {
var err error
autoOAuth.Do(func() {
var lca loginCmdArgs
autoLoginType := strings.ToLower(glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AutoLoginType()))
autoLoginType := strings.ToLower(common.GetEnvironmentVariable(common.EEnvironmentVariable.AutoLoginType()))
if autoLoginType == "" {
glcm.Info("Autologin not specified.")
return
}

if tenantID := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.TenantID()); tenantID != "" {
if tenantID := common.GetEnvironmentVariable(common.EEnvironmentVariable.TenantID()); tenantID != "" {
lca.tenantID = tenantID
}

if endpoint := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AADEndpoint()); endpoint != "" {
if endpoint := common.GetEnvironmentVariable(common.EEnvironmentVariable.AADEndpoint()); endpoint != "" {
lca.aadEndpoint = endpoint
}

// Fill up lca
lca.loginType = autoLoginType
switch autoLoginType {
case common.EAutoLoginType.SPN().String():
lca.applicationID = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ApplicationID())
lca.certPath = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePath())
lca.certPass = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePassword())
lca.clientSecret = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ClientSecret())
lca.applicationID = common.GetEnvironmentVariable(common.EEnvironmentVariable.ApplicationID())
lca.certPath = common.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePath())
lca.certPass = common.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePassword())
lca.clientSecret = common.GetEnvironmentVariable(common.EEnvironmentVariable.ClientSecret())
case common.EAutoLoginType.MSI().String():
lca.identityClientID = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityClientID())
lca.identityObjectID = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityObjectID())
lca.identityResourceID = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityResourceString())
lca.identityClientID = common.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityClientID())
lca.identityObjectID = common.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityObjectID())
lca.identityResourceID = common.GetEnvironmentVariable(common.EEnvironmentVariable.ManagedIdentityResourceString())
case common.EAutoLoginType.Device().String():
case common.EAutoLoginType.AzCLI().String():
case common.EAutoLoginType.PsCred().String():
Expand Down Expand Up @@ -174,7 +174,7 @@ var stashedEnvCredType = ""
func GetCredTypeFromEnvVar() common.CredentialType {
rawVal := stashedEnvCredType
if stashedEnvCredType == "" {
rawVal = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.CredentialType())
rawVal = common.GetEnvironmentVariable(common.EEnvironmentVariable.CredentialType())
if rawVal == "" {
return common.ECredentialType.Unknown()
}
Expand All @@ -183,7 +183,7 @@ func GetCredTypeFromEnvVar() common.CredentialType {

// Remove the env var after successfully fetching once,
// in case of env var is further spreading into child processes unexpectedly.
glcm.ClearEnvironmentVariable(common.EEnvironmentVariable.CredentialType())
common.ClearEnvironmentVariable(common.EEnvironmentVariable.CredentialType())

// Try to get the value set.
var credType common.CredentialType
Expand Down Expand Up @@ -364,7 +364,7 @@ func isPublic(ctx context.Context, blobResourceURL string, cpkOptions common.Cpk
RetryDelay: ste.UploadRetryDelay,
MaxRetryDelay: ste.UploadMaxRetryDelay,
}, policy.TelemetryOptions{
ApplicationID: glcm.AddUserAgentPrefix(common.UserAgent),
ApplicationID: common.AddUserAgentPrefix(common.UserAgent),
}, nil, ste.LogOptions{}, nil)

blobClient, _ := blob.NewClientWithNoCredential(bURLParts.String(), &blob.ClientOptions{ClientOptions: clientOptions})
Expand Down Expand Up @@ -397,7 +397,7 @@ func mdAccountNeedsOAuth(ctx context.Context, blobResourceURL string, cpkOptions
RetryDelay: ste.UploadRetryDelay,
MaxRetryDelay: ste.UploadMaxRetryDelay,
}, policy.TelemetryOptions{
ApplicationID: glcm.AddUserAgentPrefix(common.UserAgent),
ApplicationID: common.AddUserAgentPrefix(common.UserAgent),
}, nil, ste.LogOptions{}, nil)

blobClient, _ := blob.NewClientWithNoCredential(blobResourceURL, &blob.ClientOptions{ClientOptions: clientOptions})
Expand Down Expand Up @@ -454,8 +454,8 @@ func doGetCredentialTypeForLocation(ctx context.Context, location common.Locatio
}

if location == common.ELocation.S3() {
accessKeyID := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AWSAccessKeyID())
secretAccessKey := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AWSSecretAccessKey())
accessKeyID := common.GetEnvironmentVariable(common.EEnvironmentVariable.AWSAccessKeyID())
secretAccessKey := common.GetEnvironmentVariable(common.EEnvironmentVariable.AWSSecretAccessKey())
if accessKeyID == "" || secretAccessKey == "" {
credType = common.ECredentialType.S3PublicBucket()
public = true
Expand All @@ -467,7 +467,7 @@ func doGetCredentialTypeForLocation(ctx context.Context, location common.Locatio
}

if location == common.ELocation.GCP() {
googleAppCredentials := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.GoogleAppCredentials())
googleAppCredentials := common.GetEnvironmentVariable(common.EEnvironmentVariable.GoogleAppCredentials())
if googleAppCredentials == "" {
return common.ECredentialType.Unknown(), false, errors.New("GOOGLE_APPLICATION_CREDENTIALS environment variable must be set before using GCP transfer feature")
}
Expand Down Expand Up @@ -508,8 +508,8 @@ func doGetCredentialTypeForLocation(ctx context.Context, location common.Locatio
// BlobFS currently supports Shared key. Remove this piece of code, once
// we deprecate that.
if location == common.ELocation.BlobFS() {
name := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AccountName())
key := glcm.GetEnvironmentVariable(common.EEnvironmentVariable.AccountKey())
name := common.GetEnvironmentVariable(common.EEnvironmentVariable.AccountName())
key := common.GetEnvironmentVariable(common.EEnvironmentVariable.AccountKey())
if name != "" && key != "" { // TODO: To remove, use for internal testing, SharedKey should not be supported from commandline
credType = common.ECredentialType.SharedKey()
warnIfSharedKeyAuthForDatalake()
Expand Down Expand Up @@ -591,7 +591,7 @@ func createClientOptions(logger common.ILoggerResetable, srcCred *common.ScopedC
RetryDelay: ste.UploadRetryDelay,
MaxRetryDelay: ste.UploadMaxRetryDelay,
}, policy.TelemetryOptions{
ApplicationID: glcm.AddUserAgentPrefix(common.UserAgent),
ApplicationID: common.AddUserAgentPrefix(common.UserAgent),
}, ste.NewAzcopyHTTPClient(frontEndMaxIdleConnectionsPerHost), logOptions, srcCred)
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ var envCmd = &cobra.Command{
Long: envCmdLongDescription,
Run: func(cmd *cobra.Command, args []string) {
for _, env := range common.VisibleEnvironmentVariables {
val := glcm.GetEnvironmentVariable(env)
val := common.GetEnvironmentVariable(env)
if env.Hidden && !showSensitive {
val = "REDACTED"
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ var lgCmd = &cobra.Command{
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
loginCmdArg.certPass = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePassword())
loginCmdArg.clientSecret = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.ClientSecret())
loginCmdArg.certPass = common.GetEnvironmentVariable(common.EEnvironmentVariable.CertificatePassword())
loginCmdArg.clientSecret = common.GetEnvironmentVariable(common.EEnvironmentVariable.ClientSecret())
loginCmdArg.persistToken = true

if loginCmdArg.certPass != "" || loginCmdArg.clientSecret != "" {
Expand Down
5 changes: 3 additions & 2 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ var rootCmd = &cobra.Command{
Short: rootCmdShortDescription,
Long: rootCmdLongDescription,
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
if glcm.GetEnvironmentVariable(common.EEnvironmentVariable.RequestTryTimeout()) != "" {
timeout, err := time.ParseDuration(glcm.GetEnvironmentVariable(common.EEnvironmentVariable.RequestTryTimeout()) + "m")
requestTryTimeout := common.GetEnvironmentVariable(common.EEnvironmentVariable.RequestTryTimeout())
if requestTryTimeout != "" {
timeout, err := time.ParseDuration(requestTryTimeout + "m")
if err == nil {
ste.UploadTryTimeout = timeout
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/zc_traverser_blob.go
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,7 @@ func newBlobTraverser(rawURL string, serviceClient *service.Client, ctx context.
isDFS: isDFS,
}

disableHierarchicalScanning := strings.ToLower(glcm.GetEnvironmentVariable(common.EEnvironmentVariable.DisableHierarchicalScanning()))
disableHierarchicalScanning := strings.ToLower(common.GetEnvironmentVariable(common.EEnvironmentVariable.DisableHierarchicalScanning()))

// disableHierarchicalScanning should be true for permanent delete
if (disableHierarchicalScanning == "false" || disableHierarchicalScanning == "") && includeDeleted && (includeSnapshot || includeVersion) {
Expand Down
2 changes: 1 addition & 1 deletion cmd/zc_traverser_gcp_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func (t *gcpServiceTraverser) Traverse(preprocessor objectMorpher, processor obj
}

func newGCPServiceTraverser(rawURL *url.URL, ctx context.Context, getProperties bool, incrementEnumerationCounter enumerationCounterFunc) (*gcpServiceTraverser, error) {
projectID = glcm.GetEnvironmentVariable(common.EEnvironmentVariable.GoogleCloudProject())
projectID = common.GetEnvironmentVariable(common.EEnvironmentVariable.GoogleCloudProject())
t := &gcpServiceTraverser{
ctx: ctx,
incrementEnumerationCounter: incrementEnumerationCounter,
Expand Down
19 changes: 0 additions & 19 deletions cmd/zt_interceptors_for_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ package cmd

import (
"fmt"
"os"

"github.com/Azure/azure-storage-azcopy/v10/common"
)

Expand Down Expand Up @@ -83,10 +81,6 @@ type mockedLifecycleManager struct {
outputFormat common.OutputFormat
}

func (m *mockedLifecycleManager) DownloadToTempPath() bool {
return false
}

func (m *mockedLifecycleManager) ReportAllJobPartsDone() {
}

Expand Down Expand Up @@ -143,24 +137,11 @@ func (*mockedLifecycleManager) SurrenderControl()
func (*mockedLifecycleManager) RegisterCloseFunc(func()) {}
func (mockedLifecycleManager) AllowReinitiateProgressReporting() {}
func (*mockedLifecycleManager) InitiateProgressReporting(common.WorkController) {}
func (*mockedLifecycleManager) ClearEnvironmentVariable(env common.EnvironmentVariable) {
_ = os.Setenv(env.Name, "")
}
func (*mockedLifecycleManager) GetEnvironmentVariable(env common.EnvironmentVariable) string {
value := os.Getenv(env.Name)
if value == "" {
return env.DefaultValue
}
return value
}
func (m *mockedLifecycleManager) SetOutputFormat(format common.OutputFormat) {
m.outputFormat = format
}
func (*mockedLifecycleManager) EnableInputWatcher() {}
func (*mockedLifecycleManager) EnableCancelFromStdIn() {}
func (*mockedLifecycleManager) AddUserAgentPrefix(userAgent string) string {
return userAgent
}

func (*mockedLifecycleManager) SetForceLogging() {}

Expand Down
2 changes: 1 addition & 1 deletion common/ProxyLookupCache.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func init() {
lookupMethod: GetProxyFunc(),
}

ev := GetLifecycleMgr().GetEnvironmentVariable(EEnvironmentVariable.CacheProxyLookup())
ev := GetEnvironmentVariable(EEnvironmentVariable.CacheProxyLookup())
if strings.ToLower(ev) == "true" {
GlobalProxyLookup = c.getProxy
} else {
Expand Down
8 changes: 4 additions & 4 deletions common/clientFactory.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ import (
)

func GetDatalakeSharedKeyCredential() (*azdatalake.SharedKeyCredential, error) {
name := lcm.GetEnvironmentVariable(EEnvironmentVariable.AccountName())
key := lcm.GetEnvironmentVariable(EEnvironmentVariable.AccountKey())
name := GetEnvironmentVariable(EEnvironmentVariable.AccountName())
key := GetEnvironmentVariable(EEnvironmentVariable.AccountKey())
// If the ACCOUNT_NAME and ACCOUNT_KEY are not set in environment variables
if name == "" || key == "" {
return nil, fmt.Errorf("ACCOUNT_NAME and ACCOUNT_KEY environment variables must be set before creating the SharedKey credential")
Expand All @@ -37,8 +37,8 @@ func GetDatalakeSharedKeyCredential() (*azdatalake.SharedKeyCredential, error) {
}

func GetBlobSharedKeyCredential() (*blob.SharedKeyCredential, error) {
name := lcm.GetEnvironmentVariable(EEnvironmentVariable.AccountName())
key := lcm.GetEnvironmentVariable(EEnvironmentVariable.AccountKey())
name := GetEnvironmentVariable(EEnvironmentVariable.AccountName())
key := GetEnvironmentVariable(EEnvironmentVariable.AccountKey())
// If the ACCOUNT_NAME and ACCOUNT_KEY are not set in environment variables
if name == "" || key == "" {
return nil, fmt.Errorf("ACCOUNT_NAME and ACCOUNT_KEY environment variables must be set before creating the SharedKey credential")
Expand Down
13 changes: 6 additions & 7 deletions common/credentialFactory.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,13 @@ func (o CredentialOpOptions) panicError(err error) {

// CreateS3Credential creates AWS S3 credential according to credential info.
func CreateS3Credential(ctx context.Context, credInfo CredentialInfo, options CredentialOpOptions) (*credentials.Credentials, error) {
glcm := GetLifecycleMgr()
switch credInfo.CredentialType {
case ECredentialType.S3PublicBucket():
return credentials.NewStatic("", "", "", credentials.SignatureAnonymous), nil
case ECredentialType.S3AccessKey():
accessKeyID := glcm.GetEnvironmentVariable(EEnvironmentVariable.AWSAccessKeyID())
secretAccessKey := glcm.GetEnvironmentVariable(EEnvironmentVariable.AWSSecretAccessKey())
sessionToken := glcm.GetEnvironmentVariable(EEnvironmentVariable.AwsSessionToken())
accessKeyID := GetEnvironmentVariable(EEnvironmentVariable.AWSAccessKeyID())
secretAccessKey := GetEnvironmentVariable(EEnvironmentVariable.AWSSecretAccessKey())
sessionToken := GetEnvironmentVariable(EEnvironmentVariable.AwsSessionToken())

// create and return s3 credential
return credentials.NewStaticV4(accessKeyID, secretAccessKey, sessionToken), nil // S3 uses V4 signature
Expand Down Expand Up @@ -185,11 +184,11 @@ func GetCpkInfo(cpkInfo bool) *blob.CPKInfo {
}

// fetch EncryptionKey and EncryptionKeySHA256 from the environment variables
glcm := GetLifecycleMgr()
encryptionKey := glcm.GetEnvironmentVariable(EEnvironmentVariable.CPKEncryptionKey())
encryptionKeySHA256 := glcm.GetEnvironmentVariable(EEnvironmentVariable.CPKEncryptionKeySHA256())
encryptionKey := GetEnvironmentVariable(EEnvironmentVariable.CPKEncryptionKey())
encryptionKeySHA256 := GetEnvironmentVariable(EEnvironmentVariable.CPKEncryptionKeySHA256())
encryptionAlgorithmAES256 := blob.EncryptionAlgorithmTypeAES256

glcm := GetLifecycleMgr()
if encryptionKey == "" || encryptionKeySHA256 == "" {
glcm.Error("fatal: failed to fetch cpk encryption key (" + EEnvironmentVariable.CPKEncryptionKey().Name +
") or hash (" + EEnvironmentVariable.CPKEncryptionKeySHA256().Name + ") from environment variables")
Expand Down
15 changes: 15 additions & 0 deletions common/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ package common
import (
"encoding/json"
"fmt"
"os"
"reflect"
"runtime"
"strings"
Expand All @@ -37,6 +38,20 @@ type EnvironmentVariable struct {
Hidden bool
}

// GetEnvironmentVariable gets the environment variable or its default value
func GetEnvironmentVariable(env EnvironmentVariable) string {
value := os.Getenv(env.Name)
if value == "" {
return env.DefaultValue
}
return value
}

// ClearEnvironmentVariable clears the environment variable
func ClearEnvironmentVariable(variable EnvironmentVariable) {
_ = os.Setenv(variable.Name, "")
}

// This array needs to be updated when a new public environment variable is added
// Things are here, rather than in command line parameters for one of two reasons:
// 1. They are optional and obscure (e.g. performance tuning parameters) or
Expand Down
Loading

0 comments on commit 903f41c

Please sign in to comment.