Add name property to protectable instances model

Change-Id: I98f47a1aec2994a040a9ffa0c4fed251a99426c5
This commit is contained in:
chenying 2016-04-06 16:11:25 +08:00
parent 4a19ec75a9
commit cb46d5496a
11 changed files with 79 additions and 56 deletions

View File

@ -74,6 +74,7 @@ class ProtectableViewBuilder(common.ViewBuilder):
'instance': {
'id': instance.get('id'),
'type': instance.get('type'),
'name': instance.get('name'),
'dependent_resources': instance.get('dependent_resources'),
}
}

View File

@ -12,4 +12,4 @@
from collections import namedtuple
Resource = namedtuple("Resource", ('type', 'id'))
Resource = namedtuple("Resource", ('type', 'id', 'name'))

View File

@ -223,7 +223,7 @@ class ProtectionManager(manager.Manager):
result = []
for resource in resource_instances:
result.append(dict(id=resource.id))
result.append(dict(id=resource.id, name=resource.name))
return result
@ -235,7 +235,8 @@ class ProtectionManager(manager.Manager):
{'type': protectable_type,
'id': protectable_id})
parent_resource = Resource(type=protectable_type, id=protectable_id)
parent_resource = Resource(type=protectable_type, id=protectable_id,
name="")
try:
dependent_resources = \
@ -250,7 +251,8 @@ class ProtectionManager(manager.Manager):
result = []
for resource in dependent_resources:
result.append(dict(type=resource.type, id=resource.id))
result.append(dict(type=resource.type, id=resource.id,
name=resource.name))
return result

View File

@ -58,7 +58,7 @@ class ImageProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=image.id)
id=image.id, name=image.name)
for image in images]
def _get_dependent_resources_by_server(self, parent_resource):
@ -71,7 +71,8 @@ class ImageProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=server.image['id'])]
id=server.image['id'],
name=server.image['name'])]
def _get_dependent_resources_by_project(self, parent_resource):
try:
@ -83,7 +84,8 @@ class ImageProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=image.id)
id=image.id,
name=image.name)
for image in images
if image.owner == parent_resource.id]

View File

@ -55,7 +55,8 @@ class ServerProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=server.id)
id=server.id,
name=server.name)
for server in servers]
def get_dependent_resources(self, parent_resource):

View File

@ -57,7 +57,7 @@ class VolumeProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=vol.id)
id=vol.id, name=vol.name)
for vol in volumes]
def get_dependent_resources(self, parent_resource):
@ -79,5 +79,5 @@ class VolumeProtectablePlugin(protectable_plugin.ProtectablePlugin):
reason=six.text_type(e))
else:
return [resource.Resource(type=self._SUPPORT_RESOURCE_TYPE,
id=vol.id)
id=vol.id, name=vol.name)
for vol in volumes if _is_attached_to(vol)]

View File

