示例#1
0
    def update(self, context, old_member, new_member):
        listener = new_member.pool.listener
        lb_id = listener.loadbalancer_id
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, new_member.pool_id)

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']

        edge_member = {
            'ipAddress': new_member.address,
            'weight': new_member.weight,
            'port': new_member.protocol_port,
            'monitorPort': new_member.protocol_port,
            'name': lb_common.get_member_id(new_member.id),
            'condition': 'enabled' if new_member.admin_state_up else 'disabled'
        }

        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            if edge_pool.get('member'):
                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(new_member.id):
                        edge_pool['member'][i] = edge_member
                        break

                try:
                    self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)

                    self.lbv2_driver.member.successful_completion(
                        context, new_member)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        self.lbv2_driver.member.failed_completion(
                            context, new_member)
                        LOG.error(_LE('Failed to update member on edge: %s'),
                                  edge_id)
            else:
                LOG.error(
                    _LE('Pool %(pool_id)s on Edge %(edge_id)s has no '
                        'members to update') % {
                            'pool_id': new_member.pool.id,
                            'edge_id': edge_id
                        })
    def delete_member(self, context, member, pool_mapping):
        LOG.debug('Deleting member %s', member)

        if pool_mapping:
            with locking.LockManager.get_lock(pool_mapping['edge_id']):
                edge_pool = self.vcns.get_pool(
                    pool_mapping['edge_id'],
                    pool_mapping['edge_pool_id'])[1]

                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(member['id']):
                        edge_pool['member'].pop(i)
                        break

                try:
                    self.vcns.update_pool(pool_mapping['edge_id'],
                                          pool_mapping['edge_pool_id'],
                                          edge_pool)
                    member_ips = self._get_pool_member_ips(
                        context, member['pool_id'], 'del', member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'], pool_mapping['edge_id'],
                        self._get_lbaas_fw_section_id(), member_ips)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        self.lbv1_driver.member_failed(context, member)
                        LOG.error(_LE('Failed to update member on edge: %s'),
                                  pool_mapping['edge_id'])

        lb_plugin = self._get_lb_plugin()
        lb_plugin._delete_db_member(context, member['id'])
示例#3
0
    def delete(self, context, member):
        listener = member.pool.listener
        lb_id = listener.loadbalancer_id
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, listener.id, member.pool_id)

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']

        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member.id):
                    edge_pool['member'].pop(i)
                    break

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)

                self.lbv2_driver.member.successful_completion(
                    context, member, delete=True)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv2_driver.member.failed_completion(context, member)
                    LOG.error(_LE('Failed to delete member on edge: %s'),
                              edge_id)
    def delete_member(self, context, member, pool_mapping):
        LOG.debug('Deleting member %s', member)

        if pool_mapping:
            with locking.LockManager.get_lock(pool_mapping['edge_id']):
                edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
                                               pool_mapping['edge_pool_id'])[1]

                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(member['id']):
                        edge_pool['member'].pop(i)
                        break

                try:
                    self.vcns.update_pool(pool_mapping['edge_id'],
                                          pool_mapping['edge_pool_id'],
                                          edge_pool)
                    member_ips = self._get_pool_member_ips(
                        context, member['pool_id'], 'del', member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'], pool_mapping['edge_id'],
                        self._get_lbaas_fw_section_id(), member_ips)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        self.lbv1_driver.member_failed(context, member)
                        LOG.error(_LE('Failed to update member on edge: %s'),
                                  pool_mapping['edge_id'])

        lb_plugin = self._get_lb_plugin()
        lb_plugin._delete_db_member(context, member['id'])
