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

feat: match source account as first priority in snapshot restore and volume clone scenarios #7699

Merged
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
11 changes: 11 additions & 0 deletions pkg/provider/azure_storageaccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ type AccountOptions struct {
SoftDeleteContainers int32
// indicate whether to get a random matching account, if false, will get the first matching account
PickRandomMatchingAccount bool
// provide the source account name in snapshot restore and volume clone scenarios
SourceAccountName string
}

type accountWithLocation struct {
Expand Down Expand Up @@ -341,6 +343,15 @@ func (az *Cloud) EnsureStorageAccount(ctx context.Context, accountOptions *Accou
}
accountName = accounts[index].Name
createNewAccount = false
if accountOptions.SourceAccountName != "" {
for _, acct := range accounts {
if acct.Name == accountOptions.SourceAccountName {
klog.V(2).Infof("found a matching account %s type %s location %s with source account name", acct.Name, acct.StorageType, acct.Location)
accountName = acct.Name
break
}
}
}
klog.V(4).Infof("found a matching account %s type %s location %s", accounts[index].Name, accounts[index].StorageType, accounts[index].Location)
}
}
Expand Down
28 changes: 25 additions & 3 deletions pkg/provider/azure_storageaccount_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,14 +395,16 @@ func TestEnsureStorageAccount(t *testing.T) {
cloud.Location = location
cloud.SubscriptionID = "testSub"

name := "testStorageAccount"
sku := &storage.Sku{
Name: "testSku",
Tier: "testSkuTier",
}
testStorageAccounts :=
[]storage.Account{
{Name: &name, Kind: "kind", Location: &location, Sku: sku, AccountProperties: &storage.AccountProperties{NetworkRuleSet: &storage.NetworkRuleSet{}}}}
{Name: ptr.To("testStorageAccount"), Kind: "kind", Location: &location, Sku: sku, AccountProperties: &storage.AccountProperties{NetworkRuleSet: &storage.NetworkRuleSet{}}},
{Name: ptr.To("wantedAccount"), Kind: "kind", Location: &location, Sku: sku, AccountProperties: &storage.AccountProperties{NetworkRuleSet: &storage.NetworkRuleSet{}}},
{Name: ptr.To("otherAccount"), Kind: "kind", Location: &location, Sku: sku, AccountProperties: &storage.AccountProperties{NetworkRuleSet: &storage.NetworkRuleSet{}}},
}

value := "foo bar"
storageAccountListKeys := storage.AccountListKeysResult{
Expand All @@ -423,10 +425,12 @@ func TestEnsureStorageAccount(t *testing.T) {
storageType StorageType
requireInfrastructureEncryption *bool
keyVaultURL *string
sourceAccountName string
accountName string
subscriptionID string
resourceGroup string
expectedErr string
expectedAccountName string
}{
{
name: "[Success] EnsureStorageAccount with createPrivateEndpoint and storagetype blob",
Expand Down Expand Up @@ -456,6 +460,16 @@ func TestEnsureStorageAccount(t *testing.T) {
accountName: "",
expectedErr: "",
},
{
name: "[Success] EnsureStorageAccount returns with source account",
mockStorageAccountsClient: true,
setAccountOptions: true,
requireInfrastructureEncryption: ptr.To(true),
resourceGroup: "rg",
sourceAccountName: "wantedAccount",
accountName: "wantedAccount",
expectedErr: "",
},
{
name: "[Failed] EnsureStorageAccount with createPrivateEndpoint: get storage key failed",
createAccount: true,
Expand Down Expand Up @@ -537,6 +551,10 @@ func TestEnsureStorageAccount(t *testing.T) {
mockVirtualNetworkLinksClient.EXPECT().CreateOrUpdate(gomock.Any(), vnetResourceGroup, gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).Times(1)
}

if test.sourceAccountName != "" {
mockStorageAccountsClient.EXPECT().ListKeys(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(storageAccountListKeys, nil).AnyTimes()
}

var testAccountOptions *AccountOptions
if test.setAccountOptions {
testAccountOptions = &AccountOptions{
Expand All @@ -551,10 +569,14 @@ func TestEnsureStorageAccount(t *testing.T) {
SoftDeleteBlobs: 7,
SoftDeleteContainers: 7,
PickRandomMatchingAccount: test.pickRandomMatchingAccount,
SourceAccountName: test.sourceAccountName,
}
}

_, _, err := cloud.EnsureStorageAccount(ctx, testAccountOptions, "test")
accountName, _, err := cloud.EnsureStorageAccount(ctx, testAccountOptions, "test")
if test.expectedAccountName != "" {
assert.Equal(t, accountName, test.expectedAccountName, test.name)
}
assert.Equal(t, err == nil, test.expectedErr == "", fmt.Sprintf("returned error: %v", err), test.name)
if test.expectedErr != "" {
assert.Equal(t, err != nil, strings.Contains(err.Error(), test.expectedErr), err.Error(), test.name)
Expand Down