From dd5d3f4037860ca986b57dc86ebd1b1e573f8fb0 Mon Sep 17 00:00:00 2001 From: Joon-Myung Kang Date: Sat, 14 Nov 2015 21:00:39 -0800 Subject: [PATCH] Add host_name information into nova driver The user specifies a policy for both server and host and their hierarchical relationship. In the current nova driver, there is no mapping information between them. The implemented host_name is a host name of hypervisor which VM is running. Closes-Bug: #1515576 Change-Id: Ib05685f9449c46f069a2d2dffce9af558107846b --- congress/datasources/nova_driver.py | 6 +++++- congress/tests/datasources/fakes.py | 12 +++++++++--- congress/tests/datasources/test_nova_driver.py | 4 ++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/congress/datasources/nova_driver.py b/congress/datasources/nova_driver.py index 66c1063dd..ef88a92f0 100644 --- a/congress/datasources/nova_driver.py +++ b/congress/datasources/nova_driver.py @@ -76,7 +76,11 @@ class NovaDriver(datasource_driver.DataSourceDriver, 'extract-fn': safe_id}}, {'fieldname': 'OS-EXT-AZ:availability_zone', 'col': 'zone', 'desc': 'The availability zone of host', - 'translator': value_trans})} + 'translator': value_trans}, + {'fieldname': 'OS-EXT-SRV-ATTR:hypervisor_hostname', + 'desc': ('The hostname of hypervisor where the server is' + + 'running'), + 'col': 'host_name', 'translator': value_trans})} flavors_translator = { 'translation-type': 'HDICT', diff --git a/congress/tests/datasources/fakes.py b/congress/tests/datasources/fakes.py index f63e450d1..3a9af8cb7 100644 --- a/congress/tests/datasources/fakes.py +++ b/congress/tests/datasources/fakes.py @@ -34,7 +34,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): + flavor, image, zone=None, host_name=None): server = mock.MagicMock() server.id = id server.hostId = host_id @@ -49,6 +49,12 @@ class NovaFakeClient(mock.MagicMock): else: # This ensures that the magic mock raises an AttributeError delattr(server, 'OS-EXT-AZ:availability_zone') + if host_name is not None: + setattr(server, 'OS-EXT-SRV-ATTR:hypervisor_hostname', + host_name) + else: + # This ensures that the magic mock raises an AttributeError + delattr(server, 'OS-EXT-SRV-ATTR:hypervisor_hostname') return server def get_server_list(self): @@ -58,7 +64,7 @@ class NovaFakeClient(mock.MagicMock): 'BUILD', '50e14867-7c64-4ec9-be8d-ed2470ca1d24', '33ea0494-2bdf-4382-a445-9068997430b9', - {"id": 1}, {"id": 2}, 'default')) + {"id": 1}, {"id": 2}, 'default', 'host1')) server_two = ( self.get_mock_server(5678, 'sample-server2', @@ -74,7 +80,7 @@ class NovaFakeClient(mock.MagicMock): 'ACTIVE', '50e14867-7c64-4ec9-be8d-ed2470ca1d24', '33ea0494-2bdf-4382-a445-9068997430b9', - {"id": 1}, {"id": 2}, 'foo')) + {"id": 1}, {"id": 2}, 'foo', 'host2')) return [server_one, server_two, server_three] diff --git a/congress/tests/datasources/test_nova_driver.py b/congress/tests/datasources/test_nova_driver.py index eefa78d5e..59de1a497 100644 --- a/congress/tests/datasources/test_nova_driver.py +++ b/congress/tests/datasources/test_nova_driver.py @@ -57,6 +57,7 @@ class TestNovaDriver(base.TestCase): image_id = t[6] flavor_id = t[7] zone = t[8] + host_name = t[9] self.assertIn(id, [1234, 5678, 9012]) # see congress.datasources.tests.unit.fakes for actual values if id == 1234: @@ -70,6 +71,7 @@ class TestNovaDriver(base.TestCase): self.assertEqual(2, image_id) self.assertEqual(1, flavor_id) self.assertEqual('default', zone) + self.assertEqual('host1', host_name) elif id == 5678: self.assertEqual("sample-server2", name) @@ -82,6 +84,7 @@ class TestNovaDriver(base.TestCase): self.assertEqual(2, image_id) self.assertEqual(1, flavor_id) self.assertEqual('None', zone) + self.assertEqual('None', host_name) elif id == 9012: self.assertEqual("sample-server3", name) @@ -94,6 +97,7 @@ class TestNovaDriver(base.TestCase): self.assertEqual(2, image_id) self.assertEqual(1, flavor_id) self.assertEqual('foo', zone) + self.assertEqual('host2', host_name) def test_flavors(self): flavor_raw = self.nova.flavors.list(detailed=True)