Merge "Remove metadata/metadetails from instance/server groups"

This commit is contained in:
Jenkins
2014-08-12 03:13:08 +00:00
committed by Gerrit Code Review
9 changed files with 31 additions and 265 deletions

View File

@@ -137,7 +137,9 @@ class ServerGroupController(wsgi.Controller):
server_group['id'] = group.uuid
server_group['name'] = group.name
server_group['policies'] = group.policies or []
server_group['metadata'] = group.metadetails or {}
# NOTE(danms): This has been exposed to the user, but never used.
# Since we can't remove it, just make sure it's always empty.
server_group['metadata'] = {}
members = []
if group.members:
# Display the instances that are not deleted.

View File

@@ -801,15 +801,13 @@ def instance_remove_security_group(context, instance_id, security_group_id):
####################
def instance_group_create(context, values, policies=None, metadata=None,
members=None):
"""Create a new group with metadata.
def instance_group_create(context, values, policies=None, members=None):
"""Create a new group.
Each group will receive a unique uuid. This will be used for access to the
group.
"""
return IMPL.instance_group_create(context, values, policies, metadata,
members)
return IMPL.instance_group_create(context, values, policies, members)
def instance_group_get(context, group_uuid):

View File

@@ -5684,8 +5684,7 @@ def archive_deleted_rows(context, max_rows=None):
def _instance_group_get_query(context, model_class, id_field=None, id=None,
session=None, read_deleted=None):
columns_to_join = {models.InstanceGroup: ['_policies', '_metadata',
'_members']}
columns_to_join = {models.InstanceGroup: ['_policies', '_members']}
query = model_query(context, model_class, session=session,
read_deleted=read_deleted)
@@ -5698,9 +5697,9 @@ def _instance_group_get_query(context, model_class, id_field=None, id=None,
return query
def instance_group_create(context, values, policies=None, metadata=None,
def instance_group_create(context, values, policies=None,
members=None):
"""Create a new group with metadata."""
"""Create a new group."""
uuid = values.get('uuid', None)
if uuid is None:
uuid = uuidutils.generate_uuid()
@@ -5717,14 +5716,10 @@ def instance_group_create(context, values, policies=None, metadata=None,
# We don't want these to be lazy loaded later. We know there is
# nothing here since we just created this instance group.
group._policies = []
group._metadata = []
group._members = []
if policies:
_instance_group_policies_add(context, group.id, policies,
session=session)
if metadata:
_instance_group_metadata_add(context, group.id, metadata,
session=session)
if members:
_instance_group_members_add(context, group.id, members,
session=session)
@@ -5766,13 +5761,6 @@ def instance_group_update(context, group_uuid, values):
values.pop('policies'),
set_delete=True,
session=session)
metadata = values.get('metadata')
if metadata is not None:
_instance_group_metadata_add(context,
group.id,
values.pop('metadata'),
set_delete=True,
session=session)
members = values.get('members')
if members is not None:
_instance_group_members_add(context,
@@ -5785,8 +5773,6 @@ def instance_group_update(context, group_uuid, values):
if policies:
values['policies'] = policies
if metadata:
values['metadata'] = metadata
if members:
values['members'] = members
@@ -5807,7 +5793,6 @@ def instance_group_delete(context, group_uuid):
# Delete policies, metadata and members
instance_models = [models.InstanceGroupPolicy,
models.InstanceGroupMetadata,
models.InstanceGroupMember]
for model in instance_models:
model_query(context, model, session=session).\
@@ -5850,70 +5835,6 @@ def _instance_group_id(context, group_uuid, session=None):
return result.id
def _instance_group_metadata_add(context, id, metadata, set_delete=False,
session=None):
if not session:
session = get_session()
with session.begin(subtransactions=True):
all_keys = metadata.keys()
query = _instance_group_model_get_query(context,
models.InstanceGroupMetadata,
id,
session=session)
if set_delete:
query.filter(~models.InstanceGroupMetadata.key.in_(all_keys)).\
soft_delete(synchronize_session=False)
query = query.filter(models.InstanceGroupMetadata.key.in_(all_keys))
already_existing_keys = set()
for meta_ref in query.all():
key = meta_ref.key
meta_ref.update({'value': metadata[key]})
already_existing_keys.add(key)
for key, value in metadata.iteritems():
if key in already_existing_keys:
continue
meta_ref = models.InstanceGroupMetadata()
meta_ref.update({'key': key,
'value': value,
'group_id': id})
session.add(meta_ref)
return metadata
def instance_group_metadata_add(context, group_uuid, metadata,
set_delete=False):
id = _instance_group_id(context, group_uuid)
return _instance_group_metadata_add(context, id, metadata,
set_delete=set_delete)
def instance_group_metadata_delete(context, group_uuid, key):
id = _instance_group_id(context, group_uuid)
count = _instance_group_get_query(context,
models.InstanceGroupMetadata,
models.InstanceGroupMetadata.group_id,
id).\
filter_by(key=key).\
soft_delete()
if count == 0:
raise exception.InstanceGroupMetadataNotFound(group_uuid=group_uuid,
metadata_key=key)
def instance_group_metadata_get(context, group_uuid):
id = _instance_group_id(context, group_uuid)
rows = model_query(context,
models.InstanceGroupMetadata.key,
models.InstanceGroupMetadata.value,
base_model=models.InstanceGroupMetadata).\
filter_by(group_id=id).all()
return dict((r[0], r[1]) for r in rows)
def _instance_group_members_add(context, id, members, set_delete=False,
session=None):
if not session:

View File

@@ -1305,19 +1305,6 @@ class InstanceGroupPolicy(BASE, NovaBase):
nullable=False)
class InstanceGroupMetadata(BASE, NovaBase):
"""Represents a key/value pair for an instance group."""
__tablename__ = 'instance_group_metadata'
__table_args__ = (
Index('instance_group_metadata_key_idx', 'key'),
)
id = Column(Integer, primary_key=True, nullable=False)
key = Column(String(255))
value = Column(String(255))
group_id = Column(Integer, ForeignKey('instance_groups.id'),
nullable=False)
class InstanceGroup(BASE, NovaBase):
"""Represents an instance group.
@@ -1340,10 +1327,6 @@ class InstanceGroup(BASE, NovaBase):
'InstanceGroup.id == InstanceGroupPolicy.group_id,'
'InstanceGroupPolicy.deleted == 0,'
'InstanceGroup.deleted == 0)')
_metadata = orm.relationship(InstanceGroupMetadata, primaryjoin='and_('
'InstanceGroup.id == InstanceGroupMetadata.group_id,'
'InstanceGroupMetadata.deleted == 0,'
'InstanceGroup.deleted == 0)')
_members = orm.relationship(InstanceGroupMember, primaryjoin='and_('
'InstanceGroup.id == InstanceGroupMember.group_id,'
'InstanceGroupMember.deleted == 0,'
@@ -1353,10 +1336,6 @@ class InstanceGroup(BASE, NovaBase):
def policies(self):
return [p.policy for p in self._policies]
@property
def metadetails(self):
return dict((m.key, m.value) for m in self._metadata)
@property
def members(self):
return [m.instance_id for m in self._members]

View File

@@ -28,7 +28,8 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject):
# Version 1.4: Add add_members()
# Version 1.5: Add get_hosts()
# Version 1.6: Add get_by_name()
VERSION = '1.6'
# Version 1.7: Deprecate metadetails
VERSION = '1.7'
fields = {
'id': fields.IntegerField(),
@@ -40,10 +41,15 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject):
'name': fields.StringField(nullable=True),
'policies': fields.ListOfStringsField(nullable=True),
'metadetails': fields.DictOfStringsField(nullable=True),
'members': fields.ListOfStringsField(nullable=True),
}
def obj_make_compatible(self, primitive, target_version):
if target_version < (1, 7):
# NOTE(danms): Before 1.7, we had an always-empty
# metadetails property
primitive['metadetails'] = {}
@staticmethod
def _from_db_object(context, instance_group, db_inst):
"""Method to help with migration to objects.
@@ -95,11 +101,6 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject):
if not updates:
return
metadata = None
if 'metadetails' in updates:
metadata = updates.pop('metadetails')
updates.update({'metadata': metadata})
db.instance_group_update(context, self.uuid, updates)
db_inst = db.instance_group_get(context, self.uuid)
self._from_db_object(context, self, db_inst)
@@ -122,11 +123,9 @@ class InstanceGroup(base.NovaPersistentObject, base.NovaObject):
updates.pop('id', None)
policies = updates.pop('policies', None)
members = updates.pop('members', None)
metadetails = updates.pop('metadetails', None)
db_inst = db.instance_group_create(context, updates,
policies=policies,
metadata=metadetails,
members=members)
self._from_db_object(context, self, db_inst)
@@ -165,6 +164,8 @@ class InstanceGroupList(base.ObjectListBase, base.NovaObject):
# InstanceGroup <= version 1.3
# Version 1.1: InstanceGroup <= version 1.4
# Version 1.2: InstanceGroup <= version 1.5
# Version 1.3: InstanceGroup <= version 1.6
# Version 1.4: InstanceGroup <= version 1.7
VERSION = '1.2'
fields = {
@@ -176,6 +177,7 @@ class InstanceGroupList(base.ObjectListBase, base.NovaObject):
'1.1': '1.4',
'1.2': '1.5',
'1.3': '1.6',
'1.4': '1.7',
}
@base.remotable_classmethod

View File

@@ -48,7 +48,6 @@ def server_group_resp_template(**kwargs):
sgroup.setdefault('name', 'test')
sgroup.setdefault('policies', [])
sgroup.setdefault('members', [])
sgroup.setdefault('metadata', {})
return sgroup
@@ -66,10 +65,6 @@ def server_group_db(sg):
attrs['members'] = members
else:
attrs['members'] = []
if 'metadata' in attrs:
attrs['metadetails'] = attrs.pop('metadata')
else:
attrs['metadetails'] = {}
attrs['deleted'] = 0
attrs['deleted_at'] = None
attrs['created_at'] = None
@@ -257,7 +252,7 @@ class ServerGroupTest(test.TestCase):
groups = []
policies = ['anti-affinity']
members = []
metadata = {'key1': 'value1'}
metadata = {} # always empty
names = ['default-x', 'test']
sg1 = server_group_resp_template(id=str(1345),
name=names[0],
@@ -287,7 +282,7 @@ class ServerGroupTest(test.TestCase):
tenant_groups = []
policies = ['anti-affinity']
members = []
metadata = {'key1': 'value1'}
metadata = {} # always empty
names = ['default-x', 'test']
sg1 = server_group_resp_template(id=str(1345),
name=names[0],
@@ -428,7 +423,6 @@ class TestServerGroupXMLSerializer(test.TestCase):
def _verify_server_group(self, raw_group, tree):
policies = raw_group['policies']
members = raw_group['members']
metadata = raw_group['metadata']
self.assertEqual('server_group', self._tag(tree))
self.assertEqual(raw_group['id'], tree.get('id'))
self.assertEqual(raw_group['name'], tree.get('name'))
@@ -448,16 +442,7 @@ class TestServerGroupXMLSerializer(test.TestCase):
self.assertEqual(members[idx],
gr_child.text)
elif child_tag == 'metadata':
self.assertEqual(len(metadata), len(child))
metas = {}
for idx, gr_child in enumerate(child):
self.assertEqual(self._tag(gr_child), 'meta')
key = gr_child.get('key')
self.assertIn(key, ['key1', 'key2'])
metas[key] = gr_child.text
self.assertEqual(len(metas), len(metadata))
for k in metadata:
self.assertEqual(metadata[k], metas[k])
self.assertEqual(0, len(child))
def _verify_server_group_brief(self, raw_group, tree):
self.assertEqual('server_group', self._tag(tree))
@@ -467,13 +452,11 @@ class TestServerGroupXMLSerializer(test.TestCase):
def test_group_serializer(self):
policies = ["policy-1", "policy-2"]
members = ["1", "2"]
metadata = dict(key1="value1", key2="value2")
raw_group = dict(
id='890',
name='name',
policies=policies,
members=members,
metadata=metadata)
members=members)
sg_group = dict(server_group=raw_group)
text = self.default_serializer.serialize(sg_group)
@@ -485,19 +468,16 @@ class TestServerGroupXMLSerializer(test.TestCase):
policies = ["policy-1", "policy-2",
"policy-3"]
members = ["1", "2", "3"]
metadata = dict(key1="value1", key2="value2")
groups = [dict(
id='890',
name='test',
policies=policies[0:2],
members=members[0:2],
metadata=metadata),
members=members[0:2]),
dict(
id='123',
name='default',
policies=policies[2:],
members=members[2:],
metadata=metadata)]
members=members[2:])]
sg_groups = dict(server_groups=groups)
text = self.index_serializer.serialize(sg_groups)

View File

@@ -6667,9 +6667,9 @@ class InstanceGroupDBApiTestCase(test.TestCase, ModelsObjectComparatorMixin):
'project_id': self.project_id}
def _create_instance_group(self, context, values, policies=None,
metadata=None, members=None):
members=None):
return db.instance_group_create(context, values, policies=policies,
metadata=metadata, members=members)
members=members)
def test_instance_group_create_no_key(self):
values = self._get_default_values()
@@ -6781,15 +6781,6 @@ class InstanceGroupDBApiTestCase(test.TestCase, ModelsObjectComparatorMixin):
db.instance_group_update(self.context, id, values)
result = db.instance_group_get(self.context, id)
self.assertEqual(result['name'], 'new_fake_name')
# update metadata
values = self._get_default_values()
metadataInput = {'key11': 'value1',
'key12': 'value2'}
values['metadata'] = metadataInput
db.instance_group_update(self.context, id, values)
result = db.instance_group_get(self.context, id)
metadata = result['metadetails']
self._assertEqualObjects(metadata, metadataInput)
# update update members
values = self._get_default_values()
members = ['instance_id1', 'instance_id2']
@@ -6810,86 +6801,6 @@ class InstanceGroupDBApiTestCase(test.TestCase, ModelsObjectComparatorMixin):
'invalid_id', values)
class InstanceGroupMetadataDBApiTestCase(InstanceGroupDBApiTestCase):
def test_instance_group_metadata_on_create(self):
values = self._get_default_values()
values['uuid'] = 'fake_id'
metadata = {'key11': 'value1',
'key12': 'value2'}
result = self._create_instance_group(self.context, values,
metadata=metadata)
ignored_keys = ['id', 'deleted', 'deleted_at', 'updated_at',
'created_at']
self._assertEqualObjects(result, values, ignored_keys)
self._assertEqualObjects(metadata, result['metadetails'])
def test_instance_group_metadata_add(self):
values = self._get_default_values()
values['uuid'] = 'fake_id'
result = self._create_instance_group(self.context, values)
id = result['uuid']
metadata = db.instance_group_metadata_get(self.context, id)
self._assertEqualObjects(metadata, {})
metadata = {'key1': 'value1',
'key2': 'value2'}
db.instance_group_metadata_add(self.context, id, metadata)
metadata2 = db.instance_group_metadata_get(self.context, id)
self._assertEqualObjects(metadata, metadata2)
def test_instance_group_update(self):
values = self._get_default_values()
values['uuid'] = 'fake_id'
result = self._create_instance_group(self.context, values)
id = result['uuid']
metadata = {'key1': 'value1',
'key2': 'value2'}
db.instance_group_metadata_add(self.context, id, metadata)
metadata2 = db.instance_group_metadata_get(self.context, id)
self._assertEqualObjects(metadata, metadata2)
# check add with existing keys
metadata = {'key1': 'value1',
'key2': 'value2',
'key3': 'value3'}
db.instance_group_metadata_add(self.context, id, metadata)
metadata3 = db.instance_group_metadata_get(self.context, id)
self._assertEqualObjects(metadata, metadata3)
def test_instance_group_delete(self):
values = self._get_default_values()
values['uuid'] = 'fake_id'
result = self._create_instance_group(self.context, values)
id = result['uuid']
metadata = {'key1': 'value1',
'key2': 'value2',
'key3': 'value3'}
db.instance_group_metadata_add(self.context, id, metadata)
metadata3 = db.instance_group_metadata_get(self.context, id)
self._assertEqualObjects(metadata, metadata3)
db.instance_group_metadata_delete(self.context, id, 'key1')
metadata = db.instance_group_metadata_get(self.context, id)
self.assertNotIn('key1', metadata)
db.instance_group_metadata_delete(self.context, id, 'key2')
metadata = db.instance_group_metadata_get(self.context, id)
self.assertNotIn('key2', metadata)
def test_instance_group_metadata_invalid_ids(self):
values = self._get_default_values()
result = self._create_instance_group(self.context, values)
id = result['uuid']
self.assertRaises(exception.InstanceGroupNotFound,
db.instance_group_metadata_get,
self.context, 'invalid')
self.assertRaises(exception.InstanceGroupNotFound,
db.instance_group_metadata_delete, self.context,
'invalidid', 'key1')
metadata = {'key1': 'value1',
'key2': 'value2'}
db.instance_group_metadata_add(self.context, id, metadata)
self.assertRaises(exception.InstanceGroupMetadataNotFound,
db.instance_group_metadata_delete,
self.context, id, 'invalidkey')
class InstanceGroupMembersDBApiTestCase(InstanceGroupDBApiTestCase):
def test_instance_group_members_on_create(self):
values = self._get_default_values()

View File

@@ -38,23 +38,19 @@ class _TestInstanceGroupObjects(test.TestCase):
'project_id': self.project_id}
def _create_instance_group(self, context, values, policies=None,
metadata=None, members=None):
members=None):
return db.instance_group_create(context, values, policies=policies,
metadata=metadata, members=members)
members=members)
def test_get_by_uuid(self):
values = self._get_default_values()
metadata = {'key11': 'value1',
'key12': 'value2'}
policies = ['policy1', 'policy2']
members = ['instance_id1', 'instance_id2']
db_result = self._create_instance_group(self.context, values,
metadata=metadata,
policies=policies,
members=members)
obj_result = instance_group.InstanceGroup.get_by_uuid(self.context,
db_result.uuid)
self.assertEqual(obj_result.metadetails, metadata)
self.assertEqual(obj_result.members, members)
self.assertEqual(obj_result.policies, policies)
@@ -105,18 +101,6 @@ class _TestInstanceGroupObjects(test.TestCase):
result = db.instance_group_get(self.context, db_result['uuid'])
self.assertEqual(result['members'], members)
def test_save_metadata(self):
values = self._get_default_values()
db_result = self._create_instance_group(self.context, values)
obj_result = instance_group.InstanceGroup.get_by_uuid(self.context,
db_result.uuid)
metadata = {'foo': 'bar'}
obj_result.metadetails = metadata
obj_result.save()
db.instance_group_metadata_get(self.context, db_result['uuid'])
for key, value in metadata.iteritems():
self.assertEqual(value, metadata[key])
def test_create(self):
group1 = instance_group.InstanceGroup()
group1.uuid = 'fake-uuid'
@@ -150,17 +134,6 @@ class _TestInstanceGroupObjects(test.TestCase):
self.assertEqual(group1.id, group2.id)
self.assertEqual(group1.members, group2.members)
def test_create_with_metadata(self):
group1 = instance_group.InstanceGroup()
metadata = {'foo': 'bar'}
group1.metadetails = metadata
group1.create(self.context)
group2 = instance_group.InstanceGroup.get_by_uuid(self.context,
group1.uuid)
self.assertEqual(group1.id, group2.id)
for key, value in metadata.iteritems():
self.assertEqual(value, group2.metadetails[key])
def test_recreate_fails(self):
group = instance_group.InstanceGroup()
group.create(self.context)

View File

@@ -924,7 +924,7 @@ object_data = {
'InstanceExternalEvent': '1.0-f1134523654407a875fd59b80f759ee7',
'InstanceFault': '1.2-313438e37e9d358f3566c85f6ddb2d3e',
'InstanceFaultList': '1.1-bd578be60d045629ca7b3ce1a2493ae4',
'InstanceGroup': '1.6-c032430832b3cbaf92c99088e4b2fdc8',
'InstanceGroup': '1.7-b31ea31fdb452ab7810adbe789244f91',
'InstanceGroupList': '1.2-bebd07052779ae3b47311efe85428a8b',
'InstanceInfoCache': '1.5-ef64b604498bfa505a8c93747a9d8b2f',
'InstanceList': '1.6-78800140a5f9818ab00f8c052437655f',