summaryrefslogtreecommitdiff
path: root/nova/tests/unit/test_metadata.py
diff options
context:
space:
mode:
authorKobi Samoray <ksamoray@vmware.com>2019-08-27 13:49:05 +0300
committerKobi Samoray <ksamoray@vmware.com>2020-01-28 14:35:52 +0200
commit31773715687326c92d4ad46ebb32b14645bbc614 (patch)
tree17f5ab0af228629e6b8091066c47393670bb6636 /nova/tests/unit/test_metadata.py
parent80539a5e849bf8ec1239f0ed01433a7f8a54015b (diff)
downloadnova-31773715687326c92d4ad46ebb32b14645bbc614.tar.gz
Avoid fetching metadata when no subnets found
Metadata service uses the provider id to identify the requesting instance. However, when provider query doesn't find any networks, the request should fail. The same goes to the case where multiple ports are found. Closes-Bug: #1841933 Change-Id: I8ce3703ca86a3a0769edd42a790d82796d1071d7
Diffstat (limited to 'nova/tests/unit/test_metadata.py')
-rw-r--r--nova/tests/unit/test_metadata.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py
index fc00ee7dac..fc33561991 100644
--- a/nova/tests/unit/test_metadata.py
+++ b/nova/tests/unit/test_metadata.py
@@ -1579,6 +1579,63 @@ class MetadataHandlerTestCase(test.TestCase):
'X-Metadata-Provider-Signature': signature})
self.assertEqual(403, response.status_int)
+ @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
+ def test_metadata_lb_net_not_found(self, mock_get_client):
+
+ self.flags(service_metadata_proxy=True, group='neutron')
+
+ # with X-Metadata-Provider
+ proxy_lb_id = 'edge-x'
+ mock_client = mock_get_client.return_value
+ mock_client.list_ports.return_value = {
+ 'ports': [{'device_id': 'a-b-c-d', 'tenant_id': 'test'}]}
+ mock_client.list_subnets.return_value = {
+ 'subnets': []}
+
+ response = fake_request(
+ self, self.mdinst,
+ relpath="/2009-04-04/user-data",
+ address="192.192.192.2",
+ fake_get_metadata_by_instance_id=self._fake_x_get_metadata,
+ headers={'X-Forwarded-For': '192.192.192.2',
+ 'X-Metadata-Provider': proxy_lb_id})
+ self.assertEqual(400, response.status_int)
+
+ def _test_metadata_lb_incorrect_port_count(self, mock_get_client, ports):
+
+ self.flags(service_metadata_proxy=True, group='neutron')
+
+ # with X-Metadata-Provider
+ proxy_lb_id = 'edge-x'
+ mock_client = mock_get_client.return_value
+ mock_client.list_ports.return_value = {'ports': ports}
+ mock_client.list_ports.return_value = {
+ 'ports': [{'device_id': 'a-b-c-d', 'tenant_id': 'test'},
+ {'device_id': 'x-y-z', 'tenant_id': 'test'}]}
+ mock_client.list_subnets.return_value = {
+ 'subnets': [{'network_id': 'f-f-f-f'}]}
+
+ response = fake_request(
+ self, self.mdinst,
+ relpath="/2009-04-04/user-data",
+ address="192.192.192.2",
+ fake_get_metadata_by_instance_id=self._fake_x_get_metadata,
+ headers={'X-Forwarded-For': '192.192.192.2',
+ 'X-Metadata-Provider': proxy_lb_id})
+ self.assertEqual(400, response.status_int)
+
+ @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
+ def test_metadata_lb_too_many_ports(self, mock_get_client):
+ self._test_metadata_lb_incorrect_port_count(
+ mock_get_client,
+ [{'device_id': 'a-b-c-d', 'tenant_id': 'test'},
+ {'device_id': 'x-y-z', 'tenant_id': 'test'}])
+
+ @mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
+ def test_metadata_no_ports_found(self, mock_get_client):
+ self._test_metadata_lb_incorrect_port_count(
+ mock_get_client, [])
+
@mock.patch.object(context, 'get_admin_context')
@mock.patch('nova.network.neutron.API')
def test_get_metadata_by_address(self, mock_net_api, mock_get_context):