示例#5
0
    def update(self, context, old_member, new_member):
        listener = new_member.pool.listener
        lb_id = listener.loadbalancer_id
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(context.session,
                                                           lb_id, listener.id,
                                                           new_member.pool_id)

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']

        edge_member = {
            'ipAddress': new_member.address,
            'weight': new_member.weight,
            'port': new_member.protocol_port,
            'monitorPort': new_member.protocol_port,
            'name': lb_common.get_member_id(new_member.id),
            'condition':
                'enabled' if new_member.admin_state_up else 'disabled'}

        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            if edge_pool.get('member'):
                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(new_member.id):
                        edge_pool['member'][i] = edge_member
                        break

                try:
                    self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)

                    self.lbv2_driver.member.successful_completion(
                        context, new_member)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        self.lbv2_driver.member.failed_completion(
                            context, new_member)
                        LOG.error(_LE('Failed to update member on edge: %s'),
                                  edge_id)
            else:
                LOG.error(_LE('Pool %(pool_id)s on Edge %(edge_id)s has no '
                              'members to update')
                          % {'pool_id': new_member.pool.id,
                             'edge_id': edge_id})
示例#6
0
    def delete(self, context, member, completor):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member['pool_id'])
        edge_id = lb_binding['edge_id']

        old_lb = lb_common.is_lb_on_router_edge(
            context, self.core_plugin, edge_id)

        with locking.LockManager.get_lock(edge_id):
            if not cfg.CONF.nsxv.use_routers_as_lbaas_platform:
                # we should remove LB subnet interface if no members are
                # attached and this is not the LB's VIP interface
                remove_interface = True
                pool = member['pool']
                subnet_id = member['subnet_id']
                if subnet_id == pool['loadbalancer']['vip_subnet_id']:
                    remove_interface = False
                else:
                    for m in pool['members']:
                        if (m['subnet_id'] == subnet_id and
                            m['id'] != member['id']):
                            remove_interface = False
                if remove_interface:
                    lb_common.delete_lb_interface(context, self.core_plugin,
                                                  lb_id, subnet_id)

                if not pool_binding:
                    completor(success=True)
                    return

            edge_pool_id = pool_binding['edge_pool_id']
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member['id']):
                    edge_pool['member'].pop(i)
                    break

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                if old_lb:
                    member_ips = self._get_pool_member_ips(member['pool'],
                                                           'del',
                                                           member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'],
                        edge_id,
                        self._get_lbaas_fw_section_id(),
                        member_ips)

                completor(success=True)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    completor(success=False)
                    LOG.error('Failed to delete member on edge: %s', edge_id)
示例#7
0
    def create(self, context, member, completor):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        edge_id = lb_binding['edge_id']

        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member['pool_id'])
        if not pool_binding:
            completor(success=False)
            msg = _('Failed to create member on edge: %s. '
                    'Binding not found') % edge_id
            LOG.error(msg)
            raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)

        edge_pool_id = pool_binding['edge_pool_id']
        old_lb = lb_common.is_lb_on_router_edge(context, self.core_plugin,
                                                edge_id)
        with locking.LockManager.get_lock(edge_id):
            if not cfg.CONF.nsxv.use_routers_as_lbaas_platform and not old_lb:
                # Verify that Edge appliance is connected to the member's
                # subnet (only if this is a dedicated loadbalancer edge)
                if not lb_common.get_lb_interface(context, self.core_plugin,
                                                  lb_id, member['subnet_id']):
                    lb_common.create_lb_interface(context, self.core_plugin,
                                                  lb_id, member['subnet_id'],
                                                  member['tenant_id'])

            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]
            edge_member = {
                'ipAddress': member['address'],
                'weight': member['weight'],
                'port': member['protocol_port'],
                'monitorPort': member['protocol_port'],
                'name': lb_common.get_member_id(member['id']),
                'condition':
                'enabled' if member['admin_state_up'] else 'disabled'
            }

            if edge_pool.get('member'):
                edge_pool['member'].append(edge_member)
            else:
                edge_pool['member'] = [edge_member]

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                completor(success=True)

                if old_lb:
                    member_ips = self._get_pool_member_ips(
                        member['pool'], 'add', member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'], edge_id,
                        self._get_lbaas_fw_section_id(), member_ips)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    completor(success=False)
                    LOG.error('Failed to create member on edge: %s', edge_id)
