Skip to content
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

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,28 @@
# --------------------------------------------------------------------------------------------

from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer
import unittest
import time
LOCATION = "southcentralusstage"
VNET_LOCATION = "southcentralus"

LOCATION = "eastus2euap"

# No tidy up of tests required. The resource group is automatically removed


@unittest.skip("Backup unstable so these tests need to be skipped for this version")
class AzureNetAppFilesAccountBackupServiceScenarioTest(ScenarioTest):
def setup_vnet(self, vnet_name, subnet_name):
self.cmd("az network vnet create -n %s -g {rg} -l %s --address-prefix 10.5.0.0/16" %
(vnet_name, LOCATION))
(vnet_name, VNET_LOCATION))
self.cmd("az network vnet subnet create -n %s --vnet-name %s --address-prefixes '10.5.0.0/24' "
"--delegations 'Microsoft.Netapp/volumes' -g {rg}" % (subnet_name, vnet_name))

def current_subscription(self):
subs = self.cmd("az account show").get_output_in_json()
return subs['id']

def create_volume(self, account_name, pool_name, volume_name, volume_only=False, backup_id=None):
vnet_name = self.create_random_name(prefix='cli-vnet-backup', length=24)
subnet_name = "default"

if not volume_only:
# create vnet, account and pool
self.setup_vnet(vnet_name, subnet_name)
self.cmd("netappfiles account create -g {rg} -a '%s' -l %s" %
(account_name, LOCATION)).get_output_in_json()
self.cmd("netappfiles account create -g {rg} -a '%s' -l %s" % (account_name, LOCATION))
self.cmd("netappfiles pool create -g {rg} -a %s -p %s -l %s --service-level 'Premium' --size 4" %
(account_name, pool_name, LOCATION)).get_output_in_json()
(account_name, pool_name, LOCATION))

# create volume
if backup_id is None:
Expand All @@ -53,24 +45,36 @@ def create_backup(self, account_name, pool_name, volume_name, backup_name, backu
self.create_volume(account_name, pool_name, volume_name)

# get vault
vaults = self.cmd("az netappfiles vault list -g {rg} -a %s" % account_name).get_output_in_json()

# create backup policy
backup_policy_name = self.create_random_name(prefix='cli-backup-pol-', length=16)
backup_policy = self.cmd("az netappfiles account backup-policy create -g {rg} -a %s "
"--backup-policy-name %s -l %s --daily-backups 1 --enabled true" %
(account_name, backup_policy_name, LOCATION)).get_output_in_json()
vaults = self.get_vaults(account_name)

# volume update with backup policy
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s "
"--backup-policy-id %s --policy-enforced %s" %
(account_name, pool_name, volume_name, vaults[0]['id'], True, backup_policy['id'], True)) \
.get_output_in_json()
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s " %
(account_name, pool_name, volume_name, vaults[0]['id'], True))

# create backup
backup = self.cmd("az netappfiles volume backup create -g {rg} -a %s -p %s -v %s -l %s --backup-name %s" %
(account_name, pool_name, volume_name, LOCATION, backup_name)).get_output_in_json()
return backup
return self.cmd("az netappfiles volume backup create -g {rg} -a %s -p %s -v %s -l %s --backup-name %s" %
(account_name, pool_name, volume_name, LOCATION, backup_name)).get_output_in_json()

def delete_backup(self, account_name, pool_name, volume_name):
vaults = self.get_vaults(account_name)

# Delete
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s " %
(account_name, pool_name, volume_name, vaults[0]['id'], False))

def get_vaults(self, account_name):
return self.cmd("az netappfiles vault list -g {rg} -a %s" % account_name).get_output_in_json()

def wait_for_backup_created(self, account_name, pool_name, volume_name, backup_name):
attempts = 0
while attempts < 40:
attempts += 1
backup = self.cmd("netappfiles volume backup show -g {rg} -a %s -p %s -v %s -b %s" %
(account_name, pool_name, volume_name, backup_name)).get_output_in_json()
if backup['provisioningState'] != "Creating":
break
if self.is_live or self.in_recording:
time.sleep(60)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_account_backup_')
def test_list_account_backups(self):
Expand All @@ -85,6 +89,9 @@ def test_list_account_backups(self):

