Example #1
0
    def test_build_instances(self):
        call_info = self._stub_rpc_method('cast', None)

        instances = [objects.Instance(id=1), objects.Instance(id=2)]

        self.cells_rpcapi.build_instances(self.fake_context,
                                          instances=instances,
                                          image={'fake': 'image'},
                                          arg1=1,
                                          arg2=2,
                                          arg3=3)

        expected_args = {
            'build_inst_kwargs': {
                'instances': instances,
                'image': {
                    'fake': 'image'
                },
                'arg1': 1,
                'arg2': 2,
                'arg3': 3
            }
        }
        self._check_result(call_info,
                           'build_instances',
                           expected_args,
                           version='1.34')
Example #2
0
    def test_format_instance_mapping(self):
        # Make sure that _format_instance_mappings works.
        ctxt = None
        instance_ref0 = objects.Instance(**{'id': 0,
                         'uuid': 'e5fe5518-0288-4fa3-b0c4-c79764101b85',
                         'root_device_name': None,
                         'default_ephemeral_device': None,
                         'default_swap_device': None})
        instance_ref1 = objects.Instance(**{'id': 0,
                         'uuid': 'b65cee2f-8c69-4aeb-be2f-f79742548fc2',
                         'root_device_name': '/dev/sda1',
                         'default_ephemeral_device': None,
                         'default_swap_device': None})

        def fake_bdm_get(ctxt, uuid, use_slave=False):
            return [fake_block_device.FakeDbBlockDeviceDict(
                    {'volume_id': 87654321,
                     'snapshot_id': None,
                     'no_device': None,
                     'source_type': 'volume',
                     'destination_type': 'volume',
                     'delete_on_termination': True,
                     'device_name': '/dev/sdh'}),
                    fake_block_device.FakeDbBlockDeviceDict(
                    {'volume_id': None,
                     'snapshot_id': None,
                     'no_device': None,
                     'source_type': 'blank',
                     'destination_type': 'local',
                     'guest_format': 'swap',
                     'delete_on_termination': None,
                     'device_name': '/dev/sdc'}),
                    fake_block_device.FakeDbBlockDeviceDict(
                    {'volume_id': None,
                     'snapshot_id': None,
                     'no_device': None,
                     'source_type': 'blank',
                     'destination_type': 'local',
                     'guest_format': None,
                     'delete_on_termination': None,
                     'device_name': '/dev/sdb'})]

        self.stubs.Set(db, 'block_device_mapping_get_all_by_instance',
                       fake_bdm_get)

        expected = {'ami': 'sda1',
                    'root': '/dev/sda1',
                    'ephemeral0': '/dev/sdb',
                    'swap': '/dev/sdc',
                    'ebs0': '/dev/sdh'}

        conductor_api.LocalAPI()

        self.assertEqual(base._format_instance_mapping(ctxt,
                         instance_ref0), block_device._DEFAULT_MAPPINGS)
        self.assertEqual(base._format_instance_mapping(ctxt,
                         instance_ref1), expected)
Example #3
0
 def test_build_instances(self):
     build_inst_kwargs = {'instances': [objects.Instance(),
                                        objects.Instance()]}
     self.mox.StubOutWithMock(self.msg_runner, 'build_instances')
     our_cell = self.msg_runner.state_manager.get_my_state()
     self.msg_runner.build_instances(self.ctxt, our_cell, build_inst_kwargs)
     self.mox.ReplayAll()
     self.cells_manager.build_instances(self.ctxt,
             build_inst_kwargs=build_inst_kwargs)
Example #4
0
 def test_instance_uuids_overlap(self):
     inst1 = objects.Instance(uuid='aa')
     inst2 = objects.Instance(uuid='bb')
     instances = [inst1, inst2]
     host_state = fakes.FakeHostState('host1', 'node1', {})
     host_state.instances = {
         instance.uuid: instance
         for instance in instances
     }
     self.assertTrue(utils.instance_uuids_overlap(host_state, ['aa']))
     self.assertFalse(utils.instance_uuids_overlap(host_state, ['zz']))
