in common/util.go [112:230]
func GetServiceClientForLocation(loc Location,
resource ResourceString,
credType CredentialType,
cred azcore.TokenCredential,
policyOptions *azcore.ClientOptions,
locationSpecificOptions any,
) (*ServiceClient, error) {
ret := &ServiceClient{}
resourceURL, err := resource.String()
if err != nil {
return nil, fmt.Errorf("failed to get resource string: %w", err)
}
switch loc {
case ELocation.BlobFS(), ELocation.Blob(): // Since we always may need to interact with DFS while working with Blob, we should just attach both.
datalakeURLParts, err := azdatalake.ParseURL(resourceURL)
if err != nil {
return nil, err
}
datalakeURLParts.FileSystemName = ""
datalakeURLParts.PathName = ""
resourceURL = datalakeURLParts.String()
var o *datalake.ClientOptions
var dsc *datalake.Client
if policyOptions != nil {
o = &datalake.ClientOptions{ClientOptions: *policyOptions}
}
if credType.IsAzureOAuth() {
dsc, err = datalake.NewClient(resourceURL, cred, o)
} else if credType.IsSharedKey() {
var sharedKeyCred *azdatalake.SharedKeyCredential
sharedKeyCred, err = GetDatalakeSharedKeyCredential()
if err != nil {
return nil, err
}
dsc, err = datalake.NewClientWithSharedKeyCredential(resourceURL, sharedKeyCred, o)
} else {
dsc, err = datalake.NewClientWithNoCredential(resourceURL, o)
}
if err != nil {
return nil, err
}
ret.dsc = dsc
blobURLParts, err := blob.ParseURL(resourceURL)
if err != nil {
return nil, err
}
blobURLParts.ContainerName = ""
blobURLParts.BlobName = ""
// In case we are creating a blob client for a datalake target, correct the endpoint
blobURLParts.Host = strings.Replace(blobURLParts.Host, ".dfs", ".blob", 1)
resourceURL = blobURLParts.String()
var bso *blobservice.ClientOptions
var bsc *blobservice.Client
if policyOptions != nil {
bso = &blobservice.ClientOptions{ClientOptions: *policyOptions}
}
if credType.IsAzureOAuth() {
bsc, err = blobservice.NewClient(resourceURL, cred, bso)
} else if credType.IsSharedKey() {
var sharedKeyCred *blob.SharedKeyCredential
sharedKeyCred, err = GetBlobSharedKeyCredential()
if err != nil {
return nil, err
}
bsc, err = blobservice.NewClientWithSharedKeyCredential(resourceURL, sharedKeyCred, bso)
} else {
bsc, err = blobservice.NewClientWithNoCredential(resourceURL, bso)
}
if err != nil {
return nil, err
}
ret.bsc = bsc
return ret, nil
case ELocation.File():
fileURLParts, err := file.ParseURL(resourceURL)
if err != nil {
return nil, err
}
fileURLParts.ShareName = ""
fileURLParts.DirectoryOrFilePath = ""
resourceURL = fileURLParts.String()
var o *fileservice.ClientOptions
var fsc *fileservice.Client
if policyOptions != nil {
o = &fileservice.ClientOptions{ClientOptions: *policyOptions}
}
if locationSpecificOptions != nil {
o.AllowTrailingDot = &locationSpecificOptions.(*FileClientOptions).AllowTrailingDot
o.AllowSourceTrailingDot = &locationSpecificOptions.(*FileClientOptions).AllowSourceTrailingDot
}
if cred != nil {
o.FileRequestIntent = to.Ptr(fileservice.ShareTokenIntentBackup)
fsc, err = fileservice.NewClient(resourceURL, cred, o)
} else {
fsc, err = fileservice.NewClientWithNoCredential(resourceURL, o)
}
if err != nil {
return nil, err
}
ret.fsc = fsc
return ret, nil
default:
return nil, nil
}
}