示例#8
0
    def update(self, context, old_member, new_member, completor):
        lb_id = self._get_pool_lb_id(new_member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, new_member['pool_id'])

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']

        edge_member = {
            'ipAddress': new_member['address'],
            'weight': new_member['weight'],
            'port': new_member['protocol_port'],
            'monitorPort': new_member['protocol_port'],
            'name': lb_common.get_member_id(new_member['id']),
            'condition':
            'enabled' if new_member['admin_state_up'] else 'disabled'
        }

        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            if edge_pool.get('member'):
                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(new_member['id']):
                        edge_pool['member'][i] = edge_member
                        break

                try:
                    self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                    completor(success=True)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        completor(success=False)
                        LOG.error('Failed to update member on edge: %s',
                                  edge_id)
            else:
                LOG.error(
                    'Pool %(pool_id)s on Edge %(edge_id)s has no '
                    'members to update', {
                        'pool_id': new_member['pool']['id'],
                        'edge_id': edge_id
                    })
示例#9
0
    def delete(self, context, member, completor):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member['pool_id'])
        edge_id = lb_binding['edge_id']

        old_lb = lb_common.is_lb_on_router_edge(context, self.core_plugin,
                                                edge_id)

        with locking.LockManager.get_lock(edge_id):
            if not cfg.CONF.nsxv.use_routers_as_lbaas_platform:
                # we should remove LB subnet interface if no members are
                # attached and this is not the LB's VIP interface
                remove_interface = True
                pool = member['pool']
                subnet_id = member['subnet_id']
                if subnet_id == pool['loadbalancer']['vip_subnet_id']:
                    remove_interface = False
                else:
                    for m in pool['members']:
                        if (m['subnet_id'] == subnet_id
                                and m['id'] != member['id']):
                            remove_interface = False
                if remove_interface:
                    lb_common.delete_lb_interface(context, self.core_plugin,
                                                  lb_id, subnet_id)

                if not pool_binding:
                    completor(success=True)
                    return

            edge_pool_id = pool_binding['edge_pool_id']
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member['id']):
                    edge_pool['member'].pop(i)
                    break

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                if old_lb:
                    member_ips = self._get_pool_member_ips(
                        member['pool'], 'del', member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'], edge_id,
                        self._get_lbaas_fw_section_id(), member_ips)

                completor(success=True)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    completor(success=False)
                    LOG.error('Failed to delete member on edge: %s', edge_id)
示例#10
0
    def update(self, context, old_member, new_member, completor):
        lb_id = self._get_pool_lb_id(new_member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, new_member['pool_id'])

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']

        edge_member = {
            'ipAddress': new_member['address'],
            'weight': new_member['weight'],
            'port': new_member['protocol_port'],
            'monitorPort': new_member['protocol_port'],
            'name': lb_common.get_member_id(new_member['id']),
            'condition':
                'enabled' if new_member['admin_state_up'] else 'disabled'}

        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            if edge_pool.get('member'):
                for i, m in enumerate(edge_pool['member']):
                    if m['name'] == lb_common.get_member_id(new_member['id']):
                        edge_pool['member'][i] = edge_member
                        break

                try:
                    self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                    completor(success=True)

                except nsxv_exc.VcnsApiException:
                    with excutils.save_and_reraise_exception():
                        completor(success=False)
                        LOG.error('Failed to update member on edge: %s',
                                  edge_id)
            else:
                LOG.error('Pool %(pool_id)s on Edge %(edge_id)s has no '
                          'members to update',
                          {'pool_id': new_member['pool']['id'],
                           'edge_id': edge_id})
def convert_lbaas_member(member):
    """
    Transform OpenStack pool member dict to NSXv pool member dict.
    """
    return {
        'ipAddress': member['address'],
        'weight': member['weight'],
        'port': member['protocol_port'],
        'monitorPort': member['protocol_port'],
        'name': lb_common.get_member_id(member['id']),
        'condition': 'enabled' if member['admin_state_up'] else 'disabled'}
def convert_lbaas_member(member):
    """
    Transform OpenStack pool member dict to NSXv pool member dict.
    """
    return {
        'ipAddress': member['address'],
        'weight': member['weight'],
        'port': member['protocol_port'],
        'monitorPort': member['protocol_port'],
        'name': lb_common.get_member_id(member['id']),
        'condition': 'enabled' if member['admin_state_up'] else 'disabled'
    }
