def _update_loadbalancer_props(self, lb_id): lb = LoadbalancerSM.get(lb_id) if lb is None: msg = ('Unable to retrieve loadbalancer %s' % lb_id) self._svc_manager.logger.error(msg) return driver_data = self.db.loadbalancer_driver_info_get(lb_id) if driver_data: if 'lb_instance_ips' in driver_data: lb.instance_ips = driver_data['lb_instance_ips'] if 'lb_floating_ips' in driver_data: lb.floating_ips = driver_data['lb_floating_ips'] vmi = VirtualMachineInterfaceSM.get(lb.virtual_machine_interface) if vmi is None: return if set(lb.instance_ips) == vmi.instance_ips and \ set(lb.floating_ips) == vmi.floating_ips: return old_instance_ips = [] new_instance_ips = [] if set(lb.instance_ips) != vmi.instance_ips: for iip_id in lb.instance_ips or []: if iip_id not in vmi.instance_ips: old_instance_ips.append(iip_id) for iip_id in vmi.instance_ips or []: if iip_id not in lb.instance_ips: new_instance_ips.append(iip_id) old_floating_ips = [] new_floating_ips = [] if set(lb.floating_ips) != vmi.floating_ips: for fip_id in lb.floating_ips or []: if fip_id not in vmi.floating_ips: old_floating_ips.append(fip_id) for fip_id in vmi.floating_ips or []: if fip_id not in lb.floating_ips: new_floating_ips.append(fip_id) for iip_id in old_instance_ips or []: fip = self._get_floating_ip(vmi, iip_id=iip_id) if fip: fip.set_virtual_machine_interface_list([]) self._api.floating_ip_update(fip) self._api.floating_ip_delete(id=fip.uuid) for fip_id in old_floating_ips or []: fip = self._get_floating_ip(fip_id=fip_id) if fip: fip.set_virtual_machine_interface_list([]) fip.set_floating_ip_port_mappings([]) fip.floating_ip_port_mappings_enable = False fip.floating_ip_traffic_direction = "both" self._api.floating_ip_update(fip) if len(new_instance_ips): proj_obj = None if vmi.parent_type == 'project': proj_obj = self._api.project_read(id=vmi.parent_key) for iip_id in new_instance_ips: iip = self._api.instance_ip_read(id=iip_id) fq_name = str(uuid.uuid4()) fip = FloatingIp(name=fq_name, parent_obj=iip, floating_ip_address=iip.instance_ip_address) fip.uuid = fq_name fip.floating_ip_traffic_direction = "ingress" if proj_obj: fip.add_project(proj_obj) self._api.floating_ip_create(fip) if len(new_floating_ips): for fip_id in new_floating_ips: fip = self._get_floating_ip(fip_id=fip_id) fip.floating_ip_traffic_direction = "ingress" fip.floating_ip_fixed_ip_address = None self._api.floating_ip_update(fip) lb_props = {} lb_props['old_instance_ips'] = old_instance_ips lb_props['old_floating_ips'] = old_floating_ips lb_props['new_instance_ips'] = new_instance_ips lb_props['new_floating_ips'] = new_floating_ips self._update_pool_member_props(lb, lb_props) lb.instance_ips = vmi.instance_ips lb.floating_ips = vmi.floating_ips driver_data = {} driver_data['vmi'] = vmi.uuid driver_data['lb_instance_ips'] = list(lb.instance_ips) driver_data['lb_floating_ips'] = list(lb.floating_ips) self.db.loadbalancer_driver_info_insert(lb_id, driver_data)
def _update_loadbalancer_props(self, lb_id): lb = LoadbalancerSM.get(lb_id) if lb is None: msg = ('Unable to retrieve loadbalancer %s' % lb_id) self._svc_manager.logger.error(msg) return driver_data = self.db.loadbalancer_driver_info_get(lb_id) if driver_data: if 'lb_instance_ips' in driver_data: lb.instance_ips = driver_data['lb_instance_ips'] if 'lb_floating_ips' in driver_data: lb.floating_ips = driver_data['lb_floating_ips'] vmi = VirtualMachineInterfaceSM.get(lb.virtual_machine_interface) if vmi is None: return if set(lb.instance_ips) == vmi.instance_ips and \ set(lb.floating_ips) == vmi.floating_ips: return old_instance_ips = [] new_instance_ips = [] if set(lb.instance_ips) != vmi.instance_ips: for iip_id in lb.instance_ips or []: if iip_id not in vmi.instance_ips: old_instance_ips.append(iip_id) for iip_id in vmi.instance_ips or []: if iip_id not in lb.instance_ips: new_instance_ips.append(iip_id) old_floating_ips = [] new_floating_ips = [] if set(lb.floating_ips) != vmi.floating_ips: for fip_id in lb.floating_ips or []: if fip_id not in vmi.floating_ips: old_floating_ips.append(fip_id) for fip_id in vmi.floating_ips or []: if fip_id not in lb.floating_ips: new_floating_ips.append(fip_id) for iip_id in old_instance_ips or []: fip = self._get_floating_ip(vmi, iip_id=iip_id) if fip: fip.set_virtual_machine_interface_list([]) self._api.floating_ip_update(fip) self._api.floating_ip_delete(id=fip.uuid) for fip_id in old_floating_ips or []: fip = self._get_floating_ip(fip_id=fip_id) if fip: fip.set_virtual_machine_interface_list([]) fip.set_floating_ip_port_mappings([]) fip.floating_ip_port_mappings_enable = False fip.floating_ip_traffic_direction = "both" self._api.floating_ip_update(fip) if len(new_instance_ips): proj_obj = None if vmi.parent_type == 'project': proj_obj = self._api.project_read(id=vmi.parent_key) for iip_id in new_instance_ips: iip = self._api.instance_ip_read(id=iip_id) fq_name = str(uuid.uuid4()) fip = FloatingIp(name=fq_name, parent_obj=iip, floating_ip_address=iip.instance_ip_address) fip.uuid = fq_name fip.floating_ip_traffic_direction = "ingress" if proj_obj: fip.add_project(proj_obj) self._api.floating_ip_create(fip) if len(new_floating_ips): for fip_id in new_floating_ips: fip = self._get_floating_ip(fip_id=fip_id) fip.floating_ip_traffic_direction = "ingress" fip.floating_ip_fixed_ip_address = None self._api.floating_ip_update(fip) lb_props = {} lb_props['old_instance_ips'] = old_instance_ips lb_props['old_floating_ips'] = old_floating_ips lb_props['new_instance_ips'] = new_instance_ips lb_props['new_floating_ips'] = new_floating_ips self._update_pool_member_props(lb, lb_props) lb.instance_ips = vmi.instance_ips lb.floating_ips = vmi.floating_ips driver_data = {} driver_data['vmi'] = vmi.uuid driver_data['lb_instance_ips'] = list(lb.instance_ips) driver_data['lb_floating_ips'] = list(lb.floating_ips) self.db.loadbalancer_driver_info_insert(lb_id, driver_data)