Пример #1
0
    def create(self, context, lb):
        lb_size = self._get_lb_flavor_size(context, lb.flavor_id)
        edge_id = lb_common.get_lbaas_edge_id(
            context, self.core_plugin, lb.id, lb.vip_address, lb.vip_subnet_id,
            lb.tenant_id, lb_size)

        if not edge_id:
            msg = _('Failed to allocate Edge on subnet %(sub)s for '
                    'loadbalancer %(lb)s') % {'sub': lb.vip_subnet_id,
                                              'lb': lb.id}
            raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)

        try:
            lb_common.enable_edge_acceleration(self.vcns, edge_id)

            edge_fw_rule_id = lb_common.add_vip_fw_rule(
                self.vcns, edge_id, lb.id, lb.vip_address)

            # set LB default rule
            lb_common.set_lb_firewall_default_rule(self.vcns, edge_id,
                                                   'accept')

            nsxv_db.add_nsxv_lbaas_loadbalancer_binding(
                context.session, lb.id, edge_id, edge_fw_rule_id,
                lb.vip_address)
            self.lbv2_driver.load_balancer.successful_completion(context, lb)

        except nsxv_exc.VcnsApiException:
            with excutils.save_and_reraise_exception():
                self.lbv2_driver.load_balancer.failed_completion(context, lb)
                LOG.error('Failed to create pool %s', lb.id)
Пример #2
0
    def delete(self, context, lb):
        # Discard any ports which are associated with LB
        filters = {
            'device_id': [lb.id],
            'device_owner': [constants.DEVICE_OWNER_NEUTRON_PREFIX + 'LB']
        }
        lb_ports = self.core_plugin.get_ports(context.elevated(),
                                              filters=filters)
        for lb_port in lb_ports:
            self.core_plugin.delete_port(context.elevated(), lb_port['id'])

        binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb.id)
        if binding:
            edge_binding = nsxv_db.get_nsxv_router_binding_by_edge(
                context.session, binding['edge_id'])

            # set LB default rule
            lb_common.set_lb_firewall_default_rule(self.vcns,
                                                   binding['edge_id'], 'deny')
            if edge_binding:
                old_lb = lb_common.is_lb_on_router_edge(
                    context, self.core_plugin, binding['edge_id'])
                if not old_lb:
                    resource_id = lb_common.get_lb_resource_id(lb.id)
                    self.core_plugin.edge_manager.delete_lrouter(context,
                                                                 resource_id,
                                                                 dist=False)
                else:
                    # Edge was created on an exclusive router with the old code
                    try:
                        lb_common.del_vip_fw_rule(self.vcns,
                                                  binding['edge_id'],
                                                  binding['edge_fw_rule_id'])
                    except nsxv_exc.VcnsApiException as e:
                        LOG.error(
                            'Failed to delete loadbalancer %(lb)s '
                            'FW rule. exception is %(exc)s', {
                                'lb': lb.id,
                                'exc': e
                            })
                    try:
                        lb_common.del_vip_as_secondary_ip(
                            self.vcns, binding['edge_id'], lb.vip_address)
                    except Exception as e:
                        LOG.error(
                            'Failed to delete loadbalancer %(lb)s '
                            'interface IP. exception is %(exc)s', {
                                'lb': lb.id,
                                'exc': e
                            })

            nsxv_db.del_nsxv_lbaas_loadbalancer_binding(context.session, lb.id)
        self.lbv2_driver.load_balancer.successful_completion(context,
                                                             lb,
                                                             delete=True)
Пример #3
0
    def create(self, context, lb, completor):
        sub_id = lb['vip_subnet_id']
        if cfg.CONF.nsxv.use_routers_as_lbaas_platform:
            edge_id = lb_common.get_lbaas_edge_id_for_subnet(
                context, self.core_plugin, sub_id, lb['tenant_id'])
            if not edge_id:
                msg = _('No suitable Edge found for subnet %s') % sub_id
                raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)
        else:
            lb_size = self._get_lb_flavor_size(context, lb.get('flavor_id'))
            edge_id = lb_common.get_lbaas_edge_id(context, self.core_plugin,
                                                  lb['id'], lb['vip_address'],
                                                  sub_id, lb['tenant_id'],
                                                  lb_size)

        if not edge_id:
            msg = _('Failed to allocate Edge on subnet %(sub)s for '
                    'loadbalancer %(lb)s') % {
                        'sub': sub_id,
                        'lb': lb['id']
                    }
            raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)

        try:
            if cfg.CONF.nsxv.use_routers_as_lbaas_platform:
                if not nsxv_db.get_nsxv_lbaas_loadbalancer_binding_by_edge(
                        context.session, edge_id):
                    lb_common.enable_edge_acceleration(self.vcns, edge_id)
                lb_common.add_vip_as_secondary_ip(self.vcns, edge_id,
                                                  lb['vip_address'])
            else:
                lb_common.enable_edge_acceleration(self.vcns, edge_id)

            edge_fw_rule_id = lb_common.add_vip_fw_rule(
                self.vcns, edge_id, lb['id'], lb['vip_address'])

            # set LB default rule
            if not cfg.CONF.nsxv.use_routers_as_lbaas_platform:
                lb_common.set_lb_firewall_default_rule(self.vcns, edge_id,
                                                       'accept')

            nsxv_db.add_nsxv_lbaas_loadbalancer_binding(
                context.session, lb['id'], edge_id, edge_fw_rule_id,
                lb['vip_address'])
            completor(success=True)

        except nsxv_exc.VcnsApiException:
            with excutils.save_and_reraise_exception():
                completor(success=False)
                LOG.error('Failed to create loadbalancer %s', lb['id'])