示例#13
0
    def create(self, context, member):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        edge_id = lb_binding['edge_id']

        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member.pool_id)
        if not pool_binding:
            self.lbv2_driver.member.failed_completion(
                context, member)
            msg = _('Failed to create member on edge: %s. '
                    'Binding not found') % edge_id
            LOG.error(msg)
            raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)

        edge_pool_id = pool_binding['edge_pool_id']
        with locking.LockManager.get_lock(edge_id):
            if not lb_common.is_lb_on_router_edge(
                context.elevated(), self.core_plugin, edge_id):
                # Verify that Edge appliance is connected to the member's
                # subnet (only if this is a dedicated loadbalancer edge)
                if not lb_common.get_lb_interface(
                        context, self.core_plugin, lb_id, member.subnet_id):
                    lb_common.create_lb_interface(
                        context, self.core_plugin, lb_id, member.subnet_id,
                        member.tenant_id)

            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]
            edge_member = {
                'ipAddress': member.address,
                'weight': member.weight,
                'port': member.protocol_port,
                'monitorPort': member.protocol_port,
                'name': lb_common.get_member_id(member.id),
                'condition':
                    'enabled' if member.admin_state_up else 'disabled'}

            if edge_pool.get('member'):
                edge_pool['member'].append(edge_member)
            else:
                edge_pool['member'] = [edge_member]

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                self.lbv2_driver.member.successful_completion(context, member)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv2_driver.member.failed_completion(context, member)
                    LOG.error('Failed to create member on edge: %s',
                              edge_id)
示例#14
0
    def delete(self, context, member):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member.pool_id)
        edge_id = lb_binding['edge_id']

        with locking.LockManager.get_lock(edge_id):
            # we should remove LB subnet interface if no members are attached
            # and this is not the LB's VIP interface
            remove_interface = True
            if member.subnet_id == member.pool.loadbalancer.vip_subnet_id:
                remove_interface = False
            else:
                for m in member.pool.members:
                    if m.subnet_id == member.subnet_id and m.id != member.id:
                        remove_interface = False
            if remove_interface:
                lb_common.delete_lb_interface(context, self.core_plugin, lb_id,
                                              member.subnet_id)

            if not pool_binding:
                self.lbv2_driver.member.successful_completion(
                    context, member, delete=True)
                return

            edge_pool_id = pool_binding['edge_pool_id']
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]

            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member.id):
                    edge_pool['member'].pop(i)
                    break

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)

                self.lbv2_driver.member.successful_completion(
                    context, member, delete=True)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv2_driver.member.failed_completion(context, member)
                    LOG.error('Failed to delete member on edge: %s',
                              edge_id)