Example #5
0
    def _stub_migrate_instance_calls(self, method, multi_host, info):
        fake_flavor = flavors.get_default_flavor()
        fake_flavor['rxtx_factor'] = 1.21
        sys_meta = flavors.save_flavor_info({}, fake_flavor)
        fake_instance = objects.Instance(
            uuid=uuid.uuid4().hex,
            project_id='fake_project_id',
            instance_type_id=fake_flavor['id'],
            system_metadata=sys_meta)
        fake_migration = {'source_compute': 'fake_compute_source',
                          'dest_compute': 'fake_compute_dest'}

        def fake_mig_inst_method(*args, **kwargs):
            info['kwargs'] = kwargs

        def fake_get_multi_addresses(*args, **kwargs):
            return multi_host, ['fake_float1', 'fake_float2']

        self.stubs.Set(network_rpcapi.NetworkAPI, method,
                fake_mig_inst_method)
        self.stubs.Set(self.network_api, '_get_multi_addresses',
                fake_get_multi_addresses)

        expected = {'instance_uuid': fake_instance.uuid,
                    'source_compute': 'fake_compute_source',
                    'dest_compute': 'fake_compute_dest',
                    'rxtx_factor': 1.21,
                    'project_id': 'fake_project_id',
                    'floating_addresses': None}
        if multi_host:
            expected['floating_addresses'] = ['fake_float1', 'fake_float2']
        return fake_instance, fake_migration, expected
Example #6
0
def get_test_instance(context=None, flavor=None, obj=False):
    if not context:
        context = get_test_admin_context()

    if not flavor:
        flavor = get_test_flavor(context)

    test_instance = {
        'memory_kb': '2048000',
        'basepath': '/some/path',
        'bridge_name': 'br100',
        'vcpus': 4,
        'root_gb': 40,
        'bridge': 'br101',
        'image_ref': 'cedef40a-ed67-4d10-800e-17455edce175',
        'instance_type_id': flavor['id'],
        'system_metadata': {},
        'extra_specs': {},
        'user_id': context.user_id,
        'project_id': context.project_id,
    }

    if obj:
        instance = objects.Instance(context, **test_instance)
        with mock.patch.object(instance, 'save'):
            instance.set_flavor(objects.Flavor.get_by_id(
                context, flavor['id']))
        instance.create()
    else:
        flavors.save_flavor_info(test_instance['system_metadata'], flavor, '')
        instance = patron.db.instance_create(context, test_instance)
    return instance
Example #7
0
 def migrate_server(self, context, instance, scheduler_hint, live, rebuild,
         flavor, block_migration, disk_over_commit, reservations=None,
         clean_shutdown=True):
     if instance and not isinstance(instance, patron_object.NovaObject):
         # NOTE(danms): Until v2 of the RPC API, we need to tolerate
         # old-world instance objects here
         attrs = ['metadata', 'system_metadata', 'info_cache',
                  'security_groups']
         instance = objects.Instance._from_db_object(
             context, objects.Instance(), instance,
             expected_attrs=attrs)
     # NOTE(melwitt): Remove this in version 2.0 of the RPC API
     if flavor and not isinstance(flavor, objects.Flavor):
         # Code downstream may expect extra_specs to be populated since it
         # is receiving an object, so lookup the flavor to ensure this.
         flavor = objects.Flavor.get_by_id(context, flavor['id'])
     if live and not rebuild and not flavor:
         self._live_migrate(context, instance, scheduler_hint,
                            block_migration, disk_over_commit)
     elif not live and not rebuild and flavor:
         instance_uuid = instance['uuid']
         with compute_utils.EventReporter(context, 'cold_migrate',
                                          instance_uuid):
             self._cold_migrate(context, instance, flavor,
                                scheduler_hint['filter_properties'],
                                reservations, clean_shutdown)
     else:
         raise NotImplementedError()
Example #8
0
 def _create_fake_instance(self):
     self.inst = objects.Instance()
     self.inst.uuid = 'fake-inst-uuid'
     self.inst.pci_devices = objects.PciDeviceList()
     self.inst.vm_state = vm_states.ACTIVE
     self.inst.task_state = None
     self.inst.numa_topology = None
Example #9
0
def fake_inst_obj(context):
    inst = objects.Instance(
        context=context,
        id=1,
        user_id='fake_user',
        uuid='b65cee2f-8c69-4aeb-be2f-f79742548fc2',
        project_id='test',
        key_name="key",
        key_data="ssh-rsa AAAAB3Nzai....N3NtHw== someuser@somehost",
        host='test',
        launch_index=1,
        reservation_id='r-xxxxxxxx',
        user_data=ENCODE_USER_DATA_STRING,
        image_ref=7,
        vcpus=1,
        fixed_ips=[],
        root_device_name='/dev/sda1',
        hostname='test.patrondomain',
        display_name='my_displayname',
        metadata={},
        default_ephemeral_device=None,
        default_swap_device=None,
        system_metadata={})
    nwinfo = network_model.NetworkInfo([])
    inst.info_cache = objects.InstanceInfoCache(context=context,
                                                instance_uuid=inst.uuid,
                                                network_info=nwinfo)
    with mock.patch.object(inst, 'save'):
        inst.set_flavor(flavors.get_default_flavor())
    return inst
