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:
Eric Kao 2017-10-02 15:46:01 -07:00
parent 8bdf2e6fa1
commit b7b1a82f67
3 changed files with 39 additions and 4 deletions

View File

@ -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',

View File

@ -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]

View File

@ -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)