From 1c236b5ed2b43e190326d0f875a7b8e65f9639c3 Mon Sep 17 00:00:00 2001 From: Rudra Rugge Date: Thu, 12 May 2016 09:56:17 -0700 Subject: [PATCH] Port tuple list modification during iip udpate Copy the list of instance-ip uuids from vmi so that any modification in the iterations does not cause set change size issues. Also fix issue with reseting of service-chain-ip flag. Change-Id: I9332bc371cd4d7534d488e76186e930c4bfe1ccb Closes-Bug: 1581118 Closes-bug: 1548920 --- .../svc-monitor/svc_monitor/port_tuple.py | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/config/svc-monitor/svc_monitor/port_tuple.py b/src/config/svc-monitor/svc_monitor/port_tuple.py index 9c5dc008b20..986bffb8037 100644 --- a/src/config/svc-monitor/svc_monitor/port_tuple.py +++ b/src/config/svc-monitor/svc_monitor/port_tuple.py @@ -26,7 +26,7 @@ class PortTupleAgent(Agent): def __init__(self, svc_mon, vnc_lib, cassandra, config_section, logger): super(PortTupleAgent, self).__init__(svc_mon, vnc_lib, cassandra, config_section) - self._logger = logger + self.logger = logger def handle_service_type(self): return 'port-tuple' @@ -88,7 +88,7 @@ def set_port_service_health_check(self, port, vmi): 'service-health-check', health_id, None, 'ADD') vmi.update() # handle deletes - for health_id in vmi.service_health_checks: + for health_id in list(vmi.service_health_checks): if health_id in port['service-health-checks']: continue self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid, @@ -104,7 +104,7 @@ def set_port_static_routes(self, port, vmi): 'interface-route-table', irt_id, None, 'ADD') vmi.update() # handle deletes - for irt_id in vmi.interface_route_tables: + for irt_id in list(vmi.interface_route_tables): if irt_id in port['interface-route-tables']: continue self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid, @@ -112,34 +112,37 @@ def set_port_static_routes(self, port, vmi): vmi.update() def update_secondary_iip(self, vmi): - for iip_id in vmi.instance_ips: + for iip_id in list(vmi.instance_ips): iip = InstanceIpSM.get(iip_id) - if not iip or not iip.instance_ip_secondary: + if not iip: + continue + if not iip.instance_ip_secondary or not iip.service_instance_ip: continue update = False - iip_obj = InstanceIp() - iip_obj.name = iip.name - iip_obj.uuid = iip.uuid - if vmi.aaps and len(vmi.aaps): if iip.secondary_tracking_ip != vmi.aaps[0]['ip']: - iip_obj.set_secondary_ip_tracking_ip(vmi.aaps[0]['ip']) - update = True - if iip.instance_ip_mode != vmi.aaps[0].get('address_mode', 'active-standby'): - iip_obj.set_instance_ip_mode(vmi.aaps[0].get('address_mode', 'active-standby')) + tracking_ip = vmi.aaps[0]['ip'] + ip_mode = vmi.aaps[0].get('address_mode', 'active-standby') update = True else: if iip.secondary_tracking_ip: - iip_obj.set_secondary_ip_tracking_ip(None) - update = True - if iip.instance_ip_mode != 'active-active': - iip_obj.set_instance_ip_mode('active-active') + tracking_ip = None + ip_mode = 'active-active' update = True - if update: + if not update: + continue + + try: + iip_obj = self._vnc_lib.instance_ip_read(id=iip.uuid) + iip_obj.set_secondary_ip_tracking_ip(tracking_ip) + iip_obj.set_instance_ip_mode(ip_mode) self._vnc_lib.instance_ip_update(iip_obj) - iip.update(iip_obj.serialize_to_json()) + iip.update() + except NoIdError: + self.logger.error("Instance IP %s update failed" % (iip.name)) + continue def set_port_allowed_address_pairs(self, port, vmi, vmi_obj): if not port['allowed-address-pairs'] or \ @@ -172,7 +175,7 @@ def delete_shared_iip(self, iip): return if iip.service_instance: return - for vmi_id in iip.virtual_machine_interfaces: + for vmi_id in list(iip.virtual_machine_interfaces): self._vnc_lib.ref_update('instance-ip', iip.uuid, 'virtual-machine-interface', vmi_id, None, 'DELETE') @@ -180,6 +183,7 @@ def delete_shared_iip(self, iip): self._vnc_lib.instance_ip_delete(id=iip.uuid) InstanceIpSM.delete(iip.uuid) except NoIdError: + self.logger.error("Instance IP %s delete failed" % (iip.name)) return def delete_old_vmi_links(self, vmi): @@ -191,14 +195,14 @@ def delete_old_vmi_links(self, vmi): 'virtual-machine-interface', vmi.uuid, None, 'DELETE') vmi.instance_ips.remove(iip_id) - for irt_id in vmi.interface_route_tables: + for irt_id in list(vmi.interface_route_tables): irt = InterfaceRouteTableSM.get(irt_id) if irt and irt.service_instance: self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid, 'interface-route-table', irt.uuid, None, 'DELETE') vmi.interface_route_tables.remove(irt_id) - for health_id in vmi.service_health_checks: + for health_id in list(vmi.service_health_checks): health = ServiceHealthCheckSM.get(health_id) if health and health.service_instance: self._vnc_lib.ref_update('virtual-machine-interface', vmi.uuid,