def test_notify_about_instance_usage(self): instance = create_instance(self.context) # Set some system metadata sys_metadata = {"image_md_key1": "val1", "image_md_key2": "val2", "other_data": "meow"} instance.system_metadata.update(sys_metadata) instance.save() extra_usage_info = {"image_name": "fake_name"} compute_utils.notify_about_instance_usage( rpc.get_notifier("compute"), self.context, instance, "create.start", extra_usage_info=extra_usage_info ) self.assertEqual(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEqual(msg.priority, "INFO") self.assertEqual(msg.event_type, "compute.instance.create.start") payload = msg.payload self.assertEqual(payload["tenant_id"], self.project_id) self.assertEqual(payload["user_id"], self.user_id) self.assertEqual(payload["instance_id"], instance["uuid"]) self.assertEqual(payload["instance_type"], "m1.tiny") type_id = flavors.get_flavor_by_name("m1.tiny")["id"] self.assertEqual(str(payload["instance_type_id"]), str(type_id)) flavor_id = flavors.get_flavor_by_name("m1.tiny")["flavorid"] self.assertEqual(str(payload["instance_flavor_id"]), str(flavor_id)) for attr in ("display_name", "created_at", "launched_at", "state", "state_description", "image_meta"): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(payload["image_meta"], {"md_key1": "val1", "md_key2": "val2"}) self.assertEqual(payload["image_name"], "fake_name") image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEqual(payload["image_ref_url"], image_ref_url) self.compute.terminate_instance(self.context, instance, [], [])
def test_notify_usage_exists_deleted_instance(self): # Ensure 'exists' notification generates appropriate usage data. instance = create_instance(self.context) # Set some system metadata sys_metadata = {'image_md_key1': 'val1', 'image_md_key2': 'val2', 'other_data': 'meow'} instance.system_metadata.update(sys_metadata) instance.save() self.compute.terminate_instance(self.context, instance, [], []) compute_utils.notify_usage_exists( rpc.get_notifier('compute'), self.context, instance) msg = fake_notifier.NOTIFICATIONS[-1] self.assertEqual(msg.priority, 'INFO') self.assertEqual(msg.event_type, 'compute.instance.exists') payload = msg.payload self.assertEqual(payload['tenant_id'], self.project_id) self.assertEqual(payload['user_id'], self.user_id) self.assertEqual(payload['instance_id'], instance['uuid']) self.assertEqual(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEqual(str(payload['instance_type_id']), str(type_id)) flavor_id = flavors.get_flavor_by_name('m1.tiny')['flavorid'] self.assertEqual(str(payload['instance_flavor_id']), str(flavor_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'bandwidth', 'audit_period_beginning', 'audit_period_ending', 'image_meta'): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(payload['image_meta'], {'md_key1': 'val1', 'md_key2': 'val2'}) image_ref_url = "%s/images/%s" % (glance.generate_glance_url(), uuids.fake_image_ref) self.assertEqual(payload['image_ref_url'], image_ref_url)
def test_notify_usage_exists_instance_not_found(self): # Ensure 'exists' notification generates appropriate usage data. instance = create_instance(self.context) self.compute.terminate_instance(self.context, instance, [], []) compute_utils.notify_usage_exists(rpc.get_notifier("compute"), self.context, instance) msg = fake_notifier.NOTIFICATIONS[-1] self.assertEqual(msg.priority, "INFO") self.assertEqual(msg.event_type, "compute.instance.exists") payload = msg.payload self.assertEqual(payload["tenant_id"], self.project_id) self.assertEqual(payload["user_id"], self.user_id) self.assertEqual(payload["instance_id"], instance["uuid"]) self.assertEqual(payload["instance_type"], "m1.tiny") type_id = flavors.get_flavor_by_name("m1.tiny")["id"] self.assertEqual(str(payload["instance_type_id"]), str(type_id)) flavor_id = flavors.get_flavor_by_name("m1.tiny")["flavorid"] self.assertEqual(str(payload["instance_flavor_id"]), str(flavor_id)) for attr in ( "display_name", "created_at", "launched_at", "state", "state_description", "bandwidth", "audit_period_beginning", "audit_period_ending", "image_meta", ): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(payload["image_meta"], {}) image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEqual(payload["image_ref_url"], image_ref_url)
def test_notify_about_instance_usage(self): instance = create_instance(self.context) # Set some system metadata sys_metadata = {'image_md_key1': 'val1', 'image_md_key2': 'val2', 'other_data': 'meow'} instance.system_metadata.update(sys_metadata) instance.save() extra_usage_info = {'image_name': 'fake_name'} compute_utils.notify_about_instance_usage( rpc.get_notifier('compute'), self.context, instance, 'create.start', extra_usage_info=extra_usage_info) self.assertEqual(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEqual(msg.priority, 'INFO') self.assertEqual(msg.event_type, 'compute.instance.create.start') payload = msg.payload self.assertEqual(payload['tenant_id'], self.project_id) self.assertEqual(payload['user_id'], self.user_id) self.assertEqual(payload['instance_id'], instance['uuid']) self.assertEqual(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEqual(str(payload['instance_type_id']), str(type_id)) flavor_id = flavors.get_flavor_by_name('m1.tiny')['flavorid'] self.assertEqual(str(payload['instance_flavor_id']), str(flavor_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'image_meta'): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(payload['image_meta'], {'md_key1': 'val1', 'md_key2': 'val2'}) self.assertEqual(payload['image_name'], 'fake_name') image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEqual(payload['image_ref_url'], image_ref_url) self.compute.terminate_instance(self.context, instance, [], [])
def test_reverse_quota_delta(self, mock_get_flavor): inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name('m1.tiny') inst.new_flavor = flavors.get_flavor_by_name('m1.medium') expected_deltas = { 'cores': -1 * (inst.new_flavor['vcpus'] - inst.old_flavor['vcpus']), 'ram': -1 * (inst.new_flavor['memory_mb'] - inst.old_flavor['memory_mb']) } updates = {'old_instance_type_id': inst.old_flavor['id'], 'new_instance_type_id': inst.new_flavor['id']} fake_migration = test_migration.fake_db_migration(**updates) def _flavor_get_by_id(context, type_id): if type_id == updates['old_instance_type_id']: return inst.old_flavor else: return inst.new_flavor mock_get_flavor.side_effect = _flavor_get_by_id deltas = compute_utils.reverse_upsize_quota_delta(self.context, fake_migration) self.assertEqual(expected_deltas, deltas)
def test_notify_about_instance_usage(self): instance_id = self._create_instance() instance = db.instance_get(self.context, instance_id) # Set some system metadata sys_metadata = {"image_md_key1": "val1", "image_md_key2": "val2", "other_data": "meow"} extra_usage_info = {"image_name": "fake_name"} db.instance_system_metadata_update(self.context, instance["uuid"], sys_metadata, False) # NOTE(russellb) Make sure our instance has the latest system_metadata # in it. instance = db.instance_get(self.context, instance_id) compute_utils.notify_about_instance_usage( notify.get_notifier("compute"), self.context, instance, "create.start", extra_usage_info=extra_usage_info ) self.assertEquals(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEquals(msg.priority, "INFO") self.assertEquals(msg.event_type, "compute.instance.create.start") payload = msg.payload self.assertEquals(payload["tenant_id"], self.project_id) self.assertEquals(payload["user_id"], self.user_id) self.assertEquals(payload["instance_id"], instance["uuid"]) self.assertEquals(payload["instance_type"], "m1.tiny") type_id = flavors.get_flavor_by_name("m1.tiny")["id"] self.assertEquals(str(payload["instance_type_id"]), str(type_id)) flavor_id = flavors.get_flavor_by_name("m1.tiny")["flavorid"] self.assertEquals(str(payload["instance_flavor_id"]), str(flavor_id)) for attr in ("display_name", "created_at", "launched_at", "state", "state_description", "image_meta"): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEquals(payload["image_meta"], {"md_key1": "val1", "md_key2": "val2"}) self.assertEquals(payload["image_name"], "fake_name") image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEquals(payload["image_ref_url"], image_ref_url) self.compute.terminate_instance(self.context, jsonutils.to_primitive(instance))
def test_notify_usage_exists_instance_not_found(self): # Ensure 'exists' notification generates appropriate usage data. instance_id = self._create_instance() instance = instance_obj.Instance.get_by_id(self.context, instance_id, expected_attrs=['metadata', 'system_metadata', 'info_cache']) self.compute.terminate_instance(self.context, instance, [], []) compute_utils.notify_usage_exists( rpc.get_notifier('compute'), self.context, instance) msg = fake_notifier.NOTIFICATIONS[-1] self.assertEqual(msg.priority, 'INFO') self.assertEqual(msg.event_type, 'compute.instance.exists') payload = msg.payload self.assertEqual(payload['tenant_id'], self.project_id) self.assertEqual(payload['user_id'], self.user_id) self.assertEqual(payload['instance_id'], instance['uuid']) self.assertEqual(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEqual(str(payload['instance_type_id']), str(type_id)) flavor_id = flavors.get_flavor_by_name('m1.tiny')['flavorid'] self.assertEqual(str(payload['instance_flavor_id']), str(flavor_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'bandwidth', 'audit_period_beginning', 'audit_period_ending', 'image_meta'): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEqual(payload['image_meta'], {}) image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEqual(payload['image_ref_url'], image_ref_url)
def test_upsize_quota_delta(self): old_flavor = flavors.get_flavor_by_name("m1.tiny") new_flavor = flavors.get_flavor_by_name("m1.medium") expected_deltas = { "cores": new_flavor["vcpus"] - old_flavor["vcpus"], "ram": new_flavor["memory_mb"] - old_flavor["memory_mb"], } deltas = compute_utils.upsize_quota_delta(self.context, new_flavor, old_flavor) self.assertEqual(expected_deltas, deltas)
def test_downsize_quota_delta(self): inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name("m1.medium") inst.new_flavor = flavors.get_flavor_by_name("m1.tiny") expected_deltas = { "cores": (inst.new_flavor["vcpus"] - inst.old_flavor["vcpus"]), "ram": (inst.new_flavor["memory_mb"] - inst.old_flavor["memory_mb"]), } deltas = compute_utils.downsize_quota_delta(self.context, inst) self.assertEqual(expected_deltas, deltas)
def test_reserve_quota_delta(self, mock_ids_from_instance, mock_reserve): quotas = objects.Quotas(context=context) inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name("m1.tiny") inst.new_flavor = flavors.get_flavor_by_name("m1.medium") mock_ids_from_instance.return_value = (inst.project_id, inst.user_id) mock_reserve.return_value = quotas deltas = compute_utils.upsize_quota_delta(self.context, inst.new_flavor, inst.old_flavor) compute_utils.reserve_quota_delta(self.context, deltas, inst) mock_reserve.assert_called_once_with(project_id=inst.project_id, user_id=inst.user_id, **deltas)
def test_upsize_quota_delta(self): old_flavor = flavors.get_flavor_by_name('m1.tiny') new_flavor = flavors.get_flavor_by_name('m1.medium') expected_deltas = { 'cores': new_flavor['vcpus'] - old_flavor['vcpus'], 'ram': new_flavor['memory_mb'] - old_flavor['memory_mb'] } deltas = compute_utils.upsize_quota_delta(self.context, new_flavor, old_flavor) self.assertEqual(expected_deltas, deltas)
def test_downsize_quota_delta(self): inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name('m1.medium') inst.new_flavor = flavors.get_flavor_by_name('m1.tiny') expected_deltas = { 'cores': (inst.new_flavor['vcpus'] - inst.old_flavor['vcpus']), 'ram': (inst.new_flavor['memory_mb'] - inst.old_flavor['memory_mb']) } deltas = compute_utils.downsize_quota_delta(self.context, inst) self.assertEqual(expected_deltas, deltas)
def test_reverse_quota_delta(self): inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name('m1.tiny') inst.new_flavor = flavors.get_flavor_by_name('m1.medium') expected_deltas = { 'cores': -1 * (inst.new_flavor['vcpus'] - inst.old_flavor['vcpus']), 'ram': -1 * (inst.new_flavor['memory_mb'] - inst.old_flavor['memory_mb']) } deltas = compute_utils.reverse_upsize_quota_delta(self.context, inst) self.assertEqual(expected_deltas, deltas)
def create_instance(context, user_id="fake", project_id="fake", params=None): """Create a test instance.""" flavor = flavors.get_flavor_by_name("m1.tiny") net_info = model.NetworkInfo([]) info_cache = objects.InstanceInfoCache(network_info=net_info) inst = objects.Instance( context=context, image_ref=1, reservation_id="r-fakeres", user_id=user_id, project_id=project_id, instance_type_id=flavor.id, flavor=flavor, old_flavor=None, new_flavor=None, system_metadata={}, ami_launch_index=0, root_gb=0, ephemeral_gb=0, info_cache=info_cache, ) if params: inst.update(params) inst.create() return inst
def test_reserve_quota_delta(self, mock_ids_from_instance, mock_reserve): quotas = objects.Quotas(context=context) inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name('m1.tiny') inst.new_flavor = flavors.get_flavor_by_name('m1.medium') mock_ids_from_instance.return_value = (inst.project_id, inst.user_id) mock_reserve.return_value = quotas deltas = compute_utils.upsize_quota_delta(self.context, inst.new_flavor, inst.old_flavor) compute_utils.reserve_quota_delta(self.context, deltas, inst) mock_reserve.assert_called_once_with(project_id=inst.project_id, user_id=inst.user_id, **deltas)
def test_notify_usage_exists_deleted_instance(self): # Ensure 'exists' notification generates appropriate usage data. instance_id = self._create_instance() instance = db.instance_get(self.context, instance_id) # Set some system metadata sys_metadata = {'image_md_key1': 'val1', 'image_md_key2': 'val2', 'other_data': 'meow'} db.instance_system_metadata_update(self.context, instance['uuid'], sys_metadata, False) self.compute.terminate_instance(self.context, instance) instance = db.instance_get(self.context.elevated(read_deleted='yes'), instance_id) compute_utils.notify_usage_exists(self.context, instance) msg = test_notifier.NOTIFICATIONS[-1] self.assertEquals(msg['priority'], 'INFO') self.assertEquals(msg['event_type'], 'compute.instance.exists') payload = msg['payload'] self.assertEquals(payload['tenant_id'], self.project_id) self.assertEquals(payload['user_id'], self.user_id) self.assertEquals(payload['instance_id'], instance['uuid']) self.assertEquals(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEquals(str(payload['instance_type_id']), str(type_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'bandwidth', 'audit_period_beginning', 'audit_period_ending', 'image_meta'): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEquals(payload['image_meta'], {'md_key1': 'val1', 'md_key2': 'val2'}) image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEquals(payload['image_ref_url'], image_ref_url)
def test_flavor_get_by_None_name_returns_default(self): # Ensure get by name returns default flavor with no name. default = flavors.get_default_flavor() actual = flavors.get_flavor_by_name(None) self.assertIsInstance(default, objects.Flavor) self.assertIsInstance(actual, objects.Flavor) self.assertEqual(default.flavorid, actual.flavorid)
def test_notify_about_instance_action(self): instance = create_instance(self.context) compute_utils.notify_about_instance_action( self.context, instance, host='fake-compute', action='delete', phase='start') self.assertEqual(len(fake_notifier.VERSIONED_NOTIFICATIONS), 1) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual(notification['priority'], 'INFO') self.assertEqual(notification['event_type'], 'instance.delete.start') self.assertEqual(notification['publisher_id'], 'nova-compute:fake-compute') payload = notification['payload']['nova_object.data'] self.assertEqual(payload['tenant_id'], self.project_id) self.assertEqual(payload['user_id'], self.user_id) self.assertEqual(payload['uuid'], instance['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(str(flavor['flavorid']), flavorid) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state', 'display_description', 'locked'): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(payload['image_uuid'], uuids.fake_image_ref)
def test_notify_about_instance_create(self): instance = create_instance(self.context) compute_utils.notify_about_instance_create(self.context, instance, host='fake-compute', phase='start') self.assertEqual(1, len(fake_notifier.VERSIONED_NOTIFICATIONS)) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual('INFO', notification['priority']) self.assertEqual('instance.create.start', notification['event_type']) self.assertEqual('nova-compute:fake-compute', notification['publisher_id']) payload = notification['payload']['nova_object.data'] self.assertEqual('fake', payload['tenant_id']) self.assertEqual('fake', payload['user_id']) self.assertEqual(instance['uuid'], payload['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(flavorid, str(flavor['flavorid'])) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state', 'display_description', 'locked', 'auto_disk_config'): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(uuids.fake_image_ref, payload['image_uuid'])
def test_notify_about_instance_usage(self): instance_id = self._create_instance() instance = db.instance_get(self.context, instance_id) # Set some system metadata sys_metadata = { 'image_md_key1': 'val1', 'image_md_key2': 'val2', 'other_data': 'meow' } extra_usage_info = {'image_name': 'fake_name'} db.instance_system_metadata_update(self.context, instance['uuid'], sys_metadata, False) # NOTE(russellb) Make sure our instance has the latest system_metadata # in it. instance = db.instance_get(self.context, instance_id) compute_utils.notify_about_instance_usage( notify.get_notifier('compute'), self.context, instance, 'create.start', extra_usage_info=extra_usage_info) self.assertEquals(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEquals(msg.priority, 'INFO') self.assertEquals(msg.event_type, 'compute.instance.create.start') payload = msg.payload self.assertEquals(payload['tenant_id'], self.project_id) self.assertEquals(payload['user_id'], self.user_id) self.assertEquals(payload['instance_id'], instance['uuid']) self.assertEquals(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEquals(str(payload['instance_type_id']), str(type_id)) flavor_id = flavors.get_flavor_by_name('m1.tiny')['flavorid'] self.assertEquals(str(payload['instance_flavor_id']), str(flavor_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'image_meta'): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEquals(payload['image_meta'], { 'md_key1': 'val1', 'md_key2': 'val2' }) self.assertEquals(payload['image_name'], 'fake_name') image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEquals(payload['image_ref_url'], image_ref_url) self.compute.terminate_instance(self.context, jsonutils.to_primitive(instance))
def _test_get_resources(self): old_flavor = flavors.get_flavor_by_name('m1.tiny') new_flavor = flavors.get_flavor_by_name('m1.medium') params = {'flavor': new_flavor, 'old_flavor': old_flavor, 'new_flavor': new_flavor, 'vcpus': new_flavor['vcpus'], 'memory_mb': new_flavor['memory_mb']} instance = create_instance(self.context, params=params) updates = {'old_instance_type_id': old_flavor['id'], 'new_instance_type_id': new_flavor['id']} fake_migration = test_migration.fake_db_migration(**updates) migration = objects.Migration._from_db_object(self.context, objects.Migration(), fake_migration) return old_flavor, migration, instance
def test_notify_usage_exists_deleted_instance(self): # Ensure 'exists' notification generates appropriate usage data. instance_id = self._create_instance() instance = instance_obj.Instance.get_by_id( self.context, instance_id, expected_attrs=["metadata", "system_metadata", "info_cache"] ) # Set some system metadata sys_metadata = {"image_md_key1": "val1", "image_md_key2": "val2", "other_data": "meow"} instance.system_metadata.update(sys_metadata) instance.save() self.compute.terminate_instance(self.context, instance, [], []) instance = instance_obj.Instance.get_by_id( self.context.elevated(read_deleted="yes"), instance_id, expected_attrs=["system_metadata"] ) compute_utils.notify_usage_exists(rpc.get_notifier("compute"), self.context, instance) msg = fake_notifier.NOTIFICATIONS[-1] self.assertEqual(msg.priority, "INFO") self.assertEqual(msg.event_type, "compute.instance.exists") payload = msg.payload self.assertEqual(payload["tenant_id"], self.project_id) self.assertEqual(payload["user_id"], self.user_id) self.assertEqual(payload["instance_id"], instance["uuid"]) self.assertEqual(payload["instance_type"], "m1.tiny") type_id = flavors.get_flavor_by_name("m1.tiny")["id"] self.assertEqual(str(payload["instance_type_id"]), str(type_id)) flavor_id = flavors.get_flavor_by_name("m1.tiny")["flavorid"] self.assertEqual(str(payload["instance_flavor_id"]), str(flavor_id)) for attr in ( "display_name", "created_at", "launched_at", "state", "state_description", "bandwidth", "audit_period_beginning", "audit_period_ending", "image_meta", ): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEqual(payload["image_meta"], {"md_key1": "val1", "md_key2": "val2"}) image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEqual(payload["image_ref_url"], image_ref_url)
def create_instance(context, instance=None, driver=None): """Create a test instance""" if instance == None: instance = {} system_metadata = instance.get('system_metadata', {}) instance_type = flavors.get_flavor_by_name('m1.tiny') system_metadata.update(flavors.save_flavor_info(dict(), instance_type)) instance.setdefault('user_id', context.user_id) instance.setdefault('project_id', context.project_id) instance.setdefault('instance_type_id', instance_type['id']) instance.setdefault('system_metadata', system_metadata) instance.setdefault('image_id', 1) instance.setdefault('image_ref', 1) instance.setdefault('reservation_id', 'r-fakeres') instance.setdefault('launch_time', '10') instance.setdefault('mac_address', "ca:ca:ca:01") instance.setdefault('ami_launch_index', 0) instance.setdefault('vm_state', vm_states.ACTIVE) instance.setdefault('root_gb', 10) instance.setdefault('ephemeral_gb', 10) instance.setdefault('memory_mb', 512) instance.setdefault('vcpus', 1) instance.setdefault('info_cache', {'network_info': json.dumps({})}) # We should record in the quotas information about this instance. reservations = quota.QUOTAS.reserve(context, instances=1, ram=instance['memory_mb'], cores=instance['vcpus']) context.elevated() instance_ref = db.instance_create(context, instance) db.block_device_mapping_create(context, { 'source_type': 'image', 'destination_type': 'local', 'device_type': 'disk', 'image_id': 1, 'boot_index': 0, 'instance_uuid': instance_ref['uuid'] }, legacy=False) if driver: # Add this instance to the driver driver.instances[instance_ref.name] = FakeInstance( instance_ref.name, instance_ref.get('power_state', power_state.RUNNING)) quota.QUOTAS.commit(context, reservations) return instance_ref['uuid']
def test_notify_about_instance_usage(self): instance_id = self._create_instance() instance = db.instance_get(self.context, instance_id) # Set some system metadata sys_metadata = {'image_md_key1': 'val1', 'image_md_key2': 'val2', 'other_data': 'meow'} extra_usage_info = {'image_name': 'fake_name'} db.instance_system_metadata_update(self.context, instance['uuid'], sys_metadata, False) # NOTE(russellb) Make sure our instance has the latest system_metadata # in it. instance = db.instance_get(self.context, instance_id) compute_utils.notify_about_instance_usage( notify.get_notifier('compute'), self.context, instance, 'create.start', extra_usage_info=extra_usage_info) self.assertEquals(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEquals(msg.priority, 'INFO') self.assertEquals(msg.event_type, 'compute.instance.create.start') payload = msg.payload self.assertEquals(payload['tenant_id'], self.project_id) self.assertEquals(payload['user_id'], self.user_id) self.assertEquals(payload['instance_id'], instance['uuid']) self.assertEquals(payload['instance_type'], 'm1.tiny') type_id = flavors.get_flavor_by_name('m1.tiny')['id'] self.assertEquals(str(payload['instance_type_id']), str(type_id)) flavor_id = flavors.get_flavor_by_name('m1.tiny')['flavorid'] self.assertEquals(str(payload['instance_flavor_id']), str(flavor_id)) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'state_description', 'image_meta'): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEquals(payload['image_meta'], {'md_key1': 'val1', 'md_key2': 'val2'}) self.assertEquals(payload['image_name'], 'fake_name') image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEquals(payload['image_ref_url'], image_ref_url) self.compute.terminate_instance(self.context, jsonutils.to_primitive(instance))
def create_instance(context, instance=None, driver=None): """Create a test instance""" if instance == None: instance = {} system_metadata = instance.get('system_metadata', {}) instance_type = flavors.get_flavor_by_name('m1.tiny') system_metadata.update(flavors.save_flavor_info(dict(), instance_type)) instance.setdefault('user_id', context.user_id) instance.setdefault('project_id', context.project_id) instance.setdefault('instance_type_id', instance_type['id']) instance.setdefault('system_metadata', system_metadata) instance.setdefault('image_id', 1) instance.setdefault('image_ref', 1) instance.setdefault('reservation_id', 'r-fakeres') instance.setdefault('launch_time', '10') instance.setdefault('mac_address', "ca:ca:ca:01") instance.setdefault('ami_launch_index', 0) instance.setdefault('vm_state', vm_states.ACTIVE) instance.setdefault('root_gb', 10) instance.setdefault('ephemeral_gb', 10) instance.setdefault('memory_mb', 512) instance.setdefault('vcpus', 1) instance.setdefault('info_cache', {'network_info':json.dumps({})}) # We should record in the quotas information about this instance. reservations = quota.QUOTAS.reserve(context, instances=1, ram=instance['memory_mb'], cores=instance['vcpus']) context.elevated() instance_ref = db.instance_create(context, instance) db.block_device_mapping_create(context, {'source_type': 'image', 'destination_type': 'local', 'device_type': 'disk', 'image_id': 1, 'boot_index': 0, 'instance_uuid': instance_ref['uuid']}, legacy=False) if driver: # Add this instance to the driver driver.instances[instance_ref.name] = FakeInstance(instance_ref.name, instance_ref.get('power_state', power_state.RUNNING)) quota.QUOTAS.commit(context, reservations) return instance_ref['uuid']
def test_reverse_quota_delta(self, mock_get_flavor): inst = create_instance(self.context, params=None) inst.old_flavor = flavors.get_flavor_by_name("m1.tiny") inst.new_flavor = flavors.get_flavor_by_name("m1.medium") expected_deltas = { "cores": -1 * (inst.new_flavor["vcpus"] - inst.old_flavor["vcpus"]), "ram": -1 * (inst.new_flavor["memory_mb"] - inst.old_flavor["memory_mb"]), } updates = {"old_instance_type_id": inst.old_flavor["id"], "new_instance_type_id": inst.new_flavor["id"]} fake_migration = test_migration.fake_db_migration(**updates) def _flavor_get_by_id(context, type_id): if type_id == updates["old_instance_type_id"]: return inst.old_flavor else: return inst.new_flavor mock_get_flavor.side_effect = _flavor_get_by_id deltas = compute_utils.reverse_upsize_quota_delta(self.context, fake_migration) self.assertEqual(expected_deltas, deltas)
def test_notify_about_volume_swap_with_error(self): instance = create_instance(self.context) try: # To get exception trace, raise and catch an exception raise test.TestingException('Volume swap error.') except Exception as ex: compute_utils.notify_about_volume_swap( self.context, instance, 'fake-compute', fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.ERROR, uuids.old_volume_id, uuids.new_volume_id, ex) self.assertEqual(len(fake_notifier.VERSIONED_NOTIFICATIONS), 1) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual('ERROR', notification['priority']) self.assertEqual( 'instance.%s.%s' % (fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.ERROR), notification['event_type']) self.assertEqual('nova-compute:fake-compute', notification['publisher_id']) payload = notification['payload']['nova_object.data'] self.assertEqual(self.project_id, payload['tenant_id']) self.assertEqual(self.user_id, payload['user_id']) self.assertEqual(instance['uuid'], payload['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(flavorid, str(flavor['flavorid'])) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state'): self.assertIn(attr, payload) self.assertEqual(uuids.fake_image_ref, payload['image_uuid']) self.assertEqual(uuids.old_volume_id, payload['old_volume_id']) self.assertEqual(uuids.new_volume_id, payload['new_volume_id']) # Check ExceptionPayload exception_payload = payload['fault']['nova_object.data'] self.assertEqual('TestingException', exception_payload['exception']) self.assertEqual('Volume swap error.', exception_payload['exception_message']) self.assertEqual('test_notify_about_volume_swap_with_error', exception_payload['function_name']) self.assertEqual('nova.tests.unit.compute.test_compute_utils', exception_payload['module_name'])
def test_notify_about_volume_swap_with_error(self): instance = create_instance(self.context) try: # To get exception trace, raise and catch an exception raise test.TestingException('Volume swap error.') except Exception as ex: compute_utils.notify_about_volume_swap( self.context, instance, 'fake-compute', fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.ERROR, uuids.old_volume_id, uuids.new_volume_id, ex) self.assertEqual(len(fake_notifier.VERSIONED_NOTIFICATIONS), 1) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual('ERROR', notification['priority']) self.assertEqual('instance.%s.%s' % (fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.ERROR), notification['event_type']) self.assertEqual('nova-compute:fake-compute', notification['publisher_id']) payload = notification['payload']['nova_object.data'] self.assertEqual(self.project_id, payload['tenant_id']) self.assertEqual(self.user_id, payload['user_id']) self.assertEqual(instance['uuid'], payload['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(flavorid, str(flavor['flavorid'])) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state'): self.assertIn(attr, payload) self.assertEqual(uuids.fake_image_ref, payload['image_uuid']) self.assertEqual(uuids.old_volume_id, payload['old_volume_id']) self.assertEqual(uuids.new_volume_id, payload['new_volume_id']) # Check ExceptionPayload exception_payload = payload['fault']['nova_object.data'] self.assertEqual('TestingException', exception_payload['exception']) self.assertEqual('Volume swap error.', exception_payload['exception_message']) self.assertEqual('test_notify_about_volume_swap_with_error', exception_payload['function_name']) self.assertEqual('nova.tests.unit.compute.test_compute_utils', exception_payload['module_name'])
def test_notify_usage_exists(self): # Ensure 'exists' notification generates appropriate usage data. instance_id = self._create_instance() instance = db.instance_get(self.context, instance_id) # Set some system metadata sys_metadata = {"image_md_key1": "val1", "image_md_key2": "val2", "other_data": "meow"} db.instance_system_metadata_update(self.context, instance["uuid"], sys_metadata, False) instance = db.instance_get(self.context, instance_id) compute_utils.notify_usage_exists(notify.get_notifier("compute"), self.context, instance) self.assertEquals(len(fake_notifier.NOTIFICATIONS), 1) msg = fake_notifier.NOTIFICATIONS[0] self.assertEquals(msg.priority, "INFO") self.assertEquals(msg.event_type, "compute.instance.exists") payload = msg.payload self.assertEquals(payload["tenant_id"], self.project_id) self.assertEquals(payload["user_id"], self.user_id) self.assertEquals(payload["instance_id"], instance["uuid"]) self.assertEquals(payload["instance_type"], "m1.tiny") type_id = flavors.get_flavor_by_name("m1.tiny")["id"] self.assertEquals(str(payload["instance_type_id"]), str(type_id)) flavor_id = flavors.get_flavor_by_name("m1.tiny")["flavorid"] self.assertEquals(str(payload["instance_flavor_id"]), str(flavor_id)) for attr in ( "display_name", "created_at", "launched_at", "state", "state_description", "bandwidth", "audit_period_beginning", "audit_period_ending", "image_meta", ): self.assertTrue(attr in payload, msg="Key %s not in payload" % attr) self.assertEquals(payload["image_meta"], {"md_key1": "val1", "md_key2": "val2"}) image_ref_url = "%s/images/1" % glance.generate_glance_url() self.assertEquals(payload["image_ref_url"], image_ref_url) self.compute.terminate_instance(self.context, jsonutils.to_primitive(instance))
def launch_vpn_instance(self, context): LOG.debug("Launching VPN for %s", context.project_id) key_name = self.setup_key_pair(context) group_name = self.setup_security_group(context) flavor = flavors.get_flavor_by_name(CONF.vpn_flavor) instance_name = '%s%s' % (context.project_id, CONF.vpn_key_suffix) user_data = self.get_encoded_zip(context.project_id) return self.compute_api.create(context, flavor, CONF.vpn_image_id, display_name=instance_name, user_data=user_data, key_name=key_name, security_group=[group_name])
def launch_vpn_instance(self, context): LOG.debug(_("Launching VPN for %s") % (context.project_id)) key_name = self.setup_key_pair(context) group_name = self.setup_security_group(context) instance_type = flavors.get_flavor_by_name(CONF.vpn_flavor) instance_name = '%s%s' % (context.project_id, CONF.vpn_key_suffix) user_data = self.get_encoded_zip(context.project_id) return self.compute_api.create(context, instance_type, CONF.vpn_image_id, display_name=instance_name, user_data=user_data, key_name=key_name, security_group=[group_name])
def test_notify_about_instance_create(self): keypair = objects.KeyPair(name='my-key', user_id='fake', type='ssh', public_key=self.public_key, fingerprint=self.fingerprint) keypairs = objects.KeyPairList(objects=[keypair]) instance = create_instance(self.context, params={'keypairs': keypairs}) compute_utils.notify_about_instance_create(self.context, instance, host='fake-compute', phase='start') self.assertEqual(1, len(fake_notifier.VERSIONED_NOTIFICATIONS)) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual('INFO', notification['priority']) self.assertEqual('instance.create.start', notification['event_type']) self.assertEqual('nova-compute:fake-compute', notification['publisher_id']) payload = notification['payload']['nova_object.data'] self.assertEqual('fake', payload['tenant_id']) self.assertEqual('fake', payload['user_id']) self.assertEqual(instance['uuid'], payload['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(flavorid, str(flavor['flavorid'])) keypairs_payload = payload['keypairs'] self.assertEqual(1, len(keypairs_payload)) keypair_data = keypairs_payload[0]['nova_object.data'] self.assertEqual( keypair_data, { 'name': 'my-key', 'user_id': 'fake', 'type': 'ssh', 'public_key': self.public_key, 'fingerprint': self.fingerprint }) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state', 'display_description', 'locked', 'auto_disk_config'): self.assertIn(attr, payload, "Key %s not in payload" % attr) self.assertEqual(uuids.fake_image_ref, payload['image_uuid'])
def _create_instance(self, params={}): """Create a test instance.""" instance_type = flavors.get_flavor_by_name("m1.tiny") sys_meta = flavors.save_flavor_info({}, instance_type) inst = {} inst["image_ref"] = 1 inst["reservation_id"] = "r-fakeres" inst["user_id"] = self.user_id inst["project_id"] = self.project_id inst["instance_type_id"] = instance_type["id"] inst["system_metadata"] = sys_meta inst["ami_launch_index"] = 0 inst["root_gb"] = 0 inst["ephemeral_gb"] = 0 inst.update(params) return db.instance_create(self.context, inst)["id"]
def _create_instance(self, params={}): """Create a test instance.""" flavor = flavors.get_flavor_by_name('m1.tiny') sys_meta = flavors.save_flavor_info({}, flavor) inst = {} inst['image_ref'] = 1 inst['reservation_id'] = 'r-fakeres' inst['user_id'] = self.user_id inst['project_id'] = self.project_id inst['instance_type_id'] = flavor['id'] inst['system_metadata'] = sys_meta inst['ami_launch_index'] = 0 inst['root_gb'] = 0 inst['ephemeral_gb'] = 0 inst.update(params) return db.instance_create(self.context, inst)['id']
def _wrapped_create(self, params=None): instance_type = flavors.get_flavor_by_name('m1.tiny') sys_meta = flavors.save_flavor_info({}, instance_type) inst = {} inst['image_ref'] = 1 inst['user_id'] = self.user_id inst['project_id'] = self.project_id inst['instance_type_id'] = instance_type['id'] inst['root_gb'] = 0 inst['ephemeral_gb'] = 0 inst['access_ip_v4'] = '1.2.3.4' inst['access_ip_v6'] = 'feed:5eed' inst['display_name'] = 'test_instance' inst['hostname'] = 'test_instance_hostname' inst['node'] = 'test_instance_node' inst['system_metadata'] = sys_meta if params: inst.update(params) return db.instance_create(self.context, inst)
def _wrapped_create(self, params=None): instance_type = flavors.get_flavor_by_name("m1.tiny") sys_meta = flavors.save_flavor_info({}, instance_type) inst = {} inst["image_ref"] = 1 inst["user_id"] = self.user_id inst["project_id"] = self.project_id inst["instance_type_id"] = instance_type["id"] inst["root_gb"] = 0 inst["ephemeral_gb"] = 0 inst["access_ip_v4"] = "1.2.3.4" inst["access_ip_v6"] = "feed:5eed" inst["display_name"] = "test_instance" inst["hostname"] = "test_instance_hostname" inst["node"] = "test_instance_node" inst["system_metadata"] = sys_meta if params: inst.update(params) return db.instance_create(self.context, inst)
def _wrapped_create(self, params=None): instance_type = flavors.get_flavor_by_name('m1.tiny') inst = objects.Instance(image_ref=1, user_id=self.user_id, project_id=self.project_id, instance_type_id=instance_type['id'], root_gb=0, ephemeral_gb=0, access_ip_v4='1.2.3.4', access_ip_v6='feed::5eed', display_name='test_instance', hostname='test_instance_hostname', node='test_instance_node', system_metadata={}) inst._context = self.context if params: inst.update(params) inst.flavor = instance_type inst.create() return inst
def _create_fake_instance_obj(self, params=None, type_name='m1.tiny', services=False, context=None): flavor = flavors.get_flavor_by_name(type_name) inst = objects.Instance(context=context or self.context) inst.cell_name = 'api!child' inst.vm_state = vm_states.ACTIVE inst.task_state = None inst.power_state = power_state.RUNNING inst.image_ref = FAKE_IMAGE_REF inst.reservation_id = 'r-fakeres' inst.user_id = self.user_id inst.project_id = self.project_id inst.host = self.compute.host inst.node = NODENAME inst.instance_type_id = flavor.id inst.ami_launch_index = 0 inst.memory_mb = 0 inst.vcpus = 0 inst.root_gb = 0 inst.ephemeral_gb = 0 inst.architecture = obj_fields.Architecture.X86_64 inst.os_type = 'Linux' inst.system_metadata = (params and params.get('system_metadata', {}) or {}) inst.locked = False inst.created_at = timeutils.utcnow() inst.updated_at = timeutils.utcnow() inst.launched_at = timeutils.utcnow() inst.security_groups = objects.SecurityGroupList(objects=[]) inst.flavor = flavor inst.old_flavor = None inst.new_flavor = None if params: inst.flavor.update(params.pop('flavor', {})) inst.update(params) inst.create() return inst
def _create_fake_instance_obj(self, params=None, type_name='m1.tiny', services=False, context=None): flavor = flavors.get_flavor_by_name(type_name) inst = objects.Instance(context=context or self.context) inst.cell_name = 'api!child' inst.vm_state = vm_states.ACTIVE inst.task_state = None inst.power_state = power_state.RUNNING inst.image_ref = FAKE_IMAGE_REF inst.reservation_id = 'r-fakeres' inst.user_id = self.user_id inst.project_id = self.project_id inst.host = self.compute.host inst.node = NODENAME inst.instance_type_id = flavor.id inst.ami_launch_index = 0 inst.memory_mb = 0 inst.vcpus = 0 inst.root_gb = 0 inst.ephemeral_gb = 0 inst.architecture = obj_fields.Architecture.X86_64 inst.os_type = 'Linux' inst.system_metadata = ( params and params.get('system_metadata', {}) or {}) inst.locked = False inst.created_at = timeutils.utcnow() inst.updated_at = timeutils.utcnow() inst.launched_at = timeutils.utcnow() inst.security_groups = objects.SecurityGroupList(objects=[]) inst.flavor = flavor inst.old_flavor = None inst.new_flavor = None if params: inst.flavor.update(params.pop('flavor', {})) inst.update(params) inst.create() return inst
def create_instance(context, user_id='fake', project_id='fake', params=None): """Create a test instance.""" flavor = flavors.get_flavor_by_name('m1.tiny') net_info = model.NetworkInfo([]) info_cache = objects.InstanceInfoCache(network_info=net_info) inst = objects.Instance(context=context, image_ref=uuids.fake_image_ref, reservation_id='r-fakeres', user_id=user_id, project_id=project_id, instance_type_id=flavor.id, flavor=flavor, old_flavor=None, new_flavor=None, system_metadata={}, ami_launch_index=0, root_gb=0, ephemeral_gb=0, info_cache=info_cache) if params: inst.update(params) inst.create() return inst
def test_notify_about_volume_swap(self): instance = create_instance(self.context) compute_utils.notify_about_volume_swap( self.context, instance, 'fake-compute', fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.START, uuids.old_volume_id, uuids.new_volume_id) self.assertEqual(len(fake_notifier.VERSIONED_NOTIFICATIONS), 1) notification = fake_notifier.VERSIONED_NOTIFICATIONS[0] self.assertEqual('INFO', notification['priority']) self.assertEqual( 'instance.%s.%s' % (fields.NotificationAction.VOLUME_SWAP, fields.NotificationPhase.START), notification['event_type']) self.assertEqual('nova-compute:fake-compute', notification['publisher_id']) payload = notification['payload']['nova_object.data'] self.assertEqual(self.project_id, payload['tenant_id']) self.assertEqual(self.user_id, payload['user_id']) self.assertEqual(instance['uuid'], payload['uuid']) flavorid = flavors.get_flavor_by_name('m1.tiny')['flavorid'] flavor = payload['flavor']['nova_object.data'] self.assertEqual(flavorid, str(flavor['flavorid'])) for attr in ('display_name', 'created_at', 'launched_at', 'state', 'task_state'): self.assertIn(attr, payload) self.assertEqual(uuids.fake_image_ref, payload['image_uuid']) self.assertEqual(uuids.old_volume_id, payload['old_volume_id']) self.assertEqual(uuids.new_volume_id, payload['new_volume_id'])
def test_flavor_get_by_None_name_returns_default(self): # Ensure get by name returns default flavor with no name. default = flavors.get_default_flavor() actual = flavors.get_flavor_by_name(None) self.assertEqual(default, actual)