Example #10
0
    def get_by_network(cls, context, network, host=None):
        ipinfo = db.network_get_associated_fixed_ips(context,
                                                     network['id'],
                                                     host=host)
        if not ipinfo:
            return []

        fips = cls(context=context, objects=[])

        for info in ipinfo:
            inst = objects.Instance(context=context,
                                    uuid=info['instance_uuid'],
                                    hostname=info['instance_hostname'],
                                    created_at=info['instance_created'],
                                    updated_at=info['instance_updated'])
            vif = objects.VirtualInterface(context=context,
                                           id=info['vif_id'],
                                           address=info['vif_address'])
            fip = objects.FixedIP(context=context,
                                  address=info['address'],
                                  instance_uuid=info['instance_uuid'],
                                  network_id=info['network_id'],
                                  virtual_interface_id=info['vif_id'],
                                  allocated=info['allocated'],
                                  leased=info['leased'],
                                  default_route=info['default_route'],
                                  instance=inst,
                                  virtual_interface=vif)
            fips.objects.append(fip)
        fips.obj_reset_changes()
        return fips
Example #11
0
    def test_get_disk_mapping_rescue(self):
        # A simple disk mapping setup, but in rescue mode

        instance_ref = objects.Instance(**self.test_instance)
        image_meta = {}

        mapping = blockinfo.get_disk_mapping("kvm",
                                             instance_ref,
                                             "virtio",
                                             "ide",
                                             image_meta,
                                             rescue=True)

        expect = {
            'disk.rescue': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
            'disk': {
                'bus': 'virtio',
                'dev': 'vdb',
                'type': 'disk'
            },
            'root': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
        }
        self.assertEqual(expect, mapping)
Example #12
0
 def test_create_console(self, mock_get_instance_by_uuid,
                         mock_get_console_topic):
     mock_get_instance_by_uuid.return_value = objects.Instance(
         **self.fake_instance)
     self.console_api.create_console(self.context, self.fake_uuid)
     mock_get_console_topic.assert_called_once_with(self.context,
                                                    'fake_host')
Example #13
0
    def test_get_disk_mapping_simple_iso(self):
        # A simple disk mapping setup, but with a ISO for root device

        instance_ref = objects.Instance(**self.test_instance)
        image_meta = {'disk_format': 'iso'}

        mapping = blockinfo.get_disk_mapping("kvm", instance_ref, "virtio",
                                             "ide", image_meta)

        expect = {
            'disk': {
                'bus': 'ide',
                'dev': 'hda',
                'type': 'cdrom',
                'boot_index': '1'
            },
            'disk.local': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk'
            },
            'root': {
                'bus': 'ide',
                'dev': 'hda',
                'type': 'cdrom',
                'boot_index': '1'
            },
        }
        self.assertEqual(expect, mapping)
Example #14
0
    def test_get_disk_mapping_simple_swap(self):
        # A simple disk mapping setup, but with a swap device added

        instance_ref = objects.Instance(**self.test_instance)
        instance_ref.flavor.swap = 5
        image_meta = {}

        mapping = blockinfo.get_disk_mapping("kvm", instance_ref, "virtio",
                                             "ide", image_meta)

        expect = {
            'disk': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
            'disk.local': {
                'bus': 'virtio',
                'dev': 'vdb',
                'type': 'disk'
            },
            'disk.swap': {
                'bus': 'virtio',
                'dev': 'vdc',
                'type': 'disk'
            },
            'root': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
        }
        self.assertEqual(expect, mapping)
Example #15
0
    def test_get_disk_mapping_simple(self):
        # The simplest possible disk mapping setup, all defaults

        instance_ref = objects.Instance(**self.test_instance)
        image_meta = {}

        mapping = blockinfo.get_disk_mapping("kvm", instance_ref, "virtio",
                                             "ide", image_meta)

        expect = {
            'disk': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
            'disk.local': {
                'bus': 'virtio',
                'dev': 'vdb',
                'type': 'disk'
            },
            'root': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            }
        }
        self.assertEqual(expect, mapping)
