Example #1
0
 def test_legacy_mapping_from_object_list(self):
     bdm1 = objects.BlockDeviceMapping()
     bdm1 = objects.BlockDeviceMapping._from_db_object(
         None, bdm1, fake_block_device.FakeDbBlockDeviceDict(
             self.new_mapping[0]))
     bdm2 = objects.BlockDeviceMapping()
     bdm2 = objects.BlockDeviceMapping._from_db_object(
         None, bdm2, fake_block_device.FakeDbBlockDeviceDict(
             self.new_mapping[1]))
     bdmlist = objects.BlockDeviceMappingList()
     bdmlist.objects = [bdm1, bdm2]
     block_device.legacy_mapping(bdmlist)
Example #2
0
 def block_device_mapping_get_all_by_instance(self, context, instance,
                                              legacy):
     bdms = self.db.block_device_mapping_get_all_by_instance(
         context, instance['uuid'])
     if legacy:
         bdms = block_device.legacy_mapping(bdms)
     return jsonutils.to_primitive(bdms)
Example #3
0
    def rebuild_instance(self, ctxt, instance, new_pass, injected_files,
            image_ref, orig_image_ref, orig_sys_metadata, bdms,
            recreate=False, on_shared_storage=False, host=None,
            preserve_ephemeral=False, kwargs=None):
        # NOTE(danms): kwargs is only here for cells compatibility, don't
        # actually send it to compute
        extra = {'preserve_ephemeral': preserve_ephemeral}
        if self.client.can_send_version('3.21'):
            version = '3.21'
        else:
            bdms = block_device.legacy_mapping(bdms)
            bdms = jsonutils.to_primitive(objects_base.obj_to_primitive(bdms))
            if self.client.can_send_version('3.5'):
                version = '3.5'
            elif self.client.can_send_version('3.4'):
                version = '3.4'
                extra = {}
            else:
                # NOTE(russellb) Havana compat
                version = self._get_compat_version('3.0', '2.22')
                instance = jsonutils.to_primitive(instance)
                extra = {}

        cctxt = self.client.prepare(server=_compute_host(host, instance),
                version=version)
        cctxt.cast(ctxt, 'rebuild_instance',
                   instance=instance, new_pass=new_pass,
                   injected_files=injected_files, image_ref=image_ref,
                   orig_image_ref=orig_image_ref,
                   orig_sys_metadata=orig_sys_metadata, bdms=bdms,
                   recreate=recreate, on_shared_storage=on_shared_storage,
                   **extra)
Example #4
0
 def block_device_mapping_get_all_by_instance(self, context, instance,
                                              legacy=True):
     bdms = db.block_device_mapping_get_all_by_instance(context,
                                                        instance['uuid'])
     if legacy:
         bdms = block_device.legacy_mapping(bdms)
     return bdms
Example #5
0
    def _handle_cell_delete(self, context, instance, method_name):
        if not instance.cell_name:
            delete_type = method_name == 'soft_delete' and 'soft' or 'hard'
            self.cells_rpcapi.instance_delete_everywhere(context,
                    instance, delete_type)
            bdms = block_device.legacy_mapping(
                self.db.block_device_mapping_get_all_by_instance(
                    context, instance.uuid))
            # NOTE(danms): If we try to delete an instance with no cell,
            # there isn't anything to salvage, so we can hard-delete here.
            try:
                super(ComputeCellsAPI, self)._local_delete(context, instance,
                                                           bdms, method_name,
                                                           self._do_delete)
            except exception.ObjectActionError:
                # NOTE(alaski): We very likely got here because the host
                # constraint in instance.destroy() failed.  This likely means
                # that an update came up from a child cell and cell_name is
                # set now.  If so try the delete again.
                with excutils.save_and_reraise_exception() as exc:
                    instance.refresh()
                    if instance.cell_name:
                        exc.reraise = False
                        self._handle_cell_delete(context, instance,
                                method_name)
            return

        method = getattr(super(ComputeCellsAPI, self), method_name)
        method(context, instance)