assert len(backup_list) == 1

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_account_backup_')
def test_get_account_backup(self):
# create backup
Expand All @@ -95,9 +102,12 @@ def test_get_account_backup(self):
self.create_backup(account_name, pool_name, volume_name, backup_name)

backup = self.cmd("az netappfiles account backup show -g {rg} -a %s --backup-name %s" %
account_name, backup_name).get_output_in_json()
(account_name, backup_name)).get_output_in_json()

assert backup['name'] == backup_name
assert backup['name'] == account_name + "/" + backup_name

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_account_backup_')
def test_delete_account_backup(self):
Expand All @@ -108,8 +118,15 @@ def test_delete_account_backup(self):
backup_name = self.create_random_name(prefix='cli-backup-', length=24)
self.create_backup(account_name, pool_name, volume_name, backup_name)

self.cmd("az netappfiles account backup delete -g {rg} -a %s --backup-name %s" % account_name, backup_name)
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
backup_list = self.cmd("az netappfiles account backup list -g {rg} -a %s" % account_name).get_output_in_json()
assert len(backup_list) == 1

self.cmd("az netappfiles volume delete -g {rg} -a %s -p %s -v %s" %
(account_name, pool_name, volume_name))
self.cmd("az netappfiles account backup delete -g {rg} -a %s --backup-name %s -y" % (account_name, backup_name))

backup_list = self.cmd("az netappfiles account backup list -g {rg} -a %s" % account_name).get_output_in_json()

assert len(backup_list) == 0
for backup in backup_list['value']:
assert backup['name'] != account_name + "/" + backup_name
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,29 @@
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer
import unittest
import time
LOCATION = "southcentralusstage"
VNET_LOCATION = "southcentralus"


@unittest.skip("Backup unstable so these tests need to be skipped for this version")
class AzureNetAppFilesBackupServiceScenarioTest(ScenarioTest):
def setup_vnet(self, vnet_name, subnet_name):
self.cmd("az network vnet create -n %s -g {rg} -l %s --address-prefix 10.5.0.0/16" %
(vnet_name, "southcentralus"))
(vnet_name, VNET_LOCATION))
self.cmd("az network vnet subnet create -n %s --vnet-name %s --address-prefixes '10.5.0.0/24' "
"--delegations 'Microsoft.Netapp/volumes' -g {rg}" % (subnet_name, vnet_name))

def current_subscription(self):
subs = self.cmd("az account show").get_output_in_json()
return subs['id']

def create_volume(self, account_name, pool_name, volume_name, volume_only=False, backup_id=None):
vnet_name = self.create_random_name(prefix='cli-vnet-backup', length=24)
def create_volume(self, account_name, pool_name, volume_name, volume_only=False, backup_id=None, vnet_name=None):
if vnet_name is None:
vnet_name = self.create_random_name(prefix='cli-vnet-backup', length=24)
subnet_name = "default"

if not volume_only:
# create vnet, account and pool
self.setup_vnet(vnet_name, subnet_name)
self.cmd("netappfiles account create -g {rg} -a '%s' -l %s" %
(account_name, LOCATION)).get_output_in_json()
self.cmd("netappfiles account create -g {rg} -a '%s' -l %s" % (account_name, LOCATION))
self.cmd("netappfiles pool create -g {rg} -a %s -p %s -l %s --service-level 'Premium' --size 4" %
(account_name, pool_name, LOCATION)).get_output_in_json()
(account_name, pool_name, LOCATION))

# create volume
if backup_id is None:
Expand All @@ -43,25 +39,17 @@ def create_volume(self, account_name, pool_name, volume_name, volume_only=False,
(account_name, pool_name, volume_name, LOCATION, vnet_name, subnet_name, volume_name,
backup_id)).get_output_in_json()