Example #16
0
    def test_get_disk_mapping_simple_rootdev(self):
        # A simple disk mapping setup, but with custom root device name

        instance_ref = objects.Instance(**self.test_instance)
        image_meta = {}
        block_device_info = {'root_device_name': '/dev/sda'}

        mapping = blockinfo.get_disk_mapping("kvm", instance_ref, "virtio",
                                             "ide", image_meta,
                                             block_device_info)

        expect = {
            'disk': {
                'bus': 'scsi',
                'dev': 'sda',
                'type': 'disk',
                'boot_index': '1'
            },
            'disk.local': {
                'bus': 'virtio',
                'dev': 'vda',
                'type': 'disk'
            },
            'root': {
                'bus': 'scsi',
                'dev': 'sda',
                'type': 'disk',
                'boot_index': '1'
            }
        }
        self.assertEqual(expect, mapping)
Example #17
0
 def setUp(self):
     super(PciDeviceTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
     self.inst = objects.Instance()
     self.inst.uuid = 'fake-inst-uuid'
     self.inst.pci_devices = objects.PciDeviceList()
     self.devobj = objects.PciDevice._from_db_object(
         self.ctxt, objects.PciDevice(), dev_dict)
Example #18
0
 def setUp(self):
     super(TestUpdateInstanceCache, self).setUp()
     self.context = context.get_admin_context()
     self.instance = objects.Instance(uuid=FAKE_UUID)
     vifs = [network_model.VIF(id='super_vif')]
     self.nw_info = network_model.NetworkInfo(vifs)
     self.nw_json = fields.NetworkModel.to_primitive(self, 'network_info',
                                                     self.nw_info)
Example #19
0
 def _get_instance(self):
     updates = self._get_instance_data()
     expected_attrs = updates.pop('expected_attrs', None)
     return objects.Instance._from_db_object(
         context,
         objects.Instance(),
         fake_instance.fake_db_instance(**updates),
         expected_attrs=expected_attrs)
Example #20
0
def fake_vpn_instance():
    return objects.Instance(
        id=7,
        image_ref=CONF.vpn_image_id,
        vm_state='active',
        created_at=timeutils.parse_strtime('1981-10-20T00:00:00.000000'),
        uuid=uuid,
        project_id=project_id)
Example #21
0
    def test_get_disk_mapping_blockdev_many(self):
        # A disk mapping with a blockdev replacing all devices
        instance_ref = objects.Instance(**self.test_instance)
        image_meta = {}

        block_device_info = {
            'block_device_mapping': [
                {
                    'connection_info': "fake",
                    'mount_device': "/dev/vda",
                    'boot_index': 0,
                    'disk_bus': 'scsi',
                    'delete_on_termination': True
                },
                {
                    'connection_info': "fake",
                    'mount_device': "/dev/vdb",
                    'boot_index': -1,
                    'delete_on_termination': True
                },
                {
                    'connection_info': "fake",
                    'mount_device': "/dev/vdc",
                    'boot_index': -1,
                    'device_type': 'cdrom',
                    'delete_on_termination': True
                },
            ]
        }
        mapping = blockinfo.get_disk_mapping("kvm", instance_ref, "virtio",
                                             "ide", image_meta,
                                             block_device_info)

        expect = {
            '/dev/vda': {
                'bus': 'scsi',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
            '/dev/vdb': {
                'bus': 'virtio',
                'dev': 'vdb',
                'type': 'disk'
            },
            '/dev/vdc': {
                'bus': 'virtio',
                'dev': 'vdc',
                'type': 'cdrom'
            },
            'root': {
                'bus': 'scsi',
                'dev': 'vda',
                'type': 'disk',
                'boot_index': '1'
            },
        }
        self.assertEqual(expect, mapping)
Example #22
0
    def test_fetch_image(self):
        """Test fetching images."""

        dc_name = 'fake-dc'
        file_path = 'fake_file'
        ds_name = 'ds1'
        host = mock.MagicMock()
        port = 7443
        context = mock.MagicMock()

        image_data = {
            'id': patron.tests.unit.image.fake.get_valid_image_id(),
            'disk_format': 'vmdk',
            'size': 512,
        }
        read_file_handle = mock.MagicMock()
        write_file_handle = mock.MagicMock()
        read_iter = mock.MagicMock()
        instance = objects.Instance(id=1,
                                    uuid='fake-uuid',
                                    image_ref=image_data['id'])

        def fake_read_handle(read_iter):
            return read_file_handle

        def fake_write_handle(host, port, dc_name, ds_name, cookies, file_path,
                              file_size):
            return write_file_handle

        with contextlib.nested(
                mock.patch.object(rw_handles,
                                  'ImageReadHandle',
                                  side_effect=fake_read_handle),
                mock.patch.object(rw_handles,
                                  'FileWriteHandle',
                                  side_effect=fake_write_handle),
                mock.patch.object(images, 'start_transfer'),
                mock.patch.object(images.IMAGE_API,
                                  'get',
                                  return_value=image_data),
                mock.patch.object(images.IMAGE_API,
                                  'download',
                                  return_value=read_iter),
        ) as (glance_read, http_write, start_transfer, image_show,
              image_download):
            images.fetch_image(context, instance, host, port, dc_name, ds_name,
                               file_path)

        glance_read.assert_called_once_with(read_iter)
        http_write.assert_called_once_with(host, port, dc_name, ds_name, None,
                                           file_path, image_data['size'])
        start_transfer.assert_called_once_with(
            context,
            read_file_handle,
            image_data['size'],
            write_file_handle=write_file_handle)
        image_download.assert_called_once_with(context, instance['image_ref'])
        image_show.assert_called_once_with(context, instance['image_ref'])
Example #23
0
 def test_affinity_different_filter_handles_none(self):
     inst1 = objects.Instance(uuid='same')
     host = fakes.FakeHostState('host1', 'node1', {})
     host.instances = {inst1.uuid: inst1}
     filter_properties = {
         'context': mock.sentinel.ctx,
         'scheduler_hints': None
     }
     self.assertTrue(self.filt_cls.host_passes(host, filter_properties))
Example #24
0
 def test_get_instance_disk_info_is_implemented(self):
     instance = objects.Instance()
     # Ensure that the method has been implemented in the driver
     try:
         disk_info = self._conn.get_instance_disk_info(instance)
         self.assertIsNone(disk_info)
     except NotImplementedError:
         self.fail("test_get_instance_disk_info() should not raise "
                   "NotImplementedError")
Example #25
0
def compute_api_get(self,
                    context,
                    instance_id,
                    expected_attrs=None,
                    want_objects=False):
    return objects.Instance(uuid=FAKE_UUID,
                            id=instance_id,
                            instance_type_id=1,
                            host='bob')
Example #26
0
def fake_instance_get(context, instance_id):
    return objects.Instance(
        **{
            "id": 1,
            "uuid": uuid.uuid4(),
            "name": 'fake',
            "user_id": 'fakeuser',
            "project_id": '123'
        })
Example #27
0
 def test_is_multi_host_instance_has_no_fixed_ip(self):
     def fake_fixed_ip_get_by_instance(ctxt, uuid):
         raise exception.FixedIpNotFoundForInstance(instance_uuid=uuid)
     self.stubs.Set(self.network_api.db, 'fixed_ip_get_by_instance',
                    fake_fixed_ip_get_by_instance)
     instance = objects.Instance(uuid=FAKE_UUID)
     result, floats = self.network_api._get_multi_addresses(self.context,
                                                            instance)
     self.assertFalse(result)
Example #28
0
 def instance_delete_everywhere(self, ctxt, instance, delete_type):
     """This is used by API cell when it didn't know what cell
     an instance was in, but the instance was requested to be
     deleted or soft_deleted.  So, we'll broadcast this everywhere.
     """
     if isinstance(instance, dict):
         instance = objects.Instance._from_db_object(
             ctxt, objects.Instance(), instance)
     self.msg_runner.instance_delete_everywhere(ctxt, instance, delete_type)
Example #29
0
    def test_get_domain(self, fake_get_domain):
        dom = fakelibvirt.virDomain(self.host.get_connection(),
                                    "<domain id='7'/>")

        fake_get_domain.return_value = dom
        instance = objects.Instance(id="124")

        self.assertEqual(dom, self.host.get_domain(instance))

        fake_get_domain.assert_called_once_with("instance-0000007c")
Example #30
0
 def test_do_refresh_security_group_rules_instance_gone(self):
     instance1 = objects.Instance(None, id=1, uuid='fake-uuid1')
     instance2 = objects.Instance(None, id=2, uuid='fake-uuid2')
     self.fw.instance_info = {1: (instance1, 'netinfo1'),
                              2: (instance2, 'netinfo2')}
     mock_filter = mock.MagicMock()
     with mock.patch.dict(self.fw.iptables.ipv4, {'filter': mock_filter}):
         mock_filter.has_chain.return_value = False
         with mock.patch.object(self.fw, 'instance_rules') as mock_ir:
             mock_ir.return_value = (None, None)
             self.fw.do_refresh_security_group_rules('secgroup')
             self.assertEqual(2, mock_ir.call_count)
         # NOTE(danms): Make sure that it is checking has_chain each time,
         # continuing to process all the instances, and never adding the
         # new chains back if has_chain() is False
         mock_filter.has_chain.assert_has_calls([mock.call('inst-1'),
                                                 mock.call('inst-2')],
                                                any_order=True)
         self.assertEqual(0, mock_filter.add_chain.call_count)