Example #6
0
    def rebuild_instance(self, ctxt, instance, new_pass, injected_files,
            image_ref, orig_image_ref, orig_sys_metadata, bdms,
            recreate=False, on_shared_storage=False, host=None,
            preserve_ephemeral=False, kwargs=None):
        # NOTE(danms): kwargs is only here for cells compatibility, don't
        # actually send it to compute
        extra = {'preserve_ephemeral': preserve_ephemeral}
        if self.client.can_send_version('3.21'):
            version = '3.21'
        else:
            bdms = block_device.legacy_mapping(bdms)
            bdms = jsonutils.to_primitive(objects_base.obj_to_primitive(bdms))
            if self.client.can_send_version('3.5'):
                version = '3.5'
            elif self.client.can_send_version('3.4'):
                version = '3.4'
                extra = {}
            else:
                # NOTE(russellb) Havana compat
                version = self._get_compat_version('3.0', '2.22')
                instance = jsonutils.to_primitive(instance)
                extra = {}

        cctxt = self.client.prepare(server=_compute_host(host, instance),
                version=version)
        cctxt.cast(ctxt, 'rebuild_instance',
                   instance=instance, new_pass=new_pass,
                   injected_files=injected_files, image_ref=image_ref,
                   orig_image_ref=orig_image_ref,
                   orig_sys_metadata=orig_sys_metadata, bdms=bdms,
                   recreate=recreate, on_shared_storage=on_shared_storage,
                   **extra)
Example #7
0
 def block_device_mapping_get_all_by_instance(self, context, instance,
                                              legacy):
     bdms = self.db.block_device_mapping_get_all_by_instance(
         context, instance['uuid'])
     if legacy:
         bdms = block_device.legacy_mapping(bdms)
     return jsonutils.to_primitive(bdms)
Example #8
0
    def _handle_cell_delete(self, context, instance, method_name):
        if not instance.cell_name:
            delete_type = method_name == 'soft_delete' and 'soft' or 'hard'
            self.cells_rpcapi.instance_delete_everywhere(
                context, instance, delete_type)
            bdms = block_device.legacy_mapping(
                self.db.block_device_mapping_get_all_by_instance(
                    context, instance.uuid))
            # NOTE(danms): If we try to delete an instance with no cell,
            # there isn't anything to salvage, so we can hard-delete here.
            try:
                super(ComputeCellsAPI,
                      self)._local_delete(context, instance, bdms, method_name,
                                          self._do_delete)
            except exception.ObjectActionError:
                # NOTE(alaski): We very likely got here because the host
                # constraint in instance.destroy() failed.  This likely means
                # that an update came up from a child cell and cell_name is
                # set now.  If so try the delete again.
                with excutils.save_and_reraise_exception() as exc:
                    instance.refresh()
                    if instance.cell_name:
                        exc.reraise = False
                        self._handle_cell_delete(context, instance,
                                                 method_name)
            return

        method = getattr(super(ComputeCellsAPI, self), method_name)
        method(context, instance)
Example #9
0
File: fake.py Project: kraman/nova
 def block_device_mapping_get_all_by_instance(self, context, instance,
                                              legacy=True):
     bdms = db.block_device_mapping_get_all_by_instance(context,
                                                        instance['uuid'])
     if legacy:
         bdms = block_device.legacy_mapping(bdms)
     return bdms
