Skip to content

Commit

Permalink
Merge pull request #29 from QualiSystems/issue#5248_linked_clone_hdd_…
Browse files Browse the repository at this point in the history
…modification_error

AB#5248
  • Loading branch information
alexquali authored Aug 5, 2021
2 parents 367e75e + 97e3883 commit c1180c7
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 17 deletions.
12 changes: 9 additions & 3 deletions cloudshell/cp/vcenter/common/vcenter/vmomi_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -751,9 +751,15 @@ def reconfigure_vm(self, vm, cpu, ram, hdd, logger):

task = vm.ReconfigVM_Task(spec=config_spec)

return self.task_waiter.wait_for_task(
task=task, logger=logger, action_name="Reconfigure VM"
)
try:
return self.task_waiter.wait_for_task(
task=task, logger=logger, action_name="Reconfigure VM"
)
except TaskFaultException as err:
logger.error("Error during VM Reconfiguration: {}".format(err))
raise ReconfigureVMException(
"Error during VM Reconfiguration. See logs for more details."
)

def _get_device_controller_key(self, vm):
"""Get SCSI Controller device key for the new VM disk creation.
Expand Down
47 changes: 47 additions & 0 deletions cloudshell/cp/vcenter/vm/deploy.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import os
import traceback

from pyVmomi import vim

from cloudshell.cp.core.models import Attribute, DeployAppResult, VmDetailsProperty
from cloudshell.cp.core.utils import convert_to_bool

Expand Down Expand Up @@ -81,6 +84,44 @@ def deploy_from_linked_clone(
"""

template_resource_model = data_holder.template_resource_model
orig_vm_path, orig_vm_name = os.path.split(template_resource_model.vcenter_vm)
orig_vm_path = VMLocation.combine(
[vcenter_data_model.default_datacenter, orig_vm_path]
)
original_vm = self.pv_service.find_vm_by_name(
si=si,
path=orig_vm_path,
name=orig_vm_name,
)

disk_count = 0
for device in original_vm.config.hardware.device:
if isinstance(device, vim.vm.device.VirtualDisk):
disk_count += 1
logger.debug(
"Original VM Disk {} size {}".format(
disk_count,
device.capacityInKB,
)
)
if f"{disk_count}:" in template_resource_model.hdd:
logger.error(
f"Disk {disk_count} can not be reconfigured "
f"because it exists in original Virtual Machine."
)
self.folder_manager.delete_folder_if_empty(
si=si,
folder_full_path=VMLocation.combine(
[
vcenter_data_model.default_datacenter,
template_resource_model.vm_location,
]
),
logger=logger,
)
raise Exception(
"Can not deploy current VM configuration. See logs for details."
)

return self._deploy_a_clone(
si=si,
Expand Down Expand Up @@ -265,11 +306,17 @@ def _deploy_a_clone(
deployed_app_attrs = []

if clone_vm_result.user is not None:
logger.debug("Username is: {}".format(clone_vm_result.user))
deployed_app_attrs.append(Attribute("User", clone_vm_result.user))

if clone_vm_result.password is not None:
deployed_app_attrs.append(Attribute("Password", clone_vm_result.password))

if clone_vm_result.vm.guest.hostName is not None:
deployed_app_attrs.append(
Attribute("System Name", clone_vm_result.vm.guest.hostName)
)

return DeployAppResult(
vmName=vm_name,
vmUuid=clone_vm_result.vm.summary.config.uuid,
Expand Down
26 changes: 14 additions & 12 deletions cloudshell/cp/vcenter/vm/vm_details_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,11 @@ def _get_vm_instance_data(self, vm, deployment_details_provider):
data.extend(deployment_details_provider.get_details())

memo_size_kb = vm.summary.config.memorySizeMB * 1024
disk_size_kb = next(
(
device.capacityInKB
for device in vm.config.hardware.device
if isinstance(device, vim.vm.device.VirtualDisk)
),
0,
)
disk_size_kb = [
device.capacityInKB
for device in vm.config.hardware.device
if isinstance(device, vim.vm.device.VirtualDisk)
]
snapshot = None
if vm.snapshot:
snapshot = self._get_snapshot_path(
Expand All @@ -79,11 +76,16 @@ def _get_vm_instance_data(self, vm, deployment_details_provider):
data.append(
VmDetailsProperty(key="Memory", value=self._convert_kb_to_str(memo_size_kb))
)
data.append(
VmDetailsProperty(
key="Disk Size", value=self._convert_kb_to_str(disk_size_kb)

for disk_id, disk_size in enumerate(disk_size_kb, start=1):
data.append(
VmDetailsProperty(
key=f"Disk {disk_id} Size",
value=self._convert_kb_to_str(disk_size),
)
)
)

data.append(VmDetailsProperty(key="Hostname", value=vm.guest.hostName))
data.append(
VmDetailsProperty(key="Guest OS", value=vm.summary.config.guestFullName)
)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_commands/test_vm_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def test(self, get_network_by_device):
pass
self.assertEqual(vm_details.appName, "App1")
self.assertEqual(vm_details.errorMessage, "")
self.assertEqual(len(vm_details.vmInstanceData), 7)
self.assertEqual(len(vm_details.vmInstanceData), 8)

self.assertEqual(len(vm_details.vmNetworkData), 1)
nic = vm_details.vmNetworkData[0]
Expand Down
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.4.0
3.4.1

0 comments on commit c1180c7

Please sign in to comment.