@ -23,9 +23,11 @@ from smaug.tests import base
CONF = cfg.CONF
image_info = namedtuple('image_info', field_names=['id', 'owner'])
server_info = namedtuple('server_info', field_names=['id', 'type', 'image'])
project_info = namedtuple('project_info', field_names=['id', 'type'])
image_info = namedtuple('image_info', field_names=['id', 'owner', 'name'])
server_info = namedtuple('server_info', field_names=['id', 'type', 'name',
'image'])
project_info = namedtuple('project_info', field_names=['id', 'type', 'name'])
class ImageProtectablePluginTest(base.TestCase):
@ -79,33 +81,36 @@ class ImageProtectablePluginTest(base.TestCase):
def test_list_resources(self):
plugin = ImageProtectablePlugin(self._context)
plugin._glance_client.images.list = mock.MagicMock(return_value=[
image_info('123', 'abcd'),
image_info('456', 'efgh'),
image_info(id='123', name='name123', owner='abcd'),
image_info(id='456', name='name456', owner='efgh'),
])
self.assertEqual(plugin.list_resources(),
[resource.Resource(type=constants.IMAGE_RESOURCE_TYPE,
id='123'),
id='123', name='name123'),
resource.Resource(type=constants.IMAGE_RESOURCE_TYPE,
id='456')
id='456', name='name456')
])
def test_get_server_dependent_resources(self):
vm = server_info(id='server1',
type=constants.SERVER_RESOURCE_TYPE,
image=dict(id='123'))
name='nameserver1',
image=dict(id='123', name='name123'))
plugin = ImageProtectablePlugin(self._context)
plugin._nova_client.servers.get = mock.MagicMock(return_value=vm)
self.assertEqual(plugin.get_dependent_resources(vm),
[resource.Resource(type=constants.IMAGE_RESOURCE_TYPE,
id='123')])
id='123', name='name123')])
def test_get_project_dependent_resources(self):
project = project_info(id='abcd', type=constants.PROJECT_RESOURCE_TYPE)
project = project_info(id='abcd', type=constants.PROJECT_RESOURCE_TYPE,
name='nameabcd')
plugin = ImageProtectablePlugin(self._context)
plugin._glance_client.images.list = mock.MagicMock(return_value=[
image_info('123', 'abcd'),
image_info('456', 'efgh'),
image_info('123', 'abcd', 'nameabcd'),
image_info('456', 'efgh', 'nameefgh'),
])
self.assertEqual(plugin.get_dependent_resources(project),
[resource.Resource(type=constants.IMAGE_RESOURCE_TYPE,
name='nameabcd',
id='123')])

View File

