diff --git a/congress/datasources/nova_driver.py b/congress/datasources/nova_driver.py index 98ccaed2a..624138e79 100644 --- a/congress/datasources/nova_driver.py +++ b/congress/datasources/nova_driver.py @@ -15,6 +15,11 @@ """Schema change history +date: 2018-10-18 +changes: + + - Added the `servers.addresses` table for server address information. + date: 2018-03-15 changes: @@ -53,6 +58,7 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, HYPERVISORS = "hypervisors" SERVICES = 'services' AVAILABILITY_ZONES = "availability_zones" + ADDRESSES = SERVERS + ".addresses" TAGS = "tags" value_trans_str = ds_utils.typed_value_trans(data_types.Str) @@ -67,6 +73,14 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, except Exception: return str(x) + def extract_addresses(addresses): + addresses_list = [] + for network_name, net_detail in addresses.items(): + for address in net_detail: + address['network_name'] = network_name + addresses_list.append(address) + return addresses_list + servers_translator = { 'translation-type': 'HDICT', 'table-name': SERVERS, @@ -100,6 +114,37 @@ class NovaDriver(datasource_driver.PollingDataSourceDriver, 'desc': ('The hostname of hypervisor where the server is ' 'running'), 'col': 'host_name', 'translator': value_trans_str}, + {'fieldname': 'addresses', + 'translator': {'translation-type': 'HDICT', + 'table-name': ADDRESSES, + 'parent-key': 'id', + 'parent-col-name': 'server_id', + 'parent-key-desc': 'UUID of server', + 'objects-extract-fn': extract_addresses, + 'selector-type': 'DICT_SELECTOR', + 'in-list': True, + 'field-translators': + ({'fieldname': 'network_name', + 'desc': ('Name of attached network to ' + 'server'), + 'translator': value_trans_str}, + {'fieldname': 'addr', + 'desc': 'IP address of the server', + 'col': 'address', + 'translator': value_trans_str}, + {'fieldname': 'version', + 'desc': ('Internet Protocol Version of ' + 'network'), + 'translator': value_trans_int}, + {'fieldname': 'OS-EXT-IPS-MAC:mac_addr', + 'desc': ('MAC address associated to the ' + 'IP of the server'), + 'col': 'mac_address', + 'translator': value_trans_str}, + {'fieldname': 'OS-EXT-IPS:type', + 'desc': 'IP address type', + 'col': 'address_type', + 'translator': value_trans_str})}}, {'fieldname': 'tags', 'translator': {'translation-type': 'LIST', 'table-name': TAGS, diff --git a/congress/tests/datasources/fakes.py b/congress/tests/datasources/fakes.py index 6a57ba45c..3d32001bb 100644 --- a/congress/tests/datasources/fakes.py +++ b/congress/tests/datasources/fakes.py @@ -110,7 +110,8 @@ 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, tags=None): + flavor, image, zone=None, host_name=None, + addresses=None, tags=None): server = mock.MagicMock() server.id = id server.hostId = host_id @@ -120,6 +121,7 @@ class NovaFakeClient(mock.MagicMock): server.name = name server.image = image server.flavor = flavor + server.addresses = addresses if addresses else {} server.tags = tags if tags else [] if zone is not None: setattr(server, 'OS-EXT-AZ:availability_zone', zone) @@ -141,7 +143,12 @@ class NovaFakeClient(mock.MagicMock): 'BUILD', '50e14867-7c64-4ec9-be8d-ed2470ca1d24', '33ea0494-2bdf-4382-a445-9068997430b9', - {"id": "1"}, {"id": "2"}, 'default', 'host1')) + {"id": "1"}, {"id": "2"}, 'default', 'host1', + {'net_mgmt': [{ + 'addr': '192.168.0.60', + 'version': 4, + 'OS-EXT-IPS-MAC:mac_addr': '11:11:11:11', + 'OS-EXT-IPS:type': 'fixed'}]})) server_two = ( self.get_mock_server('5678', 'sample-server2', @@ -150,6 +157,7 @@ class NovaFakeClient(mock.MagicMock): '50e14867-7c64-4ec9-be8d-ed2470ca1d24', '33ea0494-2bdf-4382-a445-9068997430b9', {"id": "1"}, {"id": "2"}, + addresses={'net1': []}, tags=['tag1', 'tag2'])) server_three = ( diff --git a/congress/tests/datasources/test_nova_driver.py b/congress/tests/datasources/test_nova_driver.py index cb55a15de..98c1a195c 100644 --- a/congress/tests/datasources/test_nova_driver.py +++ b/congress/tests/datasources/test_nova_driver.py @@ -113,6 +113,12 @@ class TestNovaDriver(base.TestCase): self.assertIn(('9012', 'tag2'), server_tag_tuples) self.assertIn(('9012', 'tag3'), server_tag_tuples) + server_addresses_tuples = self.driver.state[self.driver.ADDRESSES] + self.assertEqual(len(server_addresses_tuples), 1) + self.assertIn(('1234', 'net_mgmt', '192.168.0.60', 4, '11:11:11:11', + 'fixed'), + server_addresses_tuples) + def test_flavors(self): flavor_raw = self.nova.flavors.list(detailed=True) self.driver._translate_flavors(flavor_raw) diff --git a/releasenotes/notes/nova-servers-addresses-table-c1b7c4afa4c29c28.yaml b/releasenotes/notes/nova-servers-addresses-table-c1b7c4afa4c29c28.yaml new file mode 100644 index 000000000..aa973c1d9 --- /dev/null +++ b/releasenotes/notes/nova-servers-addresses-table-c1b7c4afa4c29c28.yaml @@ -0,0 +1,8 @@ +--- +prelude: > +features: + - | + The new table servers.addresses will be available under + Congress driver for Nova. Which will consist of fields namely, + server_id, network_name, address, version, mac_address and + address_type.