From a2272b51bd9d255657f98847b89650ed070e367c Mon Sep 17 00:00:00 2001 From: tscogin Date: Mon, 12 Aug 2024 14:59:30 -0400 Subject: [PATCH 01/26] Add network name to labels for workload endpoints Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/endpoints.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/endpoints.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/endpoints.py index ca5b87b9192..40f6afd5f32 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/endpoints.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/endpoints.py @@ -54,6 +54,8 @@ PROJECT_NAME_LABEL_NAME = 'projectcalico.org/openstack-project-name' PROJECT_NAME_MAX_LENGTH = datamodel_v3.SANITIZE_LABEL_MAX_LENGTH PROJECT_PARENT_ID_LABEL_NAME = 'projectcalico.org/openstack-project-parent-id' +NETWORK_NAME_LABEL_NAME = 'projectcalico.org/openstack-network-name' +NETWORK_NAME_MAX_LENGTH = datamodel_v3.SANITIZE_LABEL_MAX_LENGTH # Note: Calico requires a label value to be an empty string, or to consist of # alphanumeric characters, '-', '_' or '.', starting and ending with an @@ -221,6 +223,23 @@ def get_floating_ips_for_port(self, context, port): ) ] + def get_network_name_for_port(self, context, port): + network = context.session.query( + models_v2.Network + ).filter_by( + id=port['network_id'] + ).first() + + try: + network_name = datamodel_v3.sanitize_label_name_value( + network['name'], + NETWORK_NAME_MAX_LENGTH, + ) + return network_name + except Exception: + LOG.warning(f"Failed to find network name for port {port['id']}") + return None + def add_extra_port_information(self, context, port): """add_extra_port_information @@ -236,6 +255,10 @@ def add_extra_port_information(self, context, port): port['security_groups'] = self.get_security_groups_for_port( context, port ) + port['network_name'] = self.get_network_name_for_port( + context, port + ) + self.add_port_gateways(port, context) self.add_port_interface_name(port) self.add_port_project_data(port, context) @@ -357,6 +380,9 @@ def endpoint_labels(port, namespace): labels[PROJECT_NAME_LABEL_NAME] = name labels[PROJECT_PARENT_ID_LABEL_NAME] = parent_id + network_name = port.get('network_name') + if network_name is not None: + labels[NETWORK_NAME_LABEL_NAME] = network_name return labels From ed22c36f1e69c07c0fb1ab2675b48fd8eca99539 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 19 Sep 2024 16:29:22 -0400 Subject: [PATCH 02/26] Add network name to test labels Signed-off-by: tscogin --- .../ml2/drivers/calico/test/test_plugin_etcd.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 53261021b10..17f230bbd82 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -449,7 +449,9 @@ def test_start_two_ports(self): 'projectcalico.org/openstack-project-id': 'jane3', 'projectcalico.org/openstack-project-name': 'pname_jane3', 'projectcalico.org/openstack-project-parent-id': 'gibson', - 'projectcalico.org/orchestrator': 'openstack' + 'projectcalico.org/orchestrator': 'openstack', + 'projectcalico.org/openstack-network-name': + 'calico-network-name' } }, 'spec': {'endpoint': 'DEADBEEF-1234-5678', @@ -484,7 +486,9 @@ def test_start_two_ports(self): 'projectcalico.org/openstack-project-id': 'jane3', 'projectcalico.org/openstack-project-name': 'pname_jane3', 'projectcalico.org/openstack-project-parent-id': 'gibson', - 'projectcalico.org/orchestrator': 'openstack' + 'projectcalico.org/orchestrator': 'openstack', + 'projectcalico.org/openstack-network-name': + 'calico-network-name' } }, 'spec': {'endpoint': 'FACEBEEF-1234-5678', @@ -619,7 +623,9 @@ def test_start_two_ports(self): 'projectcalico.org/openstack-project-id': 'jane3', 'projectcalico.org/openstack-project-name': 'pname_jane3', 'projectcalico.org/openstack-project-parent-id': 'gibson', - 'projectcalico.org/orchestrator': 'openstack' + 'projectcalico.org/orchestrator': 'openstack', + 'projectcalico.org/openstack-network-name': + 'calico-network-name' } }, 'spec': {'endpoint': 'HELLO-1234-5678', From a3bb8a748b47e5296ddc6d021d56a3685fe629a3 Mon Sep 17 00:00:00 2001 From: tscogin Date: Mon, 23 Sep 2024 13:53:44 -0400 Subject: [PATCH 03/26] Beginning of testing Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/lib.py | 27 +++++++++++++++++++ .../drivers/calico/test/test_plugin_etcd.py | 14 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py index 2677fb70a6d..22307c38de4 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py @@ -114,6 +114,14 @@ 'fixed_ip_address': '10.65.0.2', 'floating_ip_address': '192.168.0.1'}] +network1 = {'id': 'calico-network-id', + 'name': 'calico-network-name', + 'status': 'ACTIVE', + 'admin_state_up': True, + 'shared': True, + 'mtu': 9000, + 'project_id': 'jane3'} + class EtcdKeyNotFound(Exception): pass @@ -211,6 +219,9 @@ class Lib(object): # Subnets that the OpenStack database knows about. osdb_subnets = [] + # Networks that the OpenStack database knows about. + osdb_networks = [] + def setUp(self): # Announce the current test case. _log.info("TEST CASE: %s", self.id()) @@ -248,6 +259,10 @@ def setUp(self): self.db.get_subnet.side_effect = self.get_subnet self.db.get_subnets.side_effect = self.get_subnets + # Arrange DB's get_network and get_networks calls + self.db.get_network.side_effect = self.get_network + self.db.get_networks.side_effect = self.get_networks + # Arrange what the DB's get_security_groups query will return (the # default SG). self.db.get_security_groups.return_value = [ @@ -543,6 +558,18 @@ def get_subnets(self, context, filters=None): matches = [s for s in self.osdb_subnets] return matches + def get_network(self, context, id): + return self.get_networks(context, filters={'id': [id]})[0] + + def get_networks(self, context, filters=None): + if filters is None: + return self.osdb_networks + + assert list(filters.keys()) == ['id'] + allowed_ids = set(filters['id']) + + return [p for p in self.osdb_networks if p['id'] in allowed_ids] + def notify_security_group_update(self, id, rules, port, type): """Notify a new or changed security group definition.""" # Prep appropriate responses for next get_security_group and diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 17f230bbd82..4151223c534 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -923,6 +923,20 @@ def test_start_two_ports(self): 'port_range_min': 5060, 'port_range_max': 5060 } + # Change a small amount of information about the port and the network. + # Expect a resync to fix it up. + osdb_networks = [lib.network1] + ep_hello_value_v3['metadata']['labels'][ + 'projectcalico.org/openstack-network-name'] = 'new-network' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.assertEtcdWrites({ep_deadbeef_key_v3: ep_deadbeef_value_v3}) + self.assertEtcdDeletes(set()) + + # Change name of network + osdb_networks[0]['name'] = 'new-network' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.assertEtcdWrites({ep_deadbeef_key_v3: ep_deadbeef_value_v3}) + self.assertEtcdDeletes(set()) class TestPluginEtcd(TestPluginEtcdBase): From fb4d95eba0009bcf9c32b324b3f0fe399b0d81d5 Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 10:22:13 -0400 Subject: [PATCH 04/26] Try to set network before port Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 4151223c534..355b8d6a976 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -414,6 +414,7 @@ def make_context(self): def test_start_two_ports(self): """Startup with two existing ports but no existing etcd data.""" # Provide two Neutron ports. + self.osdb_networks = [lib.network1] self.osdb_ports = [lib.port1, lib.port2] # Allow the etcd transport's resync thread to run. @@ -925,7 +926,6 @@ def test_start_two_ports(self): } # Change a small amount of information about the port and the network. # Expect a resync to fix it up. - osdb_networks = [lib.network1] ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'new-network' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) From c7f5dc1b1bf766d1009f94bf6e1fd180716d2646 Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 14:16:01 -0400 Subject: [PATCH 05/26] Add query for network Signed-off-by: tscogin --- .../networking_calico/plugins/ml2/drivers/calico/test/lib.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py index 22307c38de4..3a31ef0ee37 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py @@ -613,6 +613,10 @@ def port_query(self, **kw): if fip['fixed_port_id'] == kw['fixed_port_id']: fips.append(fip) return fips + elif kw.get('id', None): + for network in self.osdb_networks: + if network['id'] == kw['id']: + return network else: raise Exception("port_query doesn't know how to handle kw=%r" % kw) From e5f1961bb76b1942f86185426c6fb060dc21cd6a Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 14:47:28 -0400 Subject: [PATCH 06/26] Mock network query return value Signed-off-by: tscogin --- .../networking_calico/plugins/ml2/drivers/calico/test/lib.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py index 3a31ef0ee37..c70568be31f 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py @@ -616,7 +616,9 @@ def port_query(self, **kw): elif kw.get('id', None): for network in self.osdb_networks: if network['id'] == kw['id']: - return network + network_mock = mock.MagicMock() + network_mock.first.return_value = network + return network_mock else: raise Exception("port_query doesn't know how to handle kw=%r" % kw) From 69aa510f4ea26123322f5f0c3a0faa013f47e69c Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 14:54:41 -0400 Subject: [PATCH 07/26] Use correct endpoint for test Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 355b8d6a976..855f6aa6034 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -929,13 +929,13 @@ def test_start_two_ports(self): ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'new-network' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_deadbeef_key_v3: ep_deadbeef_value_v3}) + self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) # Change name of network - osdb_networks[0]['name'] = 'new-network' + self.osdb_networks[0]['name'] = 'new-network' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_deadbeef_key_v3: ep_deadbeef_value_v3}) + self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) From 1f4ae2016bb9fa90041d93c18775ffc9bc6bfbf4 Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 15:23:13 -0400 Subject: [PATCH 08/26] Change network name back after assertion Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 855f6aa6034..8c99608e4ee 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -937,6 +937,8 @@ def test_start_two_ports(self): self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) + # Change it back + self.osdb_networks[0]['name'] = 'calico-network-name' class TestPluginEtcd(TestPluginEtcdBase): From ae1395d86b95271274c72b8902e770093fe293d3 Mon Sep 17 00:00:00 2001 From: tscogin Date: Wed, 25 Sep 2024 15:37:23 -0400 Subject: [PATCH 09/26] Move changes above state reset Signed-off-by: tscogin --- .../drivers/calico/test/test_plugin_etcd.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 8c99608e4ee..72dfaf6e7f9 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -899,6 +899,20 @@ def test_start_two_ports(self): self.assertEtcdWrites(expected_writes) self.assertEtcdDeletes(set()) + # Change a small amount of information about the port and the network. + # Expect a resync to fix it up. + ep_hello_value_v3['metadata']['labels'][ + 'projectcalico.org/openstack-network-name'] = 'new-network' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) + self.assertEtcdDeletes(set()) + + # Change name of network + self.osdb_networks[0]['name'] = 'new-network' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) + self.assertEtcdDeletes(set()) + # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips @@ -924,20 +938,7 @@ def test_start_two_ports(self): 'port_range_min': 5060, 'port_range_max': 5060 } - # Change a small amount of information about the port and the network. - # Expect a resync to fix it up. - ep_hello_value_v3['metadata']['labels'][ - 'projectcalico.org/openstack-network-name'] = 'new-network' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) - self.assertEtcdDeletes(set()) - # Change name of network - self.osdb_networks[0]['name'] = 'new-network' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) - self.assertEtcdDeletes(set()) - # Change it back self.osdb_networks[0]['name'] = 'calico-network-name' From 0a6b22ba8a6b63191ddbdaced39c1795098ddecb Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 09:58:46 -0400 Subject: [PATCH 10/26] Test changing networks Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/lib.py | 8 ++++++++ .../ml2/drivers/calico/test/test_plugin_etcd.py | 16 ++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py index c70568be31f..3cbf7e50f0f 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py @@ -122,6 +122,14 @@ 'mtu': 9000, 'project_id': 'jane3'} +network2 = {'id': 'calico-other-network-id', + 'name': 'my-first-network', + 'status': 'ACTIVE', + 'admin_state_up': True, + 'shared': True, + 'mtu': 9000, + 'project_id': 'jane3'} + class EtcdKeyNotFound(Exception): pass diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 72dfaf6e7f9..04eb4579997 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -899,6 +899,14 @@ def test_start_two_ports(self): self.assertEtcdWrites(expected_writes) self.assertEtcdDeletes(set()) + # Change network used + self.osdb_port[0]['network_id'] = 'calico-other-network-id' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + ep_hello_value_v3['metadata']['labels'][ + 'projectcalico.org/openstack-network-name'] = 'my-first-network' + self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) + self.assertEtcdDeletes(set()) + # Change a small amount of information about the port and the network. # Expect a resync to fix it up. ep_hello_value_v3['metadata']['labels'][ @@ -907,14 +915,11 @@ def test_start_two_ports(self): self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) - # Change name of network - self.osdb_networks[0]['name'] = 'new-network' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) - self.assertEtcdDeletes(set()) # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips + self.osdb_networks[0]['name'] = 'calico-network-name' + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.db.get_security_groups.return_value[-1] = { 'id': 'SG-1', @@ -939,7 +944,6 @@ def test_start_two_ports(self): 'port_range_max': 5060 } - self.osdb_networks[0]['name'] = 'calico-network-name' class TestPluginEtcd(TestPluginEtcdBase): From ce62d0bb74431b7399176f78087f5cf8fa41cbcd Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:02:56 -0400 Subject: [PATCH 11/26] *ports Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 04eb4579997..63bdc9b9a36 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -900,7 +900,7 @@ def test_start_two_ports(self): self.assertEtcdDeletes(set()) # Change network used - self.osdb_port[0]['network_id'] = 'calico-other-network-id' + self.osdb_ports[0]['network_id'] = 'calico-other-network-id' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' From d6f57d16d3270a6d0f0aef5e79382e2c39c31806 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:08:37 -0400 Subject: [PATCH 12/26] Add other network to db Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 63bdc9b9a36..5a936300fc9 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -414,7 +414,7 @@ def make_context(self): def test_start_two_ports(self): """Startup with two existing ports but no existing etcd data.""" # Provide two Neutron ports. - self.osdb_networks = [lib.network1] + self.osdb_networks = [lib.network1, lib.network2] self.osdb_ports = [lib.port1, lib.port2] # Allow the etcd transport's resync thread to run. @@ -918,7 +918,6 @@ def test_start_two_ports(self): # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips - self.osdb_networks[0]['name'] = 'calico-network-name' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.db.get_security_groups.return_value[-1] = { From 76742e3244f075183ea571a1f12bfc23e5383f7d Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:18:13 -0400 Subject: [PATCH 13/26] Add network id change Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 5a936300fc9..60cfff915d5 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -904,6 +904,9 @@ def test_start_two_ports(self): self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' + ep_hello_value_v3['metadata']['labels'][ + 'projectcalico.org/openstack-network-id'] = \ + 'calico-other-network-id' self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) From 481eac2ee851b18434eac7d2bf50aee048bd2b06 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:25:59 -0400 Subject: [PATCH 14/26] Change location of test Signed-off-by: tscogin --- .../ml2/drivers/calico/test/test_plugin_etcd.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 60cfff915d5..6853837ad4b 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -899,13 +899,17 @@ def test_start_two_ports(self): self.assertEtcdWrites(expected_writes) self.assertEtcdDeletes(set()) + # Reset the state for safety. + self.osdb_ports[0]['fixed_ips'] = old_ips + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + # Change network used self.osdb_ports[0]['network_id'] = 'calico-other-network-id' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' - ep_hello_value_v3['metadata']['labels'][ - 'projectcalico.org/openstack-network-id'] = \ + ep_hello_value_v3['metadata']['annotations'][ + 'openstack.projectcalico.org/network-id'] = \ 'calico-other-network-id' self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) @@ -918,11 +922,6 @@ def test_start_two_ports(self): self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) - - # Reset the state for safety. - self.osdb_ports[0]['fixed_ips'] = old_ips - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.db.get_security_groups.return_value[-1] = { 'id': 'SG-1', 'name': 'My first SG', From 705c439a119d96acc8c272b43c28b4561842686b Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:50:02 -0400 Subject: [PATCH 15/26] Try using update_port_postcommit Signed-off-by: tscogin --- .../ml2/drivers/calico/test/test_plugin_etcd.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 6853837ad4b..8740442e84e 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -899,13 +899,13 @@ def test_start_two_ports(self): self.assertEtcdWrites(expected_writes) self.assertEtcdDeletes(set()) - # Reset the state for safety. - self.osdb_ports[0]['fixed_ips'] = old_ips - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - # Change network used + context._port = lib.port3.copy() + context.original = lib.port3.copy() + context._port['network_id'] = 'calico-other-network-id' self.osdb_ports[0]['network_id'] = 'calico-other-network-id' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + # self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.driver.update_port_postcommit(context) ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' ep_hello_value_v3['metadata']['annotations'][ @@ -922,6 +922,10 @@ def test_start_two_ports(self): self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) self.assertEtcdDeletes(set()) + # Reset the state for safety. + self.osdb_ports[0]['fixed_ips'] = old_ips + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.db.get_security_groups.return_value[-1] = { 'id': 'SG-1', 'name': 'My first SG', From e918683e4d5c327ac50763278e3b264c32b15839 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 10:56:21 -0400 Subject: [PATCH 16/26] Allow changes to annotations Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 8740442e84e..bbcef665c3b 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -121,6 +121,9 @@ def etcd3gw_client_put(self, key, value, **kwargs): if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \ self.recent_writes[key]['metadata']['labels'] + elif 'annotations' in self.recent_writes[key]['metadata']: + existing_v3_metadata['annotations'] = \ + self.recent_writes[key]['metadata']['annotations'] self.assertEqual(existing_v3_metadata, self.recent_writes[key]['metadata']) # Now delete not-easily-predictable metadata fields from the data From 32814b39d06cf7805d8b2c316f66f666fc90f966 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 26 Sep 2024 11:33:38 -0400 Subject: [PATCH 17/26] Sanity check Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index bbcef665c3b..49f7cfa6941 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -118,12 +118,15 @@ def etcd3gw_client_put(self, key, value, **kwargs): # If this is an update, check that the metadata other than labels # is unchanged. if existing_v3_metadata: + _log.info("Current metadata %s", existing_v3_metadata) + _log.info("Recent writes: %s", self.recent_writes) if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \ self.recent_writes[key]['metadata']['labels'] elif 'annotations' in self.recent_writes[key]['metadata']: existing_v3_metadata['annotations'] = \ self.recent_writes[key]['metadata']['annotations'] + _log.info("metadata after", existing_v3_metadata) self.assertEqual(existing_v3_metadata, self.recent_writes[key]['metadata']) # Now delete not-easily-predictable metadata fields from the data From a7a6095ecc776deb71f41e7338d01a2b7bde2276 Mon Sep 17 00:00:00 2001 From: tscogin Date: Fri, 27 Sep 2024 14:30:00 +0000 Subject: [PATCH 18/26] Closer Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 49f7cfa6941..e0a823e7a49 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -906,11 +906,10 @@ def test_start_two_ports(self): self.assertEtcdDeletes(set()) # Change network used - context._port = lib.port3.copy() - context.original = lib.port3.copy() + _log.info("Change network used by endpoint HELLO") context._port['network_id'] = 'calico-other-network-id' self.osdb_ports[0]['network_id'] = 'calico-other-network-id' - # self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) + self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.driver.update_port_postcommit(context) ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' @@ -956,7 +955,6 @@ def test_start_two_ports(self): } - class TestPluginEtcd(TestPluginEtcdBase): # Tests for the Calico mechanism driver. This covers the mainline function # and the periodic resync thread. From 1bc7fe0be14a8fafd753242700356a2784cc9030 Mon Sep 17 00:00:00 2001 From: tscogin Date: Tue, 1 Oct 2024 10:38:23 -0400 Subject: [PATCH 19/26] Change annotations as well Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index e0a823e7a49..e72b1df8b00 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -123,10 +123,10 @@ def etcd3gw_client_put(self, key, value, **kwargs): if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \ self.recent_writes[key]['metadata']['labels'] - elif 'annotations' in self.recent_writes[key]['metadata']: + if 'annotations' in self.recent_writes[key]['metadata']: existing_v3_metadata['annotations'] = \ self.recent_writes[key]['metadata']['annotations'] - _log.info("metadata after", existing_v3_metadata) + _log.info("metadata after %s", existing_v3_metadata) self.assertEqual(existing_v3_metadata, self.recent_writes[key]['metadata']) # Now delete not-easily-predictable metadata fields from the data From 1575250e1d16e913b294ce57db72864bbc21235f Mon Sep 17 00:00:00 2001 From: tscogin Date: Tue, 1 Oct 2024 10:47:11 -0400 Subject: [PATCH 20/26] Reset port network id Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 1 + 1 file changed, 1 insertion(+) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index e72b1df8b00..000ec5a3930 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -929,6 +929,7 @@ def test_start_two_ports(self): # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips + self.osdb_ports[0]['network_id'] = 'calico-network-id' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.db.get_security_groups.return_value[-1] = { From 01c29d172a9373c854dacc172d821761e6ff3675 Mon Sep 17 00:00:00 2001 From: tscogin Date: Tue, 1 Oct 2024 15:12:48 +0000 Subject: [PATCH 21/26] Remove unneeded test and fix other test Signed-off-by: tscogin --- .../drivers/calico/test/test_plugin_etcd.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 000ec5a3930..3ba74a8065f 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -909,27 +909,24 @@ def test_start_two_ports(self): _log.info("Change network used by endpoint HELLO") context._port['network_id'] = 'calico-other-network-id' self.osdb_ports[0]['network_id'] = 'calico-other-network-id' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.driver.update_port_postcommit(context) + + # Expected changes ep_hello_value_v3['metadata']['labels'][ 'projectcalico.org/openstack-network-name'] = 'my-first-network' ep_hello_value_v3['metadata']['annotations'][ 'openstack.projectcalico.org/network-id'] = \ 'calico-other-network-id' - self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) - self.assertEtcdDeletes(set()) - - # Change a small amount of information about the port and the network. - # Expect a resync to fix it up. - ep_hello_value_v3['metadata']['labels'][ - 'projectcalico.org/openstack-network-name'] = 'new-network' - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) - self.assertEtcdWrites({ep_hello_key_v3: ep_hello_value_v3}) + + expected_writes = { + ep_hello_key_v3: ep_hello_value_v3, + sg_1_key_v3: sg_1_value_v3, + } + self.assertEtcdWrites(expected_writes) self.assertEtcdDeletes(set()) # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips - self.osdb_ports[0]['network_id'] = 'calico-network-id' self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.db.get_security_groups.return_value[-1] = { From e8c5cb8ce4adb39a71c5b4c5357401c2cfcffc23 Mon Sep 17 00:00:00 2001 From: tscogin Date: Tue, 1 Oct 2024 11:14:22 -0400 Subject: [PATCH 22/26] Whitespace Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 1 - 1 file changed, 1 deletion(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 3ba74a8065f..4d02ad316ff 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -917,7 +917,6 @@ def test_start_two_ports(self): ep_hello_value_v3['metadata']['annotations'][ 'openstack.projectcalico.org/network-id'] = \ 'calico-other-network-id' - expected_writes = { ep_hello_key_v3: ep_hello_value_v3, sg_1_key_v3: sg_1_value_v3, From 2046d110676b8a9aee7ea4bb3e2e805c011977c1 Mon Sep 17 00:00:00 2001 From: tscogin Date: Tue, 1 Oct 2024 11:16:52 -0400 Subject: [PATCH 23/26] Cleanup Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 4d02ad316ff..5c07bc2359c 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -118,15 +118,12 @@ def etcd3gw_client_put(self, key, value, **kwargs): # If this is an update, check that the metadata other than labels # is unchanged. if existing_v3_metadata: - _log.info("Current metadata %s", existing_v3_metadata) - _log.info("Recent writes: %s", self.recent_writes) if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \ self.recent_writes[key]['metadata']['labels'] if 'annotations' in self.recent_writes[key]['metadata']: existing_v3_metadata['annotations'] = \ self.recent_writes[key]['metadata']['annotations'] - _log.info("metadata after %s", existing_v3_metadata) self.assertEqual(existing_v3_metadata, self.recent_writes[key]['metadata']) # Now delete not-easily-predictable metadata fields from the data @@ -926,7 +923,6 @@ def test_start_two_ports(self): # Reset the state for safety. self.osdb_ports[0]['fixed_ips'] = old_ips - self.simulated_time_advance(mech_calico.RESYNC_INTERVAL_SECS) self.db.get_security_groups.return_value[-1] = { 'id': 'SG-1', From 8ab151a0d5ef2a07f8ecf1d8853862f2b41babd6 Mon Sep 17 00:00:00 2001 From: tscogin Date: Thu, 3 Oct 2024 14:42:27 -0400 Subject: [PATCH 24/26] Change port_query to more generic db_query Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/lib.py | 9 ++++++--- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py index 3cbf7e50f0f..809cb903e84 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/lib.py @@ -256,7 +256,7 @@ def setUp(self): self.db_context = mech_calico.ctx.get_admin_context() self.db_context.to_dict.return_value = {} self.db_context.session.query.return_value.filter_by.side_effect = ( - self.port_query + self.db_query ) # Arrange what the DB's get_ports will return. @@ -610,17 +610,20 @@ def get_port_security_group_bindings(self, context, filters): return [b for b in self.port_security_group_bindings if b['port_id'] in allowed_ids] - def port_query(self, **kw): + def db_query(self, **kw): + # 'port_id' query key for IPAllocations if kw.get('port_id', None): for port in self.osdb_ports: if port['id'] == kw['port_id']: return port['fixed_ips'] + # 'fixed_port_id query key for FloatingIPs elif kw.get('fixed_port_id', None): fips = [] for fip in floating_ports: if fip['fixed_port_id'] == kw['fixed_port_id']: fips.append(fip) return fips + # 'id' query key for Networks elif kw.get('id', None): for network in self.osdb_networks: if network['id'] == kw['id']: @@ -628,7 +631,7 @@ def port_query(self, **kw): network_mock.first.return_value = network return network_mock else: - raise Exception("port_query doesn't know how to handle kw=%r" % kw) + raise Exception("db_query doesn't know how to handle kw=%r" % kw) return None diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 5c07bc2359c..486e31acc4d 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -526,7 +526,7 @@ def test_start_two_ports(self): context = self.make_context() context._port = lib.port1 context._plugin_context.session.query.return_value.filter_by.\ - side_effect = self.port_query + side_effect = self.db_query self.driver.delete_port_postcommit(context) self.assertEtcdWrites({}) self.assertEtcdDeletes(set([ep_deadbeef_key_v3])) From 66e5821dc490c74ed6e284d35144e9a15d9c2844 Mon Sep 17 00:00:00 2001 From: tscogin Date: Fri, 4 Oct 2024 12:23:19 -0400 Subject: [PATCH 25/26] Update comment about metadata change Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index 486e31acc4d..f9aaa4ffc21 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -116,7 +116,7 @@ def etcd3gw_client_put(self, key, value, **kwargs): if 'metadata' in self.recent_writes[key]: # If this is an update, check that the metadata other than labels - # is unchanged. + # and annotations is unchanged. if existing_v3_metadata: if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \ From ade5c19a39ead6cf4143abe29544b184edaa2cc1 Mon Sep 17 00:00:00 2001 From: tscogin Date: Fri, 4 Oct 2024 12:24:35 -0400 Subject: [PATCH 26/26] Commas Signed-off-by: tscogin --- .../plugins/ml2/drivers/calico/test/test_plugin_etcd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py index f9aaa4ffc21..52fcd79f73b 100644 --- a/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py +++ b/networking-calico/networking_calico/plugins/ml2/drivers/calico/test/test_plugin_etcd.py @@ -115,8 +115,8 @@ def etcd3gw_client_put(self, key, value, **kwargs): self.recent_writes[key] = value if 'metadata' in self.recent_writes[key]: - # If this is an update, check that the metadata other than labels - # and annotations is unchanged. + # If this is an update, check that the metadata, other than labels + # and annotations, is unchanged. if existing_v3_metadata: if 'labels' in self.recent_writes[key]['metadata']: existing_v3_metadata['labels'] = \