diff options
author | Kobi Samoray <ksamoray@vmware.com> | 2019-08-27 13:49:05 +0300 |
---|---|---|
committer | Kobi Samoray <ksamoray@vmware.com> | 2020-01-28 14:35:52 +0200 |
commit | 31773715687326c92d4ad46ebb32b14645bbc614 (patch) | |
tree | 17f5ab0af228629e6b8091066c47393670bb6636 /nova/tests/unit/test_metadata.py | |
parent | 80539a5e849bf8ec1239f0ed01433a7f8a54015b (diff) | |
download | nova-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.py | 57 |
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): |