Esempio n. 1
0
    def _export_disk(self, instance):
        LOG.debug("Trying to get the root virtual hard driver.")
        current_disk = pathutils.get_root_disk_path(instance)
        if not current_disk:
            raise exception.VBoxException("Cannot get the root disk.")

        disk_info = vhdutils.disk_info(current_disk)
        root_disk_uuid = disk_info[constants.VHD_PARENT_UUID]
        root_disk = vhdutils.disk_info(root_disk_uuid)

        # The root virtual disk is a base disk
        root_disk_path = root_disk[constants.VHD_PATH]
        export_path = os.path.join(
            pathutils.export_dir(instance, constants.PATH_CREATE),
            os.path.basename(root_disk_path))

        LOG.debug("Trying to export the virtual disk to %(export_path)s.",
                  {"export_path": export_path})
        existing = constants.VHD_PARENT_UUID in root_disk
        if existing:
            # The root virtual disk is linked to another disk
            base_info = vhdutils.disk_info(
                root_disk[constants.VHD_PARENT_UUID])
            base_disk_path = base_info[constants.VHD_PATH]
            try:
                LOG.debug("Cloning base disk for the root disk.")
                self._vbox_manage.clone_hd(
                    vhd_path=base_disk_path,
                    new_vdh_path=export_path,
                    disk_format=root_disk[constants.VHD_IMAGE_TYPE])
            except exception.VBoxException:
                with excutils.save_and_reraise_exception():
                    self._clenup_disk(export_path)

        try:
            LOG.debug("Cloning VHD image %(base)s to target: %(target)s", {
                'base': root_disk_path,
                'target': export_path
            })

            # Note(alexandrucoman): If the target disk already exists
            # only the portion of the source medium which fits into the
            # destination medium is copied.
            # This means if the destination medium is smaller than the
            # source only a part of it is copied, and if the destination
            # medium is larger than the source the remaining part of the
            # destination medium is unchanged.
            self._vbox_manage.clone_hd(root_disk_path,
                                       export_path,
                                       existing=existing)
        except exception.VBoxException:
            with excutils.save_and_reraise_exception():
                self._clenup_disk(export_path)

        return export_path
    def _export_disk(self, instance):
        LOG.debug("Trying to get the root virtual hard driver.")
        current_disk = pathutils.get_root_disk_path(instance)
        if not current_disk:
            raise exception.VBoxException("Cannot get the root disk.")

        disk_info = vhdutils.disk_info(current_disk)
        root_disk_uuid = disk_info[constants.VHD_PARENT_UUID]
        root_disk = vhdutils.disk_info(root_disk_uuid)

        # The root virtual disk is a base disk
        root_disk_path = root_disk[constants.VHD_PATH]
        export_path = os.path.join(
            pathutils.export_dir(instance, constants.PATH_CREATE),
            os.path.basename(root_disk_path))

        LOG.debug("Trying to export the virtual disk to %(export_path)s.",
                  {"export_path": export_path})
        existing = constants.VHD_PARENT_UUID in root_disk
        if existing:
            # The root virtual disk is linked to another disk
            base_info = vhdutils.disk_info(
                root_disk[constants.VHD_PARENT_UUID])
            base_disk_path = base_info[constants.VHD_PATH]
            try:
                LOG.debug("Cloning base disk for the root disk.")
                self._vbox_manage.clone_hd(
                    vhd_path=base_disk_path,
                    new_vdh_path=export_path,
                    disk_format=root_disk[constants.VHD_IMAGE_TYPE])
            except exception.VBoxException:
                with excutils.save_and_reraise_exception():
                    self._clenup_disk(export_path)

        try:
            LOG.debug(
                "Cloning VHD image %(base)s to target: %(target)s",
                {'base': root_disk_path, 'target': export_path})

            # Note(alexandrucoman): If the target disk already exists
            # only the portion of the source medium which fits into the
            # destination medium is copied.
            # This means if the destination medium is smaller than the
            # source only a part of it is copied, and if the destination
            # medium is larger than the source the remaining part of the
            # destination medium is unchanged.
            self._vbox_manage.clone_hd(root_disk_path, export_path,
                                       existing=existing)
        except exception.VBoxException:
            with excutils.save_and_reraise_exception():
                self._clenup_disk(export_path)

        return export_path
Esempio n. 3
0
    def test_export_dir(self, mock_instance_basepath, mock_join):
        pathutils.export_dir(self._instance)

        mock_instance_basepath.assert_called_once_with(self._instance)
        self.assertEqual(1, mock_join.call_count)
    def test_export_dir(self, mock_instance_basepath, mock_join):
        pathutils.export_dir(self._instance)

        mock_instance_basepath.assert_called_once_with(self._instance)
        self.assertEqual(1, mock_join.call_count)