From a1d39a2132cdf85bc1eaa49212d596a4097aefb0 Mon Sep 17 00:00:00 2001
From: Brian Haley <haleyb.dev@gmail.com>
Date: Wed, 13 Mar 2024 18:58:35 -0400
Subject: [PATCH] Increase code coverage for OVN metadata agent

Add test for _get_instance_and_project_id() that returns
two ports, a failure path.

TrivialFix

Change-Id: Ic731ae612b73d09dcd01d20c4a3d439471d4b1e2
---
 .../unit/agent/ovn/metadata/test_server.py    | 42 ++++++++++++++++---
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/neutron/tests/unit/agent/ovn/metadata/test_server.py b/neutron/tests/unit/agent/ovn/metadata/test_server.py
index be165b5c94a..f3f730f6ca4 100644
--- a/neutron/tests/unit/agent/ovn/metadata/test_server.py
+++ b/neutron/tests/unit/agent/ovn/metadata/test_server.py
@@ -28,7 +28,7 @@ from neutron.conf.agent.metadata import config as meta_conf
 from neutron.tests import base
 
 OvnPortInfo = collections.namedtuple(
-        'OvnPortInfo', ['external_ids', 'chassis', 'mac'])
+        'OvnPortInfo', ['external_ids', 'chassis', 'mac', 'uuid'])
 
 
 class ConfFixture(config_fixture.Config):
@@ -44,6 +44,8 @@ class TestMetadataProxyHandler(base.BaseTestCase):
         self.useFixture(self.fake_conf_fixture)
         self.log_p = mock.patch.object(proxy_base, 'LOG')
         self.log = self.log_p.start()
+        self.agent_log_p = mock.patch.object(agent, 'LOG')
+        self.agent_log = self.agent_log_p.start()
         self.handler = agent.MetadataProxyHandler(self.fake_conf, 'chassis1',
                                                   mock.Mock())
         self.handler._post_fork_event.set()
@@ -77,7 +79,7 @@ class TestMetadataProxyHandler(base.BaseTestCase):
             self.assertEqual(len(self.log.mock_calls), 2)
 
     def _get_instance_and_project_id_helper(self, forwarded_for, ports,
-                                            mac=None):
+                                            mac=None, all_ports=False):
         network_id = 'the_id'
         headers = {
             'X-Forwarded-For': forwarded_for,
@@ -87,6 +89,8 @@ class TestMetadataProxyHandler(base.BaseTestCase):
         req = mock.Mock(headers=headers)
 
         def mock_get_network_port_bindings_by_ip(*args, **kwargs):
+            if all_ports:
+                return ports
             return ports.pop(0)
 
         self.handler.sb_idl.get_network_port_bindings_by_ip.side_effect = (
@@ -107,7 +111,8 @@ class TestMetadataProxyHandler(base.BaseTestCase):
             external_ids={'neutron:device_id': 'device_id',
                           'neutron:project_id': 'project_id'},
             chassis=['chassis1'],
-            mac=mac)
+            mac=mac,
+            uuid=1)
         ports = [[ovn_port]]
 
         self.assertEqual(
@@ -122,7 +127,8 @@ class TestMetadataProxyHandler(base.BaseTestCase):
             external_ids={'neutron:device_id': 'device_id',
                           'neutron:project_id': 'project_id'},
             chassis=['chassis1'],
-            mac=mac)
+            mac=mac,
+            uuid=1)
         ports = [[ovn_port]]
 
         self.assertEqual(
@@ -138,7 +144,8 @@ class TestMetadataProxyHandler(base.BaseTestCase):
             external_ids={'neutron:device_id': 'device_id',
                           'neutron:project_id': 'project_id'},
             chassis=['chassis1'],
-            mac=forwarded_mac)
+            mac=forwarded_mac,
+            uuid=1)
         ports = [[ovn_port]]
 
         # IPv6 and link-local, the MAC will be passed
@@ -156,6 +163,31 @@ class TestMetadataProxyHandler(base.BaseTestCase):
         observed = self._get_instance_and_project_id_helper(forwarded_for,
                                                             ports)
         self.assertEqual(expected, observed)
+        self.assertEqual(len(self.agent_log.mock_calls), 1)
+
+    def test_get_instance_id_network_id_too_many(self):
+        forwarded_for = '192.168.1.1'
+        mac = 'fa:16:3e:12:34:56'
+        ovn_port_1 = OvnPortInfo(
+            external_ids={'neutron:device_id': 'device_id',
+                          'neutron:project_id': 'project_id'},
+            chassis=['chassis1'],
+            mac=mac,
+            uuid=1)
+        ovn_port_2 = OvnPortInfo(
+            external_ids={'neutron:device_id': 'device_id',
+                          'neutron:project_id': 'project_id'},
+            chassis=['chassis2'],
+            mac=mac,
+            uuid=2)
+        ports = [ovn_port_1, ovn_port_2]
+
+        expected = (None, None)
+        observed = self._get_instance_and_project_id_helper(forwarded_for,
+                                                            ports,
+                                                            all_ports=True)
+        self.assertEqual(expected, observed)
+        self.assertEqual(len(self.agent_log.mock_calls), 1)
 
 
 class TestUnixDomainMetadataProxy(base.BaseTestCase):