def test_get_image_type(self, mock_disk_info): disk_path = mock.sentinel.disk_path mock_disk_info.return_value = { constants.VHD_IMAGE_TYPE: constants.DISK_FORMAT_VHD} self.assertEqual(constants.DISK_FORMAT_VHD, vhdutils.get_image_type(disk_path))
def test_get_image_type(self, mock_disk_info): disk_path = mock.sentinel.disk_path mock_disk_info.return_value = { constants.VHD_IMAGE_TYPE: constants.DISK_FORMAT_VHD } self.assertEqual(constants.DISK_FORMAT_VHD, vhdutils.get_image_type(disk_path))
def test_get_image_type_fail(self, mock_disk_info): disk_path = mock.sentinel.disk_path mock_disk_info.side_effect = [ vbox_exception.VBoxManageError(method="showhdinfo", reason="fake-error"), {constants.VHD_IMAGE_TYPE: 'fake-image-type'}, ] self.assertIsNone(vhdutils.get_image_type(disk_path)) self.assertRaises(nova_exception.InvalidDiskFormat, vhdutils.get_image_type, disk_path)
def test_get_image_type_fail(self, mock_disk_info): disk_path = mock.sentinel.disk_path mock_disk_info.side_effect = [ vbox_exception.VBoxManageError(method="showhdinfo", reason="fake-error"), { constants.VHD_IMAGE_TYPE: 'fake-image-type' }, ] self.assertIsNone(vhdutils.get_image_type(disk_path)) self.assertRaises(nova_exception.InvalidDiskFormat, vhdutils.get_image_type, disk_path)
def create_root_disk(self, context, instance): base_vhd_path = imagecache.get_cached_image(context, instance) base_info = vhdutils.disk_info(base_vhd_path) root_vhd_path = pathutils.root_disk_path( instance, disk_format=base_info[constants.VHD_IMAGE_TYPE]) if CONF.use_cow_images: LOG.debug( "Creating differencing VHD. Parent: %(parent)s, " "Target: %(target)s", { 'parent': base_vhd_path, 'target': root_vhd_path }, instance=instance) self._vbox_manage.create_hd( filename=root_vhd_path, # disk_format=base_info[constants.VHD_IMAGE_TYPE], variant=constants.VARIANT_STANDARD, parent=base_vhd_path) else: LOG.debug( "Cloning VHD image %(base)s to target: %(target)s", { 'base': base_vhd_path, 'target': root_vhd_path }, instance=instance) self._vbox_manage.clone_hd( vhd_path=base_vhd_path, new_vdh_path=root_vhd_path, disk_format=base_info[constants.VHD_IMAGE_TYPE], variant=constants.VARIANT_STANDARD) # Resize image if is necesary disk_format = vhdutils.get_image_type(root_vhd_path) if instance.root_gb and disk_format in (constants.DISK_FORMAT_VDI, constants.DISK_FORMAT_VHD): base_vhd_size = base_info[constants.VHD_CAPACITY] / units.Mi root_vhd_size = instance.root_gb * units.Ki if vhdutils.is_resize_required( disk_path=root_vhd_path, old_size=base_vhd_size, new_size=root_vhd_size, instance=instance): self._vbox_manage.modify_hd( root_vhd_path, constants.FIELD_HD_RESIZE_MB, root_vhd_size) return root_vhd_path
def _save_glance_image(self, context, image_id, image_vhd_path): LOG.debug("Updating Glance image %(image_id)s with content from " "merged disk %(image_vhd_path)s", {'image_id': image_id, 'image_vhd_path': image_vhd_path}) disk_format = vhdutils.get_image_type(image_vhd_path) (glance_image_service, image_id) = glance.get_remote_image_service(context, image_id) image_metadata = {"is_public": False, "disk_format": disk_format.lower(), "container_format": "bare", "properties": {}} with open(image_vhd_path, 'rb') as file_handle: glance_image_service.update(context, image_id, image_metadata, file_handle)
def create_root_disk(self, context, instance): base_vhd_path = imagecache.get_cached_image(context, instance) base_info = vhdutils.disk_info(base_vhd_path) root_vhd_path = pathutils.root_disk_path( instance, disk_format=base_info[constants.VHD_IMAGE_TYPE]) if CONF.use_cow_images: LOG.debug( "Creating differencing VHD. Parent: %(parent)s, " "Target: %(target)s", { 'parent': base_vhd_path, 'target': root_vhd_path }, instance=instance) self._vbox_manage.create_hd( filename=root_vhd_path, # disk_format=base_info[constants.VHD_IMAGE_TYPE], variant=constants.VARIANT_STANDARD, parent=base_vhd_path) else: LOG.debug("Cloning VHD image %(base)s to target: %(target)s", { 'base': base_vhd_path, 'target': root_vhd_path }, instance=instance) self._vbox_manage.clone_hd( vhd_path=base_vhd_path, new_vdh_path=root_vhd_path, disk_format=base_info[constants.VHD_IMAGE_TYPE], variant=constants.VARIANT_STANDARD) # Resize image if is necesary disk_format = vhdutils.get_image_type(root_vhd_path) if instance.root_gb and disk_format in (constants.DISK_FORMAT_VDI, constants.DISK_FORMAT_VHD): base_vhd_size = base_info[constants.VHD_CAPACITY] / units.Mi root_vhd_size = instance.root_gb * units.Ki if vhdutils.is_resize_required(disk_path=root_vhd_path, old_size=base_vhd_size, new_size=root_vhd_size, instance=instance): self._vbox_manage.modify_hd(root_vhd_path, constants.FIELD_HD_RESIZE_MB, root_vhd_size) return root_vhd_path
def _save_glance_image(self, context, image_id, image_vhd_path): LOG.debug( "Updating Glance image %(image_id)s with content from " "merged disk %(image_vhd_path)s", { 'image_id': image_id, 'image_vhd_path': image_vhd_path }) disk_format = vhdutils.get_image_type(image_vhd_path) (glance_image_service, image_id) = glance.get_remote_image_service(context, image_id) image_metadata = { "is_public": False, "disk_format": disk_format.lower(), "container_format": "bare", "properties": {} } with open(image_vhd_path, 'rb') as file_handle: glance_image_service.update(context, image_id, image_metadata, file_handle)