def create_backup(self, account_name, pool_name, volume_name, backup_name, backup_only=False):
def create_backup(self, account_name, pool_name, volume_name, backup_name, backup_only=False, vnet_name=None):
if not backup_only:
# create account, pool and volume
self.create_volume(account_name, pool_name, volume_name)
self.create_volume(account_name, pool_name, volume_name, vnet_name=vnet_name)

# get vault
vaults = self.get_vaults(account_name)

# create backup policy
backup_policy_name = self.create_random_name(prefix='cli-bp-pol-', length=16)
backup_policy = self.cmd("az netappfiles account backup-policy create -g {rg} -a %s "
"--backup-policy-name %s -l %s --daily-backups 1 --enabled true" %
(account_name, backup_policy_name, LOCATION)).get_output_in_json()

# volume update with backup policy
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s "
"--backup-policy-id %s --policy-enforced %s" %
(account_name, pool_name, volume_name, vaults[0]['id'], True, backup_policy['id'], True)) \
.get_output_in_json()
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s " %
(account_name, pool_name, volume_name, vaults[0]['id'], True))

# create backup
return self.cmd("az netappfiles volume backup create -g {rg} -a %s -p %s -v %s -l %s --backup-name %s" %
Expand All @@ -70,18 +58,24 @@ def create_backup(self, account_name, pool_name, volume_name, backup_name, backu
def delete_backup(self, account_name, pool_name, volume_name):
vaults = self.get_vaults(account_name)

backup_policies = self.cmd("az netappfiles account backup-policy list -g {rg} -a %s" %
account_name).get_output_in_json()

# Delete
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s " %
(account_name, pool_name, volume_name, vaults[0]['id'], False))
self.cmd("az netappfiles account backup-policy delete -g {rg} -a %s --backup-policy-name %s" %
(account_name, backup_policies[0]['name']))

def get_vaults(self, account_name):
return self.cmd("az netappfiles vault list -g {rg} -a %s" % account_name).get_output_in_json()

def wait_for_backup_created(self, account_name, pool_name, volume_name, backup_name):
attempts = 0
while attempts < 40:
attempts += 1
backup = self.cmd("netappfiles volume backup show -g {rg} -a %s -p %s -v %s -b %s" %
(account_name, pool_name, volume_name, backup_name)).get_output_in_json()
if backup['provisioningState'] != "Creating":
break
if self.is_live or self.in_recording:
time.sleep(60)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_backup_')
def test_create_delete_backup(self):
# create backup
Expand All @@ -93,7 +87,23 @@ def test_create_delete_backup(self):

assert backup is not None
assert backup['id'] is not None
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)

backup_list = self.cmd("netappfiles volume backup list -g {rg} -a %s -p %s -v %s" %
(account_name, pool_name, volume_name)).get_output_in_json()
assert len(backup_list) == 1

# create second backup to test delete backup
backup_name2 = self.create_random_name(prefix='cli-backup-', length=24)
self.create_backup(account_name, pool_name, volume_name, backup_name2, backup_only=True)
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name2)
backup_list = self.cmd("netappfiles volume backup list -g {rg} -a %s -p %s -v %s" %
(account_name, pool_name, volume_name)).get_output_in_json()
assert len(backup_list) == 2

# delete backup
self.cmd("az netappfiles volume backup delete -g {rg} -a %s -p %s -v %s --backup-name %s" %
(account_name, pool_name, volume_name, backup_name))
backup_list = self.cmd("netappfiles volume backup list -g {rg} -a %s -p %s -v %s" %
(account_name, pool_name, volume_name)).get_output_in_json()
assert len(backup_list) == 1
Expand All @@ -113,6 +123,7 @@ def test_list_backup(self):
(account_name, pool_name, volume_name)).get_output_in_json()

assert len(backup_list) == 1
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)

# create backup 2
backup_name2 = self.create_random_name(prefix='cli-backup-', length=24)
Expand All @@ -123,6 +134,7 @@ def test_list_backup(self):