@ -63,20 +63,22 @@ class ServerProtectablePluginTest(base.TestCase):
plugin = ServerProtectablePlugin(self._context)
plugin._client.servers.list = mock.MagicMock()
server_info = collections.namedtuple('server_info', ['id'])
plugin._client.servers.list.return_value = [server_info('123'),
server_info('456')]
self.assertEqual([Resource('OS::Nova::Server', '123'),
Resource('OS::Nova::Server', '456')],
server_info = collections.namedtuple('server_info', ['id', 'name'])
plugin._client.servers.list.return_value = [
server_info(id='123', name='name123'),
server_info(id='456', name='name456')]
self.assertEqual([Resource('OS::Nova::Server', '123', 'name123'),
Resource('OS::Nova::Server', '456', 'name456')],
plugin.list_resources())
def test_get_dependent_resources(self):
plugin = ServerProtectablePlugin(self._context)
plugin._client.servers.list = mock.MagicMock()
server_info = collections.namedtuple('server_info', ['id'])
plugin._client.servers.list.return_value = [server_info('123'),
server_info('456')]
self.assertEqual([Resource('OS::Nova::Server', '123'),
Resource('OS::Nova::Server', '456')],
server_info = collections.namedtuple('server_info', ['id', 'name'])
plugin._client.servers.list.return_value = [
server_info(id='123', name='name123'),
server_info(id='456', name='name456')]
self.assertEqual([Resource('OS::Nova::Server', '123', 'name123'),
Resource('OS::Nova::Server', '456', 'name456')],
plugin.get_dependent_resources(None))

View File

@ -22,8 +22,8 @@ from smaug.services.protection.protectable_plugins.volume \
from smaug.tests import base
project_info = namedtuple('project_info', field_names=['id', 'type'])
vol_info = namedtuple('vol_info', ['id', 'attachments'])
project_info = namedtuple('project_info', field_names=['id', 'type', 'name'])
vol_info = namedtuple('vol_info', ['id', 'attachments', 'name'])
class VolumeProtectablePluginTest(base.TestCase):
@ -67,28 +67,31 @@ class VolumeProtectablePluginTest(base.TestCase):
plugin = VolumeProtectablePlugin(self._context)
plugin._client.volumes.list = mock.MagicMock()
plugin._client.volumes.list.return_value = [vol_info('123', []),
vol_info('456', [])]
self.assertEqual([Resource('OS::Cinder::Volume', '123'),
Resource('OS::Cinder::Volume', '456')],
plugin._client.volumes.list.return_value = [vol_info('123', [],
'name123'),
vol_info('456', [],
'name456')]
self.assertEqual([Resource('OS::Cinder::Volume', '123', 'name123'),
Resource('OS::Cinder::Volume', '456', 'name456')],
plugin.list_resources())
def test_get_server_dependent_resources(self):
plugin = VolumeProtectablePlugin(self._context)
plugin._client.volumes.list = mock.MagicMock()
attached = [{'server_id': 'abcdef'}]
attached = [{'server_id': 'abcdef', 'name': 'name'}]
plugin._client.volumes.list.return_value = [
vol_info('123', attached),
vol_info('456', []),
vol_info('123', attached, 'name123'),
vol_info('456', [], 'name456'),
]
self.assertEqual([Resource('OS::Cinder::Volume', '123')],
self.assertEqual([Resource('OS::Cinder::Volume', '123', 'name123')],
plugin.get_dependent_resources(Resource(
"OS::Nova::Server", 'abcdef'
"OS::Nova::Server", 'abcdef', 'name'
)))
def test_get_project_dependent_resources(self):
project = project_info('abcd', constants.PROJECT_RESOURCE_TYPE)
project = project_info('abcd', constants.PROJECT_RESOURCE_TYPE,
'nameabcd')
plugin = VolumeProtectablePlugin(self._context)
plugin._client.volumes.list = mock.MagicMock()
@ -98,7 +101,9 @@ class VolumeProtectablePluginTest(base.TestCase):
]
setattr(volumes[0], 'os-vol-tenant-attr:tenant_id', 'abcd')
setattr(volumes[1], 'os-vol-tenant-attr:tenant_id', 'efgh')
setattr(volumes[0], 'name', 'name123')
setattr(volumes[1], 'name', 'name456')
plugin._client.volumes.list.return_value = volumes
self.assertEqual(plugin.get_dependent_resources(project),
[Resource('OS::Cinder::Volume', '123')])
[Resource('OS::Cinder::Volume', '123', 'name123')])

View File

@ -61,27 +61,32 @@ class ProtectionServiceTest(base.TestCase):
'list_resources')
def test_list_protectable_instances(self, mocker):
mocker.return_value = [Resource(type='OS::Nova::Server',
id='123456'),
id='123456',
name='name123'),
Resource(type='OS::Nova::Server',
id='654321')]
id='654321',
name='name654')]
fake_cntx = mock.MagicMock()
result = self.pro_manager.list_protectable_instances(
fake_cntx, 'OS::Nova::Server')
self.assertEqual([{'id': '123456'},
{'id': '654321'}], result)
self.assertEqual([{'id': '123456', 'name': 'name123'},
{'id': '654321', 'name': 'name654'}],
result)
@mock.patch.object(protectable_registry.ProtectableRegistry,
'fetch_dependent_resources')
def test_list_protectable_dependents(self, mocker):
mocker.return_value = [Resource(type='OS::Cinder::Volume',
id='123456'),
id='123456', name='name123'),
Resource(type='OS::Cinder::Volume',
id='654321')]
id='654321', name='name654')]
fake_cntx = mock.MagicMock()
result = self.pro_manager.list_protectable_dependents(
fake_cntx, 'fake_id', 'OS::Nova::Server')
self.assertEqual([{'type': 'OS::Cinder::Volume', 'id': '123456'},
{'type': 'OS::Cinder::Volume', 'id': '654321'}],
self.assertEqual([{'type': 'OS::Cinder::Volume', 'id': '123456',
'name': 'name123'},
{'type': 'OS::Cinder::Volume', 'id': '654321',
'name': 'name654'}],
result)

View File

@ -50,9 +50,9 @@ class ProtectableRegistryTest(base.TestCase):
self.protectable_registry.register_plugin(self._fake_plugin)
def test_graph_building(self):
A = Resource(_FAKE_TYPE, "A")
B = Resource(_FAKE_TYPE, "B")
C = Resource(_FAKE_TYPE, "C")
A = Resource(_FAKE_TYPE, "A", 'nameA')
B = Resource(_FAKE_TYPE, "B", 'nameB')
C = Resource(_FAKE_TYPE, "C", 'nameC')
test_matrix = (
(
{A: [B],