示例#15
0
    def create(self, context, member):
        listener = member.pool.listener
        lb_id = listener.loadbalancer_id
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, listener.id, member.pool_id)

        edge_id = lb_binding['edge_id']
        edge_pool_id = pool_binding['edge_pool_id']
        with locking.LockManager.get_lock(edge_id):
            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]
            edge_member = {
                'ipAddress': member.address,
                'weight': member.weight,
                'port': member.protocol_port,
                'monitorPort': member.protocol_port,
                'name': lb_common.get_member_id(member.id),
                'condition':
                    'enabled' if member.admin_state_up else 'disabled'}

            if edge_pool.get('member'):
                edge_pool['member'].append(edge_member)
            else:
                edge_pool['member'] = [edge_member]

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)

                member_ips = self._get_pool_member_ips(member.pool, 'add',
                                                       member.address)
                lb_common.update_pool_fw_rule(self.vcns, member.pool_id,
                                              edge_id,
                                              self._get_lbaas_fw_section_id(),
                                              member_ips)

                self.lbv2_driver.member.successful_completion(context, member)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv2_driver.member.failed_completion(context, member)
                    LOG.error(_LE('Failed to create member on edge: %s'),
                              edge_id)
    def update_member(self, context, old_member, member, pool_mapping):
        LOG.debug('Updating member %s to %s', old_member, member)

        with locking.LockManager.get_lock(pool_mapping['edge_id']):
            edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
                                           pool_mapping['edge_pool_id'])[1]

            edge_member = convert_lbaas_member(member)
            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member['id']):
                    edge_pool['member'][i] = edge_member
                    break

            try:
                self.vcns.update_pool(pool_mapping['edge_id'],
                                      pool_mapping['edge_pool_id'], edge_pool)
                self.lbv1_driver.member_successful(context, member)
            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv1_driver.member_failed(context, member)
                    LOG.error(_LE('Failed to update member on edge: %s'),
                              pool_mapping['edge_id'])
    def update_member(self, context, old_member, member, pool_mapping):
        LOG.debug('Updating member %s to %s', old_member, member)

        with locking.LockManager.get_lock(pool_mapping['edge_id']):
            edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
                                           pool_mapping['edge_pool_id'])[1]

            edge_member = convert_lbaas_member(member)
            for i, m in enumerate(edge_pool['member']):
                if m['name'] == lb_common.get_member_id(member['id']):
                    edge_pool['member'][i] = edge_member
                    break

            try:
                self.vcns.update_pool(pool_mapping['edge_id'],
                                      pool_mapping['edge_pool_id'],
                                      edge_pool)
                self.lbv1_driver.member_successful(context, member)
            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    self.lbv1_driver.member_failed(context, member)
                    LOG.error(_LE('Failed to update member on edge: %s'),
                              pool_mapping['edge_id'])
示例#18
0
    def create(self, context, member, completor):
        lb_id = self._get_pool_lb_id(member)
        lb_binding = nsxv_db.get_nsxv_lbaas_loadbalancer_binding(
            context.session, lb_id)
        edge_id = lb_binding['edge_id']

        pool_binding = nsxv_db.get_nsxv_lbaas_pool_binding(
            context.session, lb_id, member['pool_id'])
        if not pool_binding:
            completor(success=False)
            msg = _('Failed to create member on edge: %s. '
                    'Binding not found') % edge_id
            LOG.error(msg)
            raise n_exc.BadRequest(resource='edge-lbaas', msg=msg)

        edge_pool_id = pool_binding['edge_pool_id']
        old_lb = lb_common.is_lb_on_router_edge(
            context, self.core_plugin, edge_id)
        with locking.LockManager.get_lock(edge_id):
            if not cfg.CONF.nsxv.use_routers_as_lbaas_platform and not old_lb:
                # Verify that Edge appliance is connected to the member's
                # subnet (only if this is a dedicated loadbalancer edge)
                if not lb_common.get_lb_interface(
                        context, self.core_plugin, lb_id, member['subnet_id']):
                    lb_common.create_lb_interface(
                        context, self.core_plugin, lb_id, member['subnet_id'],
                        member['tenant_id'])

            edge_pool = self.vcns.get_pool(edge_id, edge_pool_id)[1]
            edge_member = {
                'ipAddress': member['address'],
                'weight': member['weight'],
                'port': member['protocol_port'],
                'monitorPort': member['protocol_port'],
                'name': lb_common.get_member_id(member['id']),
                'condition':
                    'enabled' if member['admin_state_up'] else 'disabled'}

            if edge_pool.get('member'):
                edge_pool['member'].append(edge_member)
            else:
                edge_pool['member'] = [edge_member]

            try:
                self.vcns.update_pool(edge_id, edge_pool_id, edge_pool)
                completor(success=True)

                if old_lb:
                    member_ips = self._get_pool_member_ips(member['pool'],
                                                           'add',
                                                           member['address'])
                    lb_common.update_pool_fw_rule(
                        self.vcns, member['pool_id'],
                        edge_id,
                        self._get_lbaas_fw_section_id(),
                        member_ips)

            except nsxv_exc.VcnsApiException:
                with excutils.save_and_reraise_exception():
                    completor(success=False)
                    LOG.error('Failed to create member on edge: %s',
                              edge_id)