| 
						
					 | 
					 | 
					@@ -280,9 +280,12 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        from pvcapid.Daemon import config
 | 
					 | 
					 | 
					 | 
					        from pvcapid.Daemon import config
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        import daemon_lib.common as pvc_common
 | 
					 | 
					 | 
					 | 
					        import daemon_lib.common as pvc_common
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        import daemon_lib.ceph as pvc_ceph
 | 
					 | 
					 | 
					 | 
					        import daemon_lib.ceph as pvc_ceph
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        import os
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        # First loop: Create the destination disks
 | 
					 | 
					 | 
					 | 
					        # First loop: Create the destination disks
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("Creating destination disk volumes")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            print(f"Processing volume {volume['volume_name']}")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            with open_zk(config) as zkhandler:
 | 
					 | 
					 | 
					 | 
					            with open_zk(config) as zkhandler:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                success, message = pvc_ceph.add_volume(
 | 
					 | 
					 | 
					 | 
					                success, message = pvc_ceph.add_volume(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    zkhandler,
 | 
					 | 
					 | 
					 | 
					                    zkhandler,
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -297,7 +300,9 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    )
 | 
					 | 
					 | 
					 | 
					                    )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        # Second loop: Map the destination disks
 | 
					 | 
					 | 
					 | 
					        # Second loop: Map the destination disks
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("Mapping destination disk volumes")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            print(f"Processing volume {volume['volume_name']}")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            dst_volume_name = f"{self.vm_name}_{volume['disk_id']}"
 | 
					 | 
					 | 
					 | 
					            dst_volume_name = f"{self.vm_name}_{volume['disk_id']}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            dst_volume = f"{volume['pool']}/{dst_volume_name}"
 | 
					 | 
					 | 
					 | 
					            dst_volume = f"{volume['pool']}/{dst_volume_name}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -312,7 +317,9 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    raise ProvisioningError(f"Failed to map volume '{dst_volume}'.")
 | 
					 | 
					 | 
					 | 
					                    raise ProvisioningError(f"Failed to map volume '{dst_volume}'.")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        # Third loop: Map the source disks
 | 
					 | 
					 | 
					 | 
					        # Third loop: Map the source disks
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        print("Mapping source disk volumes")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            print(f"Processing volume {volume['volume_name']}")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -326,7 +333,16 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                if not success:
 | 
					 | 
					 | 
					 | 
					                if not success:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    raise ProvisioningError(f"Failed to map volume '{src_volume}'.")
 | 
					 | 
					 | 
					 | 
					                    raise ProvisioningError(f"Failed to map volume '{src_volume}'.")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        # Fourth loop: Convert the source (usually VMDK) volume to the raw destination volume
 | 
					 | 
					 | 
					 | 
					    def install(self):
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        """
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        install(): Perform the installation
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        Convert the mapped source volumes to the mapped destination volumes
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        """
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        # Run any imports first
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        import daemon_lib.common as pvc_common
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
					 | 
					 | 
					 | 
					        for volume in self.vm_data["volumes"]:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -335,6 +351,9 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            dst_volume = f"{volume['pool']}/{dst_volume_name}"
 | 
					 | 
					 | 
					 | 
					            dst_volume = f"{volume['pool']}/{dst_volume_name}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            dst_devpath = f"/dev/rbd/{dst_volume}"
 | 
					 | 
					 | 
					 | 
					            dst_devpath = f"/dev/rbd/{dst_volume}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            print(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                f"Converting {volume['volume_format']} {src_volume} at {src_devpath} to {dst_volume} at {dst_devpath}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            retcode, stdout, stderr = pvc_common.run_os_command(
 | 
					 | 
					 | 
					 | 
					            retcode, stdout, stderr = pvc_common.run_os_command(
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                f"qemu-img convert -C -f {volume['volume_format']} -O raw {src_devpath} {dst_devpath}"
 | 
					 | 
					 | 
					 | 
					                f"qemu-img convert -C -f {volume['volume_format']} -O raw {src_devpath} {dst_devpath}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            )
 | 
					 | 
					 | 
					 | 
					            )
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -343,15 +362,6 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    f"Failed to convert {volume['volume_format']} volume '{src_volume}' to raw volume '{dst_volume}' with qemu-img: {stderr}"
 | 
					 | 
					 | 
					 | 
					                    f"Failed to convert {volume['volume_format']} volume '{src_volume}' to raw volume '{dst_volume}' with qemu-img: {stderr}"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                )
 | 
					 | 
					 | 
					 | 
					                )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def install(self):
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        """
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        install(): Perform the installation
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Noop for OVA deploys as no further tasks are performed.
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        """
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        pass
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    def cleanup(self):
 | 
					 | 
					 | 
					 | 
					    def cleanup(self):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        """
 | 
					 | 
					 | 
					 | 
					        """
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        cleanup(): Perform any cleanup required due to prepare()/install()
 | 
					 | 
					 | 
					 | 
					        cleanup(): Perform any cleanup required due to prepare()/install()
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -361,6 +371,11 @@ class VMBuilderScript(VMBuilder):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        here, be warned that doing so might cause loops. Do this only if you really need to.
 | 
					 | 
					 | 
					 | 
					        here, be warned that doing so might cause loops. Do this only if you really need to.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        """
 | 
					 | 
					 | 
					 | 
					        """
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        # Run any imports first
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        from pvcapid.vmbuilder import open_zk
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        from pvcapid.Daemon import config
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        import daemon_lib.ceph as pvc_ceph
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for volume in list(reversed(self.vm_data["volumes"])):
 | 
					 | 
					 | 
					 | 
					        for volume in list(reversed(self.vm_data["volumes"])):
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
					 | 
					 | 
					 | 
					            src_volume_name = volume["volume_name"]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
					 | 
					 | 
					 | 
					            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					 
 |