assert len(backup_list) == 2

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name2)
self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_backup_')
Expand All @@ -144,6 +156,7 @@ def test_get_backup_by_name(self):
backup_from_id = self.cmd("az netappfiles volume backup show --ids %s" % backup['id']).get_output_in_json()
assert backup_from_id['name'] == account_name + "/" + pool_name + "/" + volume_name + "/" + backup_name

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_backup_')
Expand All @@ -157,9 +170,9 @@ def test_update_backup(self):

# update backup
tags = "Tag1=Value1 Tag2=Value2"
label = "label"
self.cmd("netappfiles volume backup update -g {rg} -a %s -p %s -v %s --backup-name %s --tags %s --label %s" %
(account_name, pool_name, volume_name, backup_name, tags, label))
# label = "label"
self.cmd("netappfiles volume backup update -g {rg} -a %s -p %s -v %s --backup-name %s --tags %s" %
(account_name, pool_name, volume_name, backup_name, tags))

# get backup and validate
backup = self.cmd("netappfiles volume backup show -g {rg} -a %s -p %s -v %s --backup-name %s" %
Expand All @@ -170,6 +183,7 @@ def test_update_backup(self):
# there is a bug in update where the label is not updated - will be fixed later
# assert backup['label'] == label

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_backup_')
Expand All @@ -183,33 +197,37 @@ def test_disable_backup_for_volume(self):

# get vault
vaults = self.cmd("az netappfiles vault list -g {rg} -a %s" % account_name).get_output_in_json()
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)

# volume update
volume = self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s" %
(account_name, pool_name, volume_name, vaults[0]['id'], False)).get_output_in_json()

assert not volume['dataProtection']['backup']['backupEnabled']

self.delete_backup(account_name, pool_name, volume_name)

@ResourceGroupPreparer(name_prefix='cli_netappfiles_test_backup_')
def test_restore_backup_to_new_volume(self):
# create backup
account_name = self.create_random_name(prefix='cli-acc-', length=24)
pool_name = self.create_random_name(prefix='cli-pool-', length=24)
volume_name = self.create_random_name(prefix='cli-vol-', length=24)
backup_name = self.create_random_name(prefix='cli-backup-', length=24)
self.create_backup(account_name, pool_name, volume_name, backup_name)

self.cmd("netappfiles volume backup show -g {rg} -a %s -p %s -v %s --backup-name %s" %
(account_name, pool_name, volume_name, backup_name)).get_output_in_json()
vnet_name = self.create_random_name(prefix='cli-vnet-backup', length=24)
self.create_backup(account_name, pool_name, volume_name, backup_name, vnet_name=vnet_name)
self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)

# disable backup for volume
vaults = self.cmd("az netappfiles vault list -g {rg} -a %s" % account_name).get_output_in_json()
self.cmd("az netappfiles volume update -g {rg} -a %s -p %s -v %s --vault-id %s --backup-enabled %s" %
(account_name, pool_name, volume_name, vaults[0]['id'], False)).get_output_in_json()
backup = self.cmd("netappfiles volume backup show -g {rg} -a %s -p %s -v %s --backup-name %s" %
(account_name, pool_name, volume_name, backup_name)).get_output_in_json()

# Backup not completely ready, not able to retrieve backupId at the moment since swagger is not updated
# create new volume and restore backup
# volume2_name = self.create_random_name(prefix='cli-vol-', length=24)
# volume2 = self.create_volume(account_name, pool_name, volume2_name, volume_only=False, backup_id=backup['backupId'])
volume2_name = self.create_random_name(prefix='cli-vol-', length=24)
self.create_volume(account_name, pool_name, volume2_name, volume_only=True, backup_id=backup['backupId'],
vnet_name=vnet_name)

volume2 = self.cmd("netappfiles volume show -g {rg} -a %s -p %s -v %s" %
(account_name, pool_name, volume_name)).get_output_in_json()

assert volume2['dataProtection']['backup']['backupEnabled']

self.wait_for_backup_created(account_name, pool_name, volume_name, backup_name)
self.delete_backup(account_name, pool_name, volume_name)
Loading