Added method exists to the Tag object

Added method which allow to find out if specified
tag exists on specified server.

Also versions of some objects were dumped.

Implements: blueprint tag-instances

Change-Id: I2a67fd9f92f7b9ea3ecf8e8c051b55c13013c223
This commit is contained in:
Sergey Nikitin 2015-04-28 12:16:10 +03:00
parent b4e1d45b78
commit 33b622a70f
10 changed files with 94 additions and 34 deletions

View File

@ -1948,3 +1948,8 @@ def instance_tag_delete(context, instance_uuid, tag):
def instance_tag_delete_all(context, instance_uuid):
"""Delete all tags from the instance."""
return IMPL.instance_tag_delete_all(context, instance_uuid)
def instance_tag_exists(context, instance_uuid, tag):
"""Check if specified tag exist on the instance."""
return IMPL.instance_tag_exists(context, instance_uuid, tag)

View File

@ -6552,3 +6552,13 @@ def instance_tag_delete_all(context, instance_uuid):
with session.begin(subtransactions=True):
_check_instance_exists(context, session, instance_uuid)
session.query(models.Tag).filter_by(resource_id=instance_uuid).delete()
def instance_tag_exists(context, instance_uuid, tag):
session = get_session()
with session.begin(subtransactions=True):
_check_instance_exists(context, session, instance_uuid)
q = session.query(models.Tag).filter_by(
resource_id=instance_uuid, tag=tag)
return session.query(q.exists()).scalar()

View File

@ -55,7 +55,8 @@ class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject,
# Version 1.11: Changed destination_type field to
# BlockDeviceDestinationTypeField.
# Version 1.12: Changed device_type field to BlockDeviceTypeField.
VERSION = '1.12'
# Version 1.13: Instance version 1.21
VERSION = '1.13'
fields = {
'id': fields.IntegerField(),
@ -81,7 +82,7 @@ class BlockDeviceMapping(base.NovaPersistentObject, base.NovaObject,
obj_relationships = {
'instance': [('1.0', '1.13'), ('1.2', '1.14'), ('1.3', '1.15'),
('1.4', '1.16'), ('1.5', '1.17'), ('1.6', '1.18'),
('1.8', '1.19'), ('1.9', '1.20')],
('1.8', '1.19'), ('1.9', '1.20'), ('1.13', '1.21')],
}
@staticmethod
@ -259,7 +260,8 @@ class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject):
# Version 1.11: BlockDeviceMapping <= version 1.10
# Version 1.12: BlockDeviceMapping <= version 1.11
# Version 1.13: BlockDeviceMapping <= version 1.12
VERSION = '1.13'
# Version 1.14: BlockDeviceMapping <= version 1.13
VERSION = '1.14'
fields = {
'objects': fields.ListOfObjectsField('BlockDeviceMapping'),
@ -279,6 +281,7 @@ class BlockDeviceMappingList(base.ObjectListBase, base.NovaObject):
'1.11': '1.10',
'1.12': '1.11',
'1.13': '1.12',
'1.14': '1.13',
}
@base.remotable_classmethod

View File

