| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -280,9 +280,12 @@ class VMBuilderScript(VMBuilder):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        from pvcapid.Daemon import config
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        import daemon_lib.common as pvc_common
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        import daemon_lib.ceph as pvc_ceph
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        import os
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        # First loop: Create the destination disks
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        print("Creating destination disk volumes")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for volume in self.vm_data["volumes"]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            print(f"Processing volume {volume['volume_name']}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            with open_zk(config) as zkhandler:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                success, message = pvc_ceph.add_volume(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    zkhandler,
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -297,7 +300,9 @@ class VMBuilderScript(VMBuilder):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        # Second loop: Map the destination disks
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        print("Mapping destination disk 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 = f"{volume['pool']}/{dst_volume_name}"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -312,7 +317,9 @@ class VMBuilderScript(VMBuilder):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    raise ProvisioningError(f"Failed to map volume '{dst_volume}'.")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        # Third loop: Map the source disks
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        print("Mapping source disk volumes")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        for volume in self.vm_data["volumes"]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            print(f"Processing volume {volume['volume_name']}")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            src_volume_name = volume["volume_name"]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -326,7 +333,16 @@ class VMBuilderScript(VMBuilder):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                if not success:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    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"]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            src_volume_name = volume["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_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(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                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}"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def install(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        install(): Perform the installation
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        Noop for OVA deploys as no further tasks are performed.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        pass
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def cleanup(self):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        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.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        """
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        # 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"])):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            src_volume_name = volume["volume_name"]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            src_volume = f"{volume['pool']}/{src_volume_name}"
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				 
 |