def _copy_image_file_from_host(self, remote_source_path, local_dest_dir, compress=False): """ Copy a file from IVM to the nova-compute host, and return the location of the copy :param remote_source_path remote source file path :param local_dest_dir local destination directory :param compress: if True, compress the file before transfer; if False (default), copy the file as is """ temp_str = common.aix_path_join(local_dest_dir, os.path.basename(remote_source_path)) local_file_path = temp_str + ".gz" if compress: copy_from_path = remote_source_path + ".gz" else: copy_from_path = remote_source_path if compress: # Gzip the file cmd = "/usr/bin/gzip %s" % remote_source_path self.run_vios_command_as_root(cmd) # Cleanup uncompressed remote file cmd = "/usr/bin/rm -f %s" % remote_source_path self.run_vios_command_as_root(cmd) # Get file checksum output = self._md5sum_remote_file(copy_from_path) if not output: LOG.error(_("Unable to get checksum")) msg_args = {"file_path": copy_from_path} raise exception.PowerVMFileTransferFailed(**msg_args) else: source_chksum = output.split(" ")[0] # Copy file to host common.ftp_get_command(self.connection_data, copy_from_path, local_file_path) # Calculate copied image checksum with open(local_file_path, "r") as image_file: hasher = hashlib.md5() block_size = 0x10000 buf = image_file.read(block_size) while len(buf) > 0: hasher.update(buf) buf = image_file.read(block_size) dest_chksum = hasher.hexdigest() # do comparison if source_chksum and dest_chksum != source_chksum: LOG.error(_("Image checksums do not match")) raise exception.PowerVMFileTransferFailed() # Cleanup transferred remote file cmd = "/usr/bin/rm -f %s" % copy_from_path output = self.run_vios_command_as_root(cmd) return local_file_path
def _copy_image_file_from_host(self, remote_source_path, local_dest_dir, compress=False): """ Copy a file from IVM to the nova-compute host, and return the location of the copy :param remote_source_path remote source file path :param local_dest_dir local destination directory :param compress: if True, compress the file before transfer; if False (default), copy the file as is """ temp_str = common.aix_path_join(local_dest_dir, os.path.basename(remote_source_path)) local_file_path = temp_str + '.gz' if compress: copy_from_path = remote_source_path + '.gz' else: copy_from_path = remote_source_path if compress: # Gzip the file cmd = "/usr/bin/gzip %s" % remote_source_path self.run_vios_command_as_root(cmd) # Cleanup uncompressed remote file cmd = "/usr/bin/rm -f %s" % remote_source_path self.run_vios_command_as_root(cmd) # Get file checksum output = self._md5sum_remote_file(copy_from_path) if not output: LOG.error(_("Unable to get checksum")) msg_args = {'file_path': copy_from_path} raise exception.PowerVMFileTransferFailed(**msg_args) else: source_chksum = output.split(' ')[0] # Copy file to host common.ftp_get_command(self.connection_data, copy_from_path, local_file_path) # Calculate copied image checksum dest_chksum = self._checksum_local_file(local_file_path) # do comparison if source_chksum and dest_chksum != source_chksum: LOG.error(_("Image checksums do not match")) raise exception.PowerVMFileTransferFailed( file_path=local_file_path) # Cleanup transferred remote file cmd = "/usr/bin/rm -f %s" % copy_from_path output = self.run_vios_command_as_root(cmd) return local_file_path