Example #10
0
    def _handle_cell_delete(self, context, instance, method_name):
        if not instance.cell_name:
            delete_type = method_name == "soft_delete" and "soft" or "hard"
            self.cells_rpcapi.instance_delete_everywhere(context, instance, delete_type)
            bdms = block_device.legacy_mapping(self.db.block_device_mapping_get_all_by_instance(context, instance.uuid))
            # NOTE(danms): If we try to delete an instance with no cell,
            # there isn't anything to salvage, so we can hard-delete here.
            try:
                super(ComputeCellsAPI, self)._local_delete(context, instance, bdms, method_name, self._do_delete)
            except exception.ObjectActionError:
                # NOTE(alaski): We very likely got here because the host
                # constraint in instance.destroy() failed.  This likely means
                # that an update came up from a child cell and cell_name is
                # set now.  If so try the delete again.
                with excutils.save_and_reraise_exception() as exc:
                    try:
                        instance.refresh()
                    except exception.InstanceNotFound:
                        # NOTE(melwitt): If the instance has already been
                        # deleted by instance_destroy_at_top from a cell,
                        # instance.refresh() will raise InstanceNotFound.
                        exc.reraise = False
                    else:
                        if instance.cell_name:
                            exc.reraise = False
                            self._handle_cell_delete(context, instance, method_name)
            except exception.InstanceNotFound:
                # NOTE(melwitt): We can get here if anything tries to
                # lookup the instance after a instance_destroy_at_top hits.
                pass
            return

        method = getattr(super(ComputeCellsAPI, self), method_name)
        method(context, instance)
Example #11
0
 def terminate_instance(self, ctxt, instance, bdms, reservations=None):
     # NOTE(russellb) Havana compat
     if self.client.can_send_version("3.22"):
         version = "3.22"
     else:
         version = self._get_compat_version("3.0", "2.35")
         bdms = block_device.legacy_mapping(bdms)
         bdms = jsonutils.to_primitive(objects_base.obj_to_primitive(bdms))
     cctxt = self.client.prepare(server=_compute_host(None, instance), version=version)
     cctxt.cast(ctxt, "terminate_instance", instance=instance, bdms=bdms, reservations=reservations)
Example #12
0
 def terminate_instance(self, ctxt, instance, bdms, reservations=None):
     # NOTE(russellb) Havana compat
     if self.client.can_send_version('3.22'):
         version = '3.22'
     else:
         version = self._get_compat_version('3.0', '2.35')
         bdms = block_device.legacy_mapping(bdms)
         bdms = jsonutils.to_primitive(objects_base.obj_to_primitive(bdms))
     cctxt = self.client.prepare(server=_compute_host(None, instance),
             version=version)
     cctxt.cast(ctxt, 'terminate_instance',
                instance=instance, bdms=bdms,
                reservations=reservations)
Example #13
0
    def _handle_cell_delete(self, context, instance, method_name):
        if not instance["cell_name"]:
            delete_type = method_name == "soft_delete" and "soft" or "hard"
            self.cells_rpcapi.instance_delete_everywhere(context, instance, delete_type)
            bdms = block_device.legacy_mapping(
                self.db.block_device_mapping_get_all_by_instance(context, instance["uuid"])
            )
            # NOTE(danms): If we try to delete an instance with no cell,
            # there isn't anything to salvage, so we can hard-delete here.
            super(ComputeCellsAPI, self)._local_delete(context, instance, bdms, method_name, self._do_delete)
            return

        method = getattr(super(ComputeCellsAPI, self), method_name)
        method(context, instance)
Example #14
0
    def _handle_cell_delete(self, context, instance, delete_type):
        if not instance['cell_name']:
            self.cells_rpcapi.instance_delete_everywhere(
                context, instance, delete_type)
            bdms = block_device.legacy_mapping(
                self.db.block_device_mapping_get_all_by_instance(
                    context, instance['uuid']))
            # NOTE(danms): If we try to delete an instance with no cell,
            # there isn't anything to salvage, so we can hard-delete here.
            super(ComputeCellsAPI,
                  self)._local_delete(context, instance, bdms, delete_type,
                                      self._do_delete)
            return

        method = getattr(super(ComputeCellsAPI, self), delete_type)
        method(context, instance)
Example #15
0
    def test_legacy_mapping_source_image(self):
        got_legacy = block_device.legacy_mapping(self.new_mapping)

        for legacy, expected in zip(got_legacy, self.legacy_mapping):
            self.assertThat(expected, matchers.IsSubDictOf(legacy))
Example #16
0
    def test_legacy_mapping_source_image(self):
        got_legacy = block_device.legacy_mapping(self.new_mapping)

        for legacy, expected in zip(got_legacy, self.legacy_mapping):
            self.assertThat(expected, matchers.IsSubDictOf(legacy))