Add tags table to nova driver
Straight forward change, backward compatible change to support microsegmentation use case. Useful for many other use cases. Change-Id: Ie7ef9bf39ab9992c9c39c0740a2f28c119c64bfc
This commit is contained in:
parent
8bdf2e6fa1
commit
b7b1a82f67
|
@ -13,6 +13,17 @@
|
|||
# under the License.
|
||||
#
|
||||
|
||||
"""Schema version history
|
||||
|
||||
version: 2.1
|
||||
date: 2017-10-01
|
||||
changes:
|
||||
- Added the tags table for server tags information.
|
||||
|
||||
version: 2.0
|
||||
Initial schema version.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
from __future__ import division
|
||||
from __future__ import absolute_import
|
||||
|
@ -35,6 +46,7 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver,
|
|||
HOSTS = "hosts"
|
||||
SERVICES = 'services'
|
||||
AVAILABILITY_ZONES = "availability_zones"
|
||||
TAGS = "tags"
|
||||
|
||||
# This is the most common per-value translator, so define it once here.
|
||||
value_trans = {'translation-type': 'VALUE'}
|
||||
|
@ -79,7 +91,16 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver,
|
|||
{'fieldname': 'OS-EXT-SRV-ATTR:hypervisor_hostname',
|
||||
'desc': ('The hostname of hypervisor where the server is '
|
||||
'running'),
|
||||
'col': 'host_name', 'translator': value_trans})}
|
||||
'col': 'host_name', 'translator': value_trans},
|
||||
{'fieldname': 'tags',
|
||||
'translator': {'translation-type': 'LIST',
|
||||
'table-name': TAGS,
|
||||
'parent-key': 'id',
|
||||
'parent-col-name': 'server_id',
|
||||
'parent-key-desc': 'UUID of server',
|
||||
'val-col': 'tag',
|
||||
'val-col-desc': 'server tag string',
|
||||
'translator': value_trans}})}
|
||||
|
||||
flavors_translator = {
|
||||
'translation-type': 'HDICT',
|
||||
|
|
|
@ -38,7 +38,7 @@ class NovaFakeClient(mock.MagicMock):
|
|||
self.availability_zones.list.return_value = self.get_zone_list()
|
||||
|
||||
def get_mock_server(self, id, name, host_id, status, tenant_id, user_id,
|
||||
flavor, image, zone=None, host_name=None):
|
||||
flavor, image, zone=None, host_name=None, tags=None):
|
||||
server = mock.MagicMock()
|
||||
server.id = id
|
||||
server.hostId = host_id
|
||||
|
@ -48,6 +48,7 @@ class NovaFakeClient(mock.MagicMock):
|
|||
server.name = name
|
||||
server.image = image
|
||||
server.flavor = flavor
|
||||
server.tags = tags if tags else []
|
||||
if zone is not None:
|
||||
setattr(server, 'OS-EXT-AZ:availability_zone', zone)
|
||||
else:
|
||||
|
@ -76,7 +77,8 @@ class NovaFakeClient(mock.MagicMock):
|
|||
'ACTIVE',
|
||||
'50e14867-7c64-4ec9-be8d-ed2470ca1d24',
|
||||
'33ea0494-2bdf-4382-a445-9068997430b9',
|
||||
{"id": 1}, {"id": 2}))
|
||||
{"id": 1}, {"id": 2},
|
||||
tags=['tag1', 'tag2']))
|
||||
|
||||
server_three = (
|
||||
self.get_mock_server(9012, 'sample-server3',
|
||||
|
@ -84,7 +86,8 @@ class NovaFakeClient(mock.MagicMock):
|
|||
'ACTIVE',
|
||||
'50e14867-7c64-4ec9-be8d-ed2470ca1d24',
|
||||
'33ea0494-2bdf-4382-a445-9068997430b9',
|
||||
{"id": 1}, {"id": 2}, 'foo', 'host2'))
|
||||
{"id": 1}, {"id": 2}, 'foo', 'host2',
|
||||
tags=['tag1', 'tag2', 'tag3']))
|
||||
|
||||
return [server_one, server_two, server_three]
|
||||
|
||||
|
|
|
@ -102,6 +102,17 @@ class TestNovaDriver(base.TestCase):
|
|||
self.assertEqual('foo', zone)
|
||||
self.assertEqual('host2', host_name)
|
||||
|
||||
server_tag_tuples = self.driver.state[self.driver.TAGS]
|
||||
|
||||
self.assertEqual(len(server_tag_tuples), 5)
|
||||
|
||||
self.assertIn((5678, 'tag1'), server_tag_tuples)
|
||||
self.assertIn((5678, 'tag2'), server_tag_tuples)
|
||||
|
||||
self.assertIn((9012, 'tag1'), server_tag_tuples)
|
||||
self.assertIn((9012, 'tag2'), server_tag_tuples)
|
||||
self.assertIn((9012, 'tag3'), server_tag_tuples)
|
||||
|
||||
def test_flavors(self):
|
||||
flavor_raw = self.nova.flavors.list(detailed=True)
|
||||
self.driver._translate_flavors(flavor_raw)
|
||||
|
|
Loading…
Reference in New Issue