@ -41,7 +41,8 @@ class FixedIP(obj_base.NovaPersistentObject, obj_base.NovaObject,
# Version 1.8: Instance 1.18
# Version 1.9: Instance 1.19
# Version 1.10: Instance 1.20
VERSION = '1.10'
# Version 1.11: Instance 1.21
VERSION = '1.11'
fields = {
'id': fields.IntegerField(),
@ -67,7 +68,7 @@ class FixedIP(obj_base.NovaPersistentObject, obj_base.NovaObject,
obj_relationships = {
'instance': [('1.0', '1.13'), ('1.2', '1.14'), ('1.3', '1.15'),
('1.6', '1.16'), ('1.7', '1.17'), ('1.8', '1.18'),
('1.9', '1.19'), ('1.10', '1.20')],
('1.9', '1.19'), ('1.10', '1.20'), ('1.11', '1.21')],
'network': [('1.0', '1.2')],
'virtual_interface': [('1.1', '1.0')],
'floating_ips': [('1.5', '1.7')],
@ -217,7 +218,8 @@ class FixedIPList(obj_base.ObjectListBase, obj_base.NovaObject):
# Version 1.8: FixedIP <= version 1.8
# Version 1.9: FixedIP <= version 1.9
# Version 1.10: FixedIP <= version 1.10
VERSION = '1.10'
# Version 1.11: FixedIP <= version 1.11
VERSION = '1.11'
fields = {
'objects': fields.ListOfObjectsField('FixedIP'),
@ -234,6 +236,7 @@ class FixedIPList(obj_base.ObjectListBase, obj_base.NovaObject):
'1.8': '1.8',
'1.9': '1.9',
'1.10': '1.10',
'1.11': '1.11',
}
@obj_base.remotable_classmethod

View File

@ -32,7 +32,8 @@ class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject,
# Version 1.4: FixedIP <= version 1.4
# Version 1.5: FixedIP <= version 1.5
# Version 1.6: FixedIP <= version 1.6
VERSION = '1.6'
# Version 1.7: FixedIP <= version 1.11
VERSION = '1.7'
fields = {
'id': fields.IntegerField(),
'address': fields.IPAddressField(),
@ -47,7 +48,8 @@ class FloatingIP(obj_base.NovaPersistentObject, obj_base.NovaObject,
obj_relationships = {
'fixed_ip': [('1.0', '1.1'), ('1.2', '1.2'), ('1.3', '1.3'),
('1.4', '1.4'), ('1.5', '1.5'), ('1.6', '1.6')],
('1.4', '1.4'), ('1.5', '1.5'), ('1.6', '1.6'),
('1.7', '1.11')],
}
@staticmethod
@ -170,6 +172,7 @@ class FloatingIPList(obj_base.ObjectListBase, obj_base.NovaObject):
# Version 1.5: FloatingIP 1.4
# Version 1.6: FloatingIP 1.5
# Version 1.7: FloatingIP 1.6
# Version 1.8: FloatingIP 1.7
fields = {
'objects': fields.ListOfObjectsField('FloatingIP'),
}
@ -182,8 +185,9 @@ class FloatingIPList(obj_base.ObjectListBase, obj_base.NovaObject):
'1.5': '1.4',
'1.6': '1.5',
'1.7': '1.6',
'1.8': '1.7',
}
VERSION = '1.7'
VERSION = '1.8'
@obj_base.remotable_classmethod
def get_all(cls, context):

View File

@ -120,7 +120,8 @@ class Instance(base.NovaPersistentObject, base.NovaObject,
# Version 1.18: Added flavor, old_flavor, new_flavor
# Version 1.19: Added vcpu_model
# Version 1.20: Added ec2_ids
VERSION = '1.20'
# Version 1.21: TagList 1.1
VERSION = '1.21'
fields = {
'id': fields.IntegerField(),
@ -227,7 +228,7 @@ class Instance(base.NovaPersistentObject, base.NovaObject,
'pci_devices': [('1.6', '1.0'), ('1.15', '1.1')],
'numa_topology': [('1.14', '1.0'), ('1.16', '1.1')],
'pci_requests': [('1.16', '1.1')],
'tags': [('1.17', '1.0')],
'tags': [('1.17', '1.0'), ('1.21', '1.1')],
'flavor': [('1.18', '1.1')],
'old_flavor': [('1.18', '1.1')],
'new_flavor': [('1.18', '1.1')],
@ -1164,7 +1165,8 @@ class InstanceList(base.ObjectListBase, base.NovaObject):
# Version 1.15: Instance <= version 1.19
# Version 1.16: Added get_all() method
# Version 1.17: Instance <= version 1.20
VERSION = '1.17'
# Version 1.18: Instance <= version 1.21
VERSION = '1.18'
fields = {
'objects': fields.ListOfObjectsField('Instance'),
@ -1188,6 +1190,7 @@ class InstanceList(base.ObjectListBase, base.NovaObject):
'1.15': '1.19',
'1.16': '1.19',
'1.17': '1.20',
'1.18': '1.21',
}
@base.remotable_classmethod

View File

@ -19,7 +19,8 @@ from nova.objects import fields
@base.NovaObjectRegistry.register
class Tag(base.NovaObject):
# Version 1.0: Initial version
VERSION = '1.0'
# Version 1.1: Added method exists()
VERSION = '1.1'
fields = {
'resource_id': fields.StringField(),
@ -43,17 +44,23 @@ class Tag(base.NovaObject):
def destroy(cls, context, resource_id, name):
db.instance_tag_delete(context, resource_id, name)
@base.remotable_classmethod
def exists(cls, context, resource_id, name):
return db.instance_tag_exists(context, resource_id, name)
@base.NovaObjectRegistry.register
class TagList(base.ObjectListBase, base.NovaObject):
# Version 1.0: Initial version
VERSION = '1.0'
# Version 1.1: Tag <= version 1.1
VERSION = '1.1'
fields = {
'objects': fields.ListOfObjectsField('Tag'),
}
child_versions = {
'1.0': '1.0',
'1.1': '1.1',
}
@base.remotable_classmethod

View File

@ -8917,6 +8917,19 @@ class TestDBInstanceTags(test.TestCase):
tags = self._get_tags_from_resp(tag_refs)
self.assertEqual([], tags)
def test_instance_tag_exists(self):
uuid = self._create_instance()
tag1 = 'tag1'
tag2 = 'tag2'
db.instance_tag_add(self.context, uuid, tag1)
# NOTE(snikitin): Make sure it's actually a bool
self.assertEqual(True, db.instance_tag_exists(self.context, uuid,
tag1))
self.assertEqual(False, db.instance_tag_exists(self.context, uuid,
tag2))
def test_instance_tag_add_to_non_existing_instance(self):
self._create_instance()
self.assertRaises(exception.InstanceNotFound, db.instance_tag_add,
@ -8943,3 +8956,9 @@ class TestDBInstanceTags(test.TestCase):
self.assertRaises(exception.InstanceNotFound,
db.instance_tag_delete_all,
self.context, 'fake_uuid')
def test_instance_tag_exists_non_existing_instance(self):
self._create_instance()
self.assertRaises(exception.InstanceNotFound,
db.instance_tag_exists,
self.context, 'fake_uuid', 'tag')

View File

@ -1059,8 +1059,8 @@ object_data = {
'AggregateList': '1.2-79689d69db4de545a82fe09f30468c53',
'BandwidthUsage': '1.2-c6e4c779c7f40f2407e3d70022e3cd1c',
'BandwidthUsageList': '1.2-77b4d43e641459f464a6aa4d53debd8f',
'BlockDeviceMapping': '1.12-d44d8d694619e79c172a99b3c1d6261d',
'BlockDeviceMappingList': '1.13-99f482330b68a3b1591610b91a5cd6a4',
'BlockDeviceMapping': '1.13-d44d8d694619e79c172a99b3c1d6261d',
'BlockDeviceMappingList': '1.14-ff39c726181b66dfdf54d7c73abf5ffb',
'CellMapping': '1.0-7f1a7e85a22bbb7559fc730ab658b9bd',
'ComputeNode': '1.11-71784d2e6f2814ab467d4e0f69286843',
'ComputeNodeList': '1.11-8d269636229e8a39fef1c3514f77d0c0',
@ -1070,16 +1070,16 @@ object_data = {
'EC2InstanceMapping': '1.0-a4556eb5c5e94c045fe84f49cf71644f',
'EC2SnapshotMapping': '1.0-47e7ddabe1af966dce0cfd0ed6cd7cd1',
'EC2VolumeMapping': '1.0-5b713751d6f97bad620f3378a521020d',
'FixedIP': '1.10-b5818a33996228fc146f096d1403742c',
'FixedIPList': '1.10-d0db9597559409a4a01b3577500dfe5e',
'FixedIP': '1.11-b5818a33996228fc146f096d1403742c',
'FixedIPList': '1.11-18c3cc9a716bc12dd35940fe64d8eb7b',
'Flavor': '1.1-b6bb7a730a79d720344accefafacf7ee',
'FlavorList': '1.1-d96e87307f94062ce538f77b5e221e13',
'FloatingIP': '1.6-52a67d52d85eb8b3f324a5b7935a335b',
'FloatingIPList': '1.7-bdd31ccd6ff9bb0d290108397b3cd44c',
'FloatingIP': '1.7-52a67d52d85eb8b3f324a5b7935a335b',
'FloatingIPList': '1.8-9a9fe191dc694ea4ff08946be9460718',
'HVSpec': '1.0-3999ff70698fc472c2d4d60359949f6b',
'ImageMeta': '1.1-642d1b2eb3e880a367f37d72dd76162d',
'ImageMetaProps': '1.1-8fe09b7872538f291649e77375f8ac4c',
'Instance': '1.20-260d385315d4868b6397c61a13109841',
'Instance': '1.21-260d385315d4868b6397c61a13109841',
'InstanceAction': '1.1-f9f293e526b66fca0d05c3b3a2d13914',
'InstanceActionEvent': '1.1-e56a64fa4710e43ef7af2ad9d6028b33',
'InstanceActionEventList': '1.0-c37db4e58b637a857c90fb02284d8f7c',
@ -1090,7 +1090,7 @@ object_data = {
'InstanceGroup': '1.9-a413a4ec0ff391e3ef0faa4e3e2a96d0',
'InstanceGroupList': '1.6-1e383df73d9bd224714df83d9a9983bb',
'InstanceInfoCache': '1.5-cd8b96fefe0fc8d4d337243ba0bf0e1e',
'InstanceList': '1.17-64f6949d58e4ecd3219142f1567a61d9',
'InstanceList': '1.18-592dca17aa22feacae9f1ff854e17c79',
'InstanceMapping': '1.0-47ef26034dfcbea78427565d9177fe50',
'InstanceMappingList': '1.0-b7b108f6a56bd100c20a3ebd5f3801a1',
'InstanceNUMACell': '1.2-535ef30e0de2d6a0d26a71bd58ecafc4',
@ -1124,10 +1124,10 @@ object_data = {
'SecurityGroupRuleList': '1.1-521f1aeb7b0cc00d026175509289d020',
'Service': '1.13-bc6c9671a91439e08224c2652da5fc4c',
'ServiceList': '1.11-d1728430a30700c143e542b7c75f65b0',
'Tag': '1.0-616bf44af4a22e853c17b37a758ec73e',
'TagList': '1.0-e16d65894484b7530b720792ffbbbd02',
'TaskLog': '1.0-78b0534366f29aa3eebb01860fbe18fe',
'TaskLogList': '1.0-2378c0e2afdbbfaf392f31c1dffa4d25',
'Tag': '1.1-8b8d7d5b48887651a0e01241672e2963',
'TagList': '1.1-6263d7242b87010174cf1d4ad49e5148',
'VirtCPUFeature': '1.0-3310718d8c72309259a6e39bdefe83ee',
'VirtCPUModel': '1.0-6a5cc9f322729fc70ddc6733bacd57d3',
'VirtCPUTopology': '1.0-fc694de72e20298f7c6bab1083fd4563',
@ -1140,24 +1140,24 @@ object_relationships = {
'AgentList': {'Agent': '1.0'},
'AggregateList': {'Aggregate': '1.1'},
'BandwidthUsageList': {'BandwidthUsage': '1.2'},
'BlockDeviceMapping': {'Instance': '1.20'},
'BlockDeviceMappingList': {'BlockDeviceMapping': '1.12'},
'BlockDeviceMapping': {'Instance': '1.21'},
'BlockDeviceMappingList': {'BlockDeviceMapping': '1.13'},
'ComputeNode': {'HVSpec': '1.0', 'PciDevicePoolList': '1.1'},
'ComputeNodeList': {'ComputeNode': '1.11'},
'DNSDomainList': {'DNSDomain': '1.0'},
'FixedIP': {'Instance': '1.20', 'Network': '1.2',
'FixedIP': {'Instance': '1.21', 'Network': '1.2',
'VirtualInterface': '1.0',
'FloatingIPList': '1.7'},
'FixedIPList': {'FixedIP': '1.10'},
'FloatingIPList': '1.8'},
'FixedIPList': {'FixedIP': '1.11'},
'FlavorList': {'Flavor': '1.1'},
'FloatingIP': {'FixedIP': '1.10'},
'FloatingIPList': {'FloatingIP': '1.6'},
'FloatingIP': {'FixedIP': '1.11'},
'FloatingIPList': {'FloatingIP': '1.7'},
'ImageMeta': {'ImageMetaProps': '1.1'},
'Instance': {'InstanceFault': '1.2',
'InstanceInfoCache': '1.5',
'InstanceNUMATopology': '1.1',
'PciDeviceList': '1.1',
'TagList': '1.0',
'TagList': '1.1',
'SecurityGroupList': '1.0',
'Flavor': '1.1',
'InstancePCIRequests': '1.1',
@ -1168,7 +1168,7 @@ object_relationships = {
'InstanceActionList': {'InstanceAction': '1.1'},
'InstanceFaultList': {'InstanceFault': '1.2'},
'InstanceGroupList': {'InstanceGroup': '1.9'},
'InstanceList': {'Instance': '1.20'},
'InstanceList': {'Instance': '1.21'},
'InstanceMappingList': {'InstanceMapping': '1.0'},
'InstanceNUMACell': {'VirtCPUTopology': '1.0'},
'InstanceNUMATopology': {'InstanceNUMACell': '1.2'},
@ -1187,7 +1187,7 @@ object_relationships = {
'SecurityGroupRuleList': {'SecurityGroupRule': '1.1'},
'Service': {'ComputeNode': '1.11'},
'ServiceList': {'Service': '1.13'},
'TagList': {'Tag': '1.0'},
'TagList': {'Tag': '1.1'},
'TaskLogList': {'TaskLog': '1.0'},
'VirtCPUModel': {'VirtCPUFeature': '1.0', 'VirtCPUTopology': '1.0'},
'VirtualInterfaceList': {'VirtualInterface': '1.0'}

View File

@ -55,6 +55,12 @@ class _TestTagObject(object):
tag_delete.assert_called_once_with(self.context,
RESOURCE_ID, TAG_NAME1)
@mock.patch('nova.db.instance_tag_exists')
def test_exists(self, instance_tag_exists):
tag.Tag.exists(self.context, RESOURCE_ID, TAG_NAME1)
instance_tag_exists.assert_called_once_with(
self.context, RESOURCE_ID, TAG_NAME1)
class TestMigrationObject(test_objects._LocalTest,
_TestTagObject):