Example #1
0
 def _check_member_monitor_options(self, member):
     if self._check_monitor_options(member):
         msg = _('OVN Load Balancer does not support different member '
                 'monitor address or port.')
         raise driver_exceptions.UnsupportedOptionError(
             user_fault_string=msg,
             operator_fault_string=msg)
Example #2
0
 def _check_for_allowed_cidrs(self, allowed_cidrs):
     # TODO(haleyb): add support for this
     if isinstance(allowed_cidrs, o_datamodels.UnsetType):
         allowed_cidrs = []
     if allowed_cidrs:
         msg = _('OVN provider does not support allowed_cidrs option')
         raise driver_exceptions.UnsupportedOptionError(
             user_fault_string=msg,
             operator_fault_string=msg)
Example #3
0
 def check_for_row_by_value_and_retry(self, table, column, match):
     try:
         idlutils.row_by_value(self.idl, table, column, match)
     except idlutils.RowNotFound as e:
         msg = (_("%(match)s does not exist in %(column)s of %(table)s") % {
             'match': match,
             'column': column,
             'table': table
         })
         raise RuntimeError(msg) from e
Example #4
0
 def _validate_hm_support(self, hm, action='create'):
     if not self._is_health_check_supported():
         msg = _('OVN Load Balancer supports Health Check provider '
                 'from version 2.12. Upgrade OVN in order to use it.')
         raise driver_exceptions.UnsupportedOptionError(
             user_fault_string=msg,
             operator_fault_string=msg)
     # type is only required for create
     if action == 'create':
         if isinstance(hm.type, o_datamodels.UnsetType):
             msg = _('OVN provider health monitor type not specified.')
             # seems this should be other than "unsupported"?
             raise driver_exceptions.UnsupportedOptionError(
                 user_fault_string=msg,
                 operator_fault_string=msg)
         if hm.type not in ovn_const.SUPPORTED_HEALTH_MONITOR_TYPES:
             msg = (_('OVN provider does not support %s '
                      'health monitor type. Supported types: %s') %
                     (hm.type,
                      ', '.join(ovn_const.SUPPORTED_HEALTH_MONITOR_TYPES)))
             raise driver_exceptions.UnsupportedOptionError(
                 user_fault_string=msg,
                 operator_fault_string=msg)
def get_neutron_client():
    try:
        return NeutronAuth(
            endpoint=CONF.neutron.endpoint,
            region=CONF.neutron.region_name,
            endpoint_type=CONF.neutron.endpoint_type,
            service_name=CONF.neutron.service_name,
            insecure=CONF.neutron.insecure,
            ca_cert=CONF.neutron.ca_certificates_file,
        ).neutron_client
    except n_exc.NeutronClientException as e:
        msg = _('Cannot inialize Neutron Client. Exception: %s. '
                'Please verify Neutron service configuration '
                'in Octavia API configuration.') % e
        raise driver_exceptions.DriverError(
            operator_fault_string=msg)
Example #6
0
    def member_create(self, member):
        # Validate monitoring options if present
        self._check_member_monitor_options(member)
        if self._ip_version_differs(member):
            raise ovn_exc.IPVersionsMixingNotSupportedError()
        admin_state_up = member.admin_state_up
        subnet_id = member.subnet_id
        if (isinstance(subnet_id, o_datamodels.UnsetType) or not subnet_id):
            subnet_id = self._ovn_helper._get_subnet_from_pool(member.pool_id)
            if not subnet_id:
                msg = _('Subnet is required, or Loadbalancer associated with '
                        'Pool must have a subnet, for Member creation '
                        'with OVN Provider Driver')
                raise driver_exceptions.UnsupportedOptionError(
                    user_fault_string=msg,
                    operator_fault_string=msg)

        if isinstance(admin_state_up, o_datamodels.UnsetType):
            admin_state_up = True
        request_info = {'id': member.member_id,
                        'address': member.address,
                        'protocol_port': member.protocol_port,
                        'pool_id': member.pool_id,
                        'subnet_id': subnet_id,
                        'admin_state_up': admin_state_up}
        request = {'type': ovn_const.REQ_TYPE_MEMBER_CREATE,
                   'info': request_info}
        self._ovn_helper.add_request(request)

        # NOTE(mjozefcz): If LB has FIP on VIP
        # and member has FIP we need to centralize
        # traffic for member.
        request_info = {'id': member.member_id,
                        'address': member.address,
                        'pool_id': member.pool_id,
                        'subnet_id': subnet_id,
                        'action': ovn_const.REQ_INFO_MEMBER_ADDED}
        request = {'type': ovn_const.REQ_TYPE_HANDLE_MEMBER_DVR,
                   'info': request_info}
        self._ovn_helper.add_request(request)
Example #7
0
class IPVersionsMixingNotSupportedError(
        driver_exceptions.UnsupportedOptionError):
    user_fault_string = _('OVN provider does not support mixing IPv4/IPv6 '
                          'configuration within the same Load Balancer.')
    operator_fault_string = user_fault_string
Example #8
0
class RevisionConflict(n_exc.NeutronException):
    message = _('OVN revision number for %(resource_id)s (type: '
                '%(resource_type)s) is equal or higher than the given '
                'resource. Skipping update')
Example #9
0
#    under the License.

from keystoneauth1 import loading as ks_loading
from oslo_config import cfg
from oslo_log import log as logging

from ovn_octavia_provider.i18n import _

LOG = logging.getLogger(__name__)

