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)
Example #2
0
    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)