From e5e01836f107b704d5f2c9d8845ecc089f8cce24 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 31 Jul 2021 19:09:58 +0000 Subject: [PATCH 01/11] public ipaddress as optional for rescue VMs --- src/vm-repair/azext_vm_repair/_params.py | 1 + src/vm-repair/azext_vm_repair/_validators.py | 16 +++++++++++++++- src/vm-repair/azext_vm_repair/custom.py | 6 +++--- src/vm-repair/azext_vm_repair/telemetry.py | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/vm-repair/azext_vm_repair/_params.py b/src/vm-repair/azext_vm_repair/_params.py index 689f0d569fc..b2d942965c3 100644 --- a/src/vm-repair/azext_vm_repair/_params.py +++ b/src/vm-repair/azext_vm_repair/_params.py @@ -29,6 +29,7 @@ def load_arguments(self, _): c.argument('copy_disk_name', help='Name of OS disk copy.') c.argument('repair_group_name', help='Repair resource group name.') c.argument('unlock_encrypted_vm', help='Option to auto-unlock encrypted VMs using current subscription auth.') + c.argument('associate_public_ip', help='Option to create repair vm with public ip') with self.argument_context('vm repair restore') as c: c.argument('repair_vm_id', help='Repair VM resource id.') diff --git a/src/vm-repair/azext_vm_repair/_validators.py b/src/vm-repair/azext_vm_repair/_validators.py index 2135032b8a4..130d2c3708f 100644 --- a/src/vm-repair/azext_vm_repair/_validators.py +++ b/src/vm-repair/azext_vm_repair/_validators.py @@ -53,7 +53,7 @@ def validate_create(cmd, namespace): # Check copy resouce group name if namespace.repair_group_name: if namespace.repair_group_name == namespace.resource_group_name: - raise CLIError('The repair resource group name cannot be the same as the source VM resource group.') + raise CLIError('The repair resource group name cannot be the same as the source VM resource group.') _validate_resource_group_name(namespace.repair_group_name) else: namespace.repair_group_name = 'repair-' + namespace.vm_name + '-' + timestamp @@ -81,6 +81,9 @@ def validate_create(cmd, namespace): _prompt_repair_password(namespace) # Validate vm password validate_vm_password(namespace.repair_password, is_linux) + # Prompt input for public ip usage + if not namespace.associate_public_ip: + _prompt_public_ip(namespace) def validate_restore(cmd, namespace): @@ -196,6 +199,17 @@ def _prompt_repair_password(namespace): except NoTTYException: raise CLIError('Please specify the password parameter in non-interactive mode.') +def _prompt_public_ip(namespace): + from knack.prompting import prompt_y_n, NoTTYException + try: + if prompt_y_n('Does repair vm requires public ip?'): + namespace.associate_public_ip = "yes" + else: + # raise CLIError('Stopping execution upon user input.') + namespace.associate_public_ip = '""' + + except NoTTYException: + raise CLIError('Please specify the associate-public-ip parameter in non-interactive mode.') def _classic_vm_exists(cmd, resource_group_name, vm_name): classic_vm_provider = 'Microsoft.ClassicCompute' diff --git a/src/vm-repair/azext_vm_repair/custom.py b/src/vm-repair/azext_vm_repair/custom.py index b8c77985ae8..0670a1c825a 100644 --- a/src/vm-repair/azext_vm_repair/custom.py +++ b/src/vm-repair/azext_vm_repair/custom.py @@ -36,7 +36,7 @@ logger = get_logger(__name__) -def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False): +def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, associate_public_ip=False, unlock_encrypted_vm=False): # Init command helper object command = command_helper(logger, cmd, 'vm repair create') @@ -60,8 +60,8 @@ def create(cmd, vm_name, resource_group_name, repair_password=None, repair_usern os_type = 'Windows' # Set up base create vm command - create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password}' \ - .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password) + create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password} --public-ip-address {option}' \ + .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password, option=associate_public_ip) # Fetch VM size of repair VM sku = _fetch_compatible_sku(source_vm) if not sku: diff --git a/src/vm-repair/azext_vm_repair/telemetry.py b/src/vm-repair/azext_vm_repair/telemetry.py index 81f4da45158..53039d78800 100644 --- a/src/vm-repair/azext_vm_repair/telemetry.py +++ b/src/vm-repair/azext_vm_repair/telemetry.py @@ -10,9 +10,9 @@ # For test releases and testing TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' -PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' +#PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' -tc = TelemetryClient(PROD_KEY) +tc = TelemetryClient(TEST_KEY) tc.context.application.ver = _get_current_vmrepair_version() From 8eb9d0e301ac1aedfd780cccb267b66f1040fe0e Mon Sep 17 00:00:00 2001 From: root Date: Sat, 31 Jul 2021 19:44:02 +0000 Subject: [PATCH 02/11] public ip address for rescue vm --- src/vm-repair/azext_vm_repair/_params.py | 4 +--- src/vm-repair/azext_vm_repair/custom.py | 21 +++++---------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/vm-repair/azext_vm_repair/_params.py b/src/vm-repair/azext_vm_repair/_params.py index c484b8dd7ce..8743ef05515 100644 --- a/src/vm-repair/azext_vm_repair/_params.py +++ b/src/vm-repair/azext_vm_repair/_params.py @@ -29,11 +29,9 @@ def load_arguments(self, _): c.argument('copy_disk_name', help='Name of OS disk copy.') c.argument('repair_group_name', help='Repair resource group name.') c.argument('unlock_encrypted_vm', help='Option to auto-unlock encrypted VMs using current subscription auth.') -<<<<<<< HEAD c.argument('associate_public_ip', help='Option to create repair vm with public ip') -======= c.argument('enable_nested', help='enable nested hyperv.') ->>>>>>> 4dd9bb5324d6d75aff21a34176a46099515e6704 + c.argument('associate_public_ip', help='Option to create repair vm with public ip') with self.argument_context('vm repair restore') as c: c.argument('repair_vm_id', help='Repair VM resource id.') diff --git a/src/vm-repair/azext_vm_repair/custom.py b/src/vm-repair/azext_vm_repair/custom.py index 7b8878fac9b..5a5ebf08f7c 100644 --- a/src/vm-repair/azext_vm_repair/custom.py +++ b/src/vm-repair/azext_vm_repair/custom.py @@ -37,13 +37,7 @@ from .exceptions import AzCommandError, SkuNotAvailableError, UnmanagedDiskCopyError, WindowsOsNotAvailableError, RunScriptNotFoundForIdError, SkuDoesNotSupportHyperV, ScriptReturnsError logger = get_logger(__name__) - -<<<<<<< HEAD -def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, associate_public_ip=False, unlock_encrypted_vm=False): - -======= -def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False, enable_nested=False): ->>>>>>> 4dd9bb5324d6d75aff21a34176a46099515e6704 +def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False, associate_public_ip=False, enable_nested=False): # Init command helper object command = command_helper(logger, cmd, 'vm repair create') # Main command calling block @@ -69,18 +63,13 @@ def create(cmd, vm_name, resource_group_name, repair_password=None, repair_usern _check_hyperV_gen(source_vm) # Set up base create vm command -<<<<<<< HEAD - create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password} --public-ip-address {option}' \ - .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password, option=associate_public_ip) -======= if is_linux: - create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password} --custom-data {cloud_init_script}' \ - .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password, cloud_init_script=_get_cloud_init_script()) + create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password} --public-ip-address {option} --custom-data {cloud_init_script}' \ + .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password, option=associate_public_ip, cloud_init_script=_get_cloud_init_script()) else: - create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password}' \ - .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password) + create_repair_vm_command = 'az vm create -g {g} -n {n} --tag {tag} --image {image} --admin-username {username} --admin-password {password} --public-ip-address {option}' \ + .format(g=repair_group_name, n=repair_vm_name, tag=resource_tag, image=os_image_urn, username=repair_username, password=repair_password, option=associate_public_ip) ->>>>>>> 4dd9bb5324d6d75aff21a34176a46099515e6704 # Fetch VM size of repair VM sku = _fetch_compatible_sku(source_vm, enable_nested) if not sku: From 16cc4c38d461d0d4265764f5f98142e0443dfdf9 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 31 Jul 2021 20:30:00 +0000 Subject: [PATCH 03/11] public ip addr change for rescue vms --- src/vm-repair/azext_vm_repair/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm-repair/azext_vm_repair/custom.py b/src/vm-repair/azext_vm_repair/custom.py index 5a5ebf08f7c..dd6a176738c 100644 --- a/src/vm-repair/azext_vm_repair/custom.py +++ b/src/vm-repair/azext_vm_repair/custom.py @@ -37,7 +37,7 @@ from .exceptions import AzCommandError, SkuNotAvailableError, UnmanagedDiskCopyError, WindowsOsNotAvailableError, RunScriptNotFoundForIdError, SkuDoesNotSupportHyperV, ScriptReturnsError logger = get_logger(__name__) -def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False, associate_public_ip=False, enable_nested=False): +def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False, enable_nested=False, associate_public_ip=False): # Init command helper object command = command_helper(logger, cmd, 'vm repair create') # Main command calling block From 4fd707b94c99e4902b04427e29838a2a4b85e8b4 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Aug 2021 16:00:20 +0000 Subject: [PATCH 04/11] Reverted telemetry back to PROD --- src/vm-repair/azext_vm_repair/telemetry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vm-repair/azext_vm_repair/telemetry.py b/src/vm-repair/azext_vm_repair/telemetry.py index 53039d78800..c358feabf59 100644 --- a/src/vm-repair/azext_vm_repair/telemetry.py +++ b/src/vm-repair/azext_vm_repair/telemetry.py @@ -9,8 +9,8 @@ from .repair_utils import _get_current_vmrepair_version # For test releases and testing -TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' -#PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' +#TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' +PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' tc = TelemetryClient(TEST_KEY) tc.context.application.ver = _get_current_vmrepair_version() From 78aaf759dd297b6858acc7b4564f33fd51306611 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Aug 2021 17:44:56 +0000 Subject: [PATCH 05/11] fixed code style --- src/vm-repair/azext_vm_repair/_validators.py | 5 +++-- src/vm-repair/azext_vm_repair/custom.py | 1 + src/vm-repair/azext_vm_repair/telemetry.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vm-repair/azext_vm_repair/_validators.py b/src/vm-repair/azext_vm_repair/_validators.py index 0c7deb14110..8d663d9740b 100644 --- a/src/vm-repair/azext_vm_repair/_validators.py +++ b/src/vm-repair/azext_vm_repair/_validators.py @@ -53,7 +53,7 @@ def validate_create(cmd, namespace): # Check copy resouce group name if namespace.repair_group_name: if namespace.repair_group_name == namespace.resource_group_name: - raise CLIError('The repair resource group name cannot be the same as the source VM resource group.') + raise CLIError('The repair resource group name cannot be the same as the source VM resource group.') _validate_resource_group_name(namespace.repair_group_name) else: namespace.repair_group_name = 'repair-' + namespace.vm_name + '-' + timestamp @@ -203,18 +203,19 @@ def _prompt_repair_password(namespace): except NoTTYException: raise CLIError('Please specify the password parameter in non-interactive mode.') + def _prompt_public_ip(namespace): from knack.prompting import prompt_y_n, NoTTYException try: if prompt_y_n('Does repair vm requires public ip?'): namespace.associate_public_ip = "yes" else: - # raise CLIError('Stopping execution upon user input.') namespace.associate_public_ip = '""' except NoTTYException: raise CLIError('Please specify the associate-public-ip parameter in non-interactive mode.') + def _classic_vm_exists(cmd, resource_group_name, vm_name): classic_vm_provider = 'Microsoft.ClassicCompute' vm_resource_type = 'virtualMachines' diff --git a/src/vm-repair/azext_vm_repair/custom.py b/src/vm-repair/azext_vm_repair/custom.py index dd6a176738c..d72b6607522 100644 --- a/src/vm-repair/azext_vm_repair/custom.py +++ b/src/vm-repair/azext_vm_repair/custom.py @@ -37,6 +37,7 @@ from .exceptions import AzCommandError, SkuNotAvailableError, UnmanagedDiskCopyError, WindowsOsNotAvailableError, RunScriptNotFoundForIdError, SkuDoesNotSupportHyperV, ScriptReturnsError logger = get_logger(__name__) + def create(cmd, vm_name, resource_group_name, repair_password=None, repair_username=None, repair_vm_name=None, copy_disk_name=None, repair_group_name=None, unlock_encrypted_vm=False, enable_nested=False, associate_public_ip=False): # Init command helper object command = command_helper(logger, cmd, 'vm repair create') diff --git a/src/vm-repair/azext_vm_repair/telemetry.py b/src/vm-repair/azext_vm_repair/telemetry.py index c358feabf59..b10586c5844 100644 --- a/src/vm-repair/azext_vm_repair/telemetry.py +++ b/src/vm-repair/azext_vm_repair/telemetry.py @@ -9,7 +9,7 @@ from .repair_utils import _get_current_vmrepair_version # For test releases and testing -#TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' +TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' tc = TelemetryClient(TEST_KEY) From 449241108400550606f27cbb10340c17b93e6045 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Aug 2021 17:52:33 +0000 Subject: [PATCH 06/11] Add extra space before operator on line 36 as suggested by azdev style check --- src/vm-repair/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm-repair/setup.py b/src/vm-repair/setup.py index 7c6ab3ef63c..c427ab66a2d 100644 --- a/src/vm-repair/setup.py +++ b/src/vm-repair/setup.py @@ -33,7 +33,7 @@ name='vm-repair', version=VERSION, description='Auto repair commands to fix VMs.', - long_description='VM repair command will enable Azure users to self-repair non-bootable VMs by copying the source VM\'s OS disk and attaching it to a newly created repair VM.'+ '\n\n' + HISTORY, + long_description='VM repair command will enable Azure users to self-repair non-bootable VMs by copying the source VM\'s OS disk and attaching it to a newly created repair VM.' + '\n\n' + HISTORY, license='MIT', author='Microsoft Corporation', author_email='caiddev@microsoft.com', From b9a7692d594c6d9572ce2e515882f7f216c3dd45 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Aug 2021 19:52:51 +0000 Subject: [PATCH 07/11] modified telemetryclient from TEST to PROD --- src/vm-repair/azext_vm_repair/telemetry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm-repair/azext_vm_repair/telemetry.py b/src/vm-repair/azext_vm_repair/telemetry.py index b10586c5844..81f4da45158 100644 --- a/src/vm-repair/azext_vm_repair/telemetry.py +++ b/src/vm-repair/azext_vm_repair/telemetry.py @@ -12,7 +12,7 @@ TEST_KEY = 'a6bdff92-33b5-426f-9123-33875d0ae98b' PROD_KEY = '3e7130f2-759b-41d4-afb8-f1405d1d7ed9' -tc = TelemetryClient(TEST_KEY) +tc = TelemetryClient(PROD_KEY) tc.context.application.ver = _get_current_vmrepair_version() From 6f4297a496b716d59c685c14b48969286a46948f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Aug 2021 19:55:29 +0000 Subject: [PATCH 08/11] removed duplicate entry for associate_public_ip param --- src/vm-repair/azext_vm_repair/_params.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vm-repair/azext_vm_repair/_params.py b/src/vm-repair/azext_vm_repair/_params.py index 8743ef05515..3714404e979 100644 --- a/src/vm-repair/azext_vm_repair/_params.py +++ b/src/vm-repair/azext_vm_repair/_params.py @@ -29,7 +29,6 @@ def load_arguments(self, _): c.argument('copy_disk_name', help='Name of OS disk copy.') c.argument('repair_group_name', help='Repair resource group name.') c.argument('unlock_encrypted_vm', help='Option to auto-unlock encrypted VMs using current subscription auth.') - c.argument('associate_public_ip', help='Option to create repair vm with public ip') c.argument('enable_nested', help='enable nested hyperv.') c.argument('associate_public_ip', help='Option to create repair vm with public ip') From 482c1248e7b31ea8871a25bbf58c3134cb4a7065 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 10 Aug 2021 16:38:02 +0000 Subject: [PATCH 09/11] specified specific error type in prompt_public_ip function --- src/vm-repair/azext_vm_repair/_validators.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vm-repair/azext_vm_repair/_validators.py b/src/vm-repair/azext_vm_repair/_validators.py index 8d663d9740b..29f7e868c51 100644 --- a/src/vm-repair/azext_vm_repair/_validators.py +++ b/src/vm-repair/azext_vm_repair/_validators.py @@ -8,6 +8,7 @@ from re import match, search, findall from knack.log import get_logger from knack.util import CLIError +from azure.cli.core.azclierror import ValidationError from azure.cli.command_modules.vm.custom import get_vm, _is_linux_os from azure.cli.command_modules.resource._client_factory import _resource_client_factory @@ -213,7 +214,7 @@ def _prompt_public_ip(namespace): namespace.associate_public_ip = '""' except NoTTYException: - raise CLIError('Please specify the associate-public-ip parameter in non-interactive mode.') + raise ValidationError('Please specify the associate-public-ip parameter in non-interactive mode.') def _classic_vm_exists(cmd, resource_group_name, vm_name): From 37654d45211002f3c7650b82c45894b6a057d5a7 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 11 Aug 2021 16:35:57 +0000 Subject: [PATCH 10/11] included class for testing publicip association on repair vm --- .../tests/latest/test_repair_commands.py | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/src/vm-repair/azext_vm_repair/tests/latest/test_repair_commands.py b/src/vm-repair/azext_vm_repair/tests/latest/test_repair_commands.py index 1bd00e3e3a6..27345b74ede 100644 --- a/src/vm-repair/azext_vm_repair/tests/latest/test_repair_commands.py +++ b/src/vm-repair/azext_vm_repair/tests/latest/test_repair_commands.py @@ -145,6 +145,142 @@ def test_vmrepair_LinuxUnmanagedCreateRestore(self, resource_group): assert source_vm['storageProfile']['osDisk']['vhd']['uri'] == result['copied_disk_uri'] +class WindowsManagedDiskCreateRestoreTestwithpublicip(LiveScenarioTest): + + @ResourceGroupPreparer(location='westus2') + def test_vmrepair_WinManagedCreateRestore(self, resource_group): + self.kwargs.update({ + 'vm': 'vm1' + }) + + # Create test VM + self.cmd('vm create -g {rg} -n {vm} --admin-username azureadmin --image Win2016Datacenter --admin-password !Passw0rd2018') + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + # Something wrong with vm create command if it fails here + assert len(vms) == 1 + + # Test create + result = self.cmd('vm repair create -g {rg} -n {vm} --repair-username azureadmin --repair-password !Passw0rd2018 --associate-public-ip -o json').get_output_in_json() + assert result['status'] == STATUS_SUCCESS, result['error_message'] + + # Check repair VM + repair_vms = self.cmd('vm list -g {} -o json'.format(result['repair_resource_group'])).get_output_in_json() + assert len(repair_vms) == 1 + repair_vm = repair_vms[0] + # Check attached data disk + assert repair_vm['storageProfile']['dataDisks'][0]['name'] == result['copied_disk_name'] + + # Call Restore + self.cmd('vm repair restore -g {rg} -n {vm} --yes') + + # Check swapped OS disk + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + source_vm = vms[0] + assert source_vm['storageProfile']['osDisk']['name'] == result['copied_disk_name'] + + +class WindowsUnmanagedDiskCreateRestoreTestwithpublicip(LiveScenarioTest): + + @ResourceGroupPreparer(location='westus2') + def test_vmrepair_WinUnmanagedCreateRestore(self, resource_group): + self.kwargs.update({ + 'vm': 'vm1' + }) + + # Create test VM + self.cmd('vm create -g {rg} -n {vm} --admin-username azureadmin --image Win2016Datacenter --admin-password !Passw0rd2018 --use-unmanaged-disk') + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + # Something wrong with vm create command if it fails here + assert len(vms) == 1 + + # Test create + result = self.cmd('vm repair create -g {rg} -n {vm} --repair-username azureadmin --repair-password !Passw0rd2018 --associate-public-ip -o json').get_output_in_json() + assert result['status'] == STATUS_SUCCESS, result['error_message'] + + # Check repair VM + repair_vms = self.cmd('vm list -g {} -o json'.format(result['repair_resource_group'])).get_output_in_json() + assert len(repair_vms) == 1 + repair_vm = repair_vms[0] + # Check attached data disk + assert repair_vm['storageProfile']['dataDisks'][0]['name'] == result['copied_disk_name'] + + # Call Restore + self.cmd('vm repair restore -g {rg} -n {vm} --yes') + + # Check swapped OS disk + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + source_vm = vms[0] + assert source_vm['storageProfile']['osDisk']['vhd']['uri'] == result['copied_disk_uri'] + + +class LinuxManagedDiskCreateRestoreTestwithpublicip(LiveScenarioTest): + + @ResourceGroupPreparer(location='westus2') + def test_vmrepair_LinuxManagedCreateRestore(self, resource_group): + self.kwargs.update({ + 'vm': 'vm1' + }) + + # Create test VM + self.cmd('vm create -g {rg} -n {vm} --image UbuntuLTS --admin-username azureadmin --admin-password !Passw0rd2018') + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + # Something wrong with vm create command if it fails here + assert len(vms) == 1 + + # Test create + result = self.cmd('vm repair create -g {rg} -n {vm} --repair-username azureadmin --repair-password !Passw0rd2018 --associate-public-ip -o json').get_output_in_json() + assert result['status'] == STATUS_SUCCESS, result['error_message'] + + # Check repair VM + repair_vms = self.cmd('vm list -g {} -o json'.format(result['repair_resource_group'])).get_output_in_json() + assert len(repair_vms) == 1 + repair_vm = repair_vms[0] + # Check attached data disk + assert repair_vm['storageProfile']['dataDisks'][0]['name'] == result['copied_disk_name'] + + # Call Restore + self.cmd('vm repair restore -g {rg} -n {vm} --yes') + + # Check swapped OS disk + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + source_vm = vms[0] + assert source_vm['storageProfile']['osDisk']['name'] == result['copied_disk_name'] + + +class LinuxUnmanagedDiskCreateRestoreTestwithpublicip(LiveScenarioTest): + + @ResourceGroupPreparer(location='westus2') + def test_vmrepair_LinuxUnmanagedCreateRestore(self, resource_group): + self.kwargs.update({ + 'vm': 'vm1' + }) + + # Create test VM + self.cmd('vm create -g {rg} -n {vm} --image UbuntuLTS --admin-username azureadmin --admin-password !Passw0rd2018 --use-unmanaged-disk') + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + # Something wrong with vm create command if it fails here + assert len(vms) == 1 + + # Test create + result = self.cmd('vm repair create -g {rg} -n {vm} --repair-username azureadmin --repair-password !Passw0rd2018 --associate-public-ip -o json').get_output_in_json() + assert result['status'] == STATUS_SUCCESS, result['error_message'] + + # Check repair VM + repair_vms = self.cmd('vm list -g {} -o json'.format(result['repair_resource_group'])).get_output_in_json() + assert len(repair_vms) == 1 + repair_vm = repair_vms[0] + # Check attached data disk + assert repair_vm['storageProfile']['dataDisks'][0]['name'] == result['copied_disk_name'] + + # Call Restore + self.cmd('vm repair restore -g {rg} -n {vm} --yes') + + # Check swapped OS disk + vms = self.cmd('vm list -g {rg} -o json').get_output_in_json() + source_vm = vms[0] + assert source_vm['storageProfile']['osDisk']['vhd']['uri'] == result['copied_disk_uri'] + + class WindowsSinglepassKekEncryptedManagedDiskCreateRestoreTest(LiveScenarioTest): @ResourceGroupPreparer(location='westus2') From e67a550ff30611abb2c6ad0777b845b7c3396dc8 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 12 Aug 2021 16:09:50 +0000 Subject: [PATCH 11/11] new version for making public ip optional on repair vm --- src/vm-repair/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm-repair/setup.py b/src/vm-repair/setup.py index c427ab66a2d..a787c54f20d 100644 --- a/src/vm-repair/setup.py +++ b/src/vm-repair/setup.py @@ -8,7 +8,7 @@ from codecs import open from setuptools import setup, find_packages -VERSION = "0.3.6" +VERSION = "0.3.7" CLASSIFIERS = [ 'Development Status :: 4 - Beta',