ovn_opts = [
    cfg.StrOpt('ovn_nb_connection',
               default='tcp:127.0.0.1:6641',
               help=_('The connection string for the OVN_Northbound OVSDB.\n'
                      'Use tcp:IP:PORT for TCP connection.\n'
                      'Use ssl:IP:PORT for SSL connection. The '
                      'ovn_nb_private_key, ovn_nb_certificate and '
                      'ovn_nb_ca_cert are mandatory.\n'
                      'Use unix:FILE for unix domain socket connection.')),
    cfg.StrOpt('ovn_nb_private_key',
               default='',
               help=_('The PEM file with private key for SSL connection to '
                      'OVN-NB-DB')),
    cfg.StrOpt('ovn_nb_certificate',
               default='',
               help=_('The PEM file with certificate that certifies the '
                      'private key specified in ovn_nb_private_key')),
    cfg.StrOpt('ovn_nb_ca_cert',
               default='',
               help=_('The PEM file with CA certificate that OVN should use to'
                      ' verify certificates presented to it by SSL peers')),
    cfg.StrOpt('ovn_sb_connection',
Example #10
0
 def _check_for_supported_algorithms(self, algorithm):
     if algorithm not in ovn_const.OVN_NATIVE_LB_ALGORITHMS:
         msg = _('OVN provider does not support %s algorithm') % algorithm
         raise driver_exceptions.UnsupportedOptionError(
             user_fault_string=msg,
             operator_fault_string=msg)
Example #11
0
 def _check_for_supported_protocols(self, protocol):
     if protocol not in ovn_const.OVN_NATIVE_LB_PROTOCOLS:
         msg = _('OVN provider does not support %s protocol') % protocol
         raise driver_exceptions.UnsupportedOptionError(
             user_fault_string=msg,
             operator_fault_string=msg)
Example #12
0
    def member_batch_update(self, pool_id, members):
        request_list = []
        skipped_members = []
        pool_key, ovn_lb = self._ovn_helper._find_ovn_lb_by_pool_id(pool_id)
        external_ids = copy.deepcopy(ovn_lb.external_ids)
        pool = external_ids[pool_key]
        existing_members = pool.split(',') if pool else []
        members_to_delete = copy.copy(existing_members)
        pool_subnet_id = None
        for member in members:
            if (self._check_monitor_options(member) or
                    member.address and self._ip_version_differs(member)):
                skipped_members.append(member.member_id)
                continue
            # NOTE(froyo): if subnet_id not provided, lets try to get it
            # from the member pool_id
            subnet_id = member.subnet_id
            if (isinstance(subnet_id, o_datamodels.UnsetType) or
                    not subnet_id):
                pool_subnet_id = (
                    pool_subnet_id
                    if pool_subnet_id
                    else self._ovn_helper._get_subnet_from_pool(pool_id))
                # NOTE(mjozefcz): We need to have subnet_id information.
                if not pool_subnet_id:
                    msg = _('Subnet is required, or Loadbalancer associated '
                            'with Pool must have a subnet, for Member '
                            'creation with OVN Provider Driver')
                    raise driver_exceptions.UnsupportedOptionError(
                        user_fault_string=msg,
                        operator_fault_string=msg)
                member.subnet_id = pool_subnet_id
            admin_state_up = member.admin_state_up
            if isinstance(admin_state_up, o_datamodels.UnsetType):
                admin_state_up = True

            member_info = self._ovn_helper._get_member_info(member)
            if member_info not in existing_members:
                req_type = ovn_const.REQ_TYPE_MEMBER_CREATE
            else:
                # If member exists in pool, then Update
                req_type = ovn_const.REQ_TYPE_MEMBER_UPDATE
                # Remove all updating members so only deleted ones are left
                members_to_delete.remove(member_info)

            request_info = {'id': member.member_id,
                            'address': member.address,
                            'protocol_port': member.protocol_port,
                            'pool_id': member.pool_id,
                            'subnet_id': member.subnet_id,
                            'admin_state_up': admin_state_up}
            request = {'type': req_type,
                       'info': request_info}
            request_list.append(request)

        for member in members_to_delete:
            member_info = member.split('_')
            request_info = {'id': member_info[1],
                            'address': member_info[2].split(':')[0],
                            'protocol_port': member_info[2].split(':')[1],
                            'pool_id': pool_id}
            if len(member_info) == 4:
                request_info['subnet_id'] = member_info[3]
            request = {'type': ovn_const.REQ_TYPE_MEMBER_DELETE,
                       'info': request_info}
            request_list.append(request)

        for request in request_list:
            self._ovn_helper.add_request(request)
        if skipped_members:
            msg = (_('OVN provider does not support monitor options, '
                     'so following members skipped: %s') % skipped_members)
            raise driver_exceptions.UnsupportedOptionError(
                user_fault_string=msg,
                operator_fault_string=msg)
Example #13
0
 def loadbalancer_failover(self, loadbalancer_id):
     msg = _('OVN provider does not support loadbalancer failover')
     raise driver_exceptions.UnsupportedOptionError(
         user_fault_string=msg,
         operator_fault_string=msg)
Example #14
0
class OvsdbConnectionUnavailable(n_exc.ServiceUnavailable):
    message = _("OVS database connection to %(db_schema)s failed with error: "
                "'%(error)s'. Verify that the OVS and OVN services are "
                "available and that the 'ovn_nb_connection' and "
                "'ovn_sb_connection' configuration options are correct.")