Ejemplo n.º 1
0
 def test_parse_bond_options(self):
     self.assertEqual(bonding.parse_bond_options('mode=4 custom=foo:bar'), {
         'custom': {
             'foo': 'bar'
         },
         'mode': '4'
     })
Ejemplo n.º 2
0
 def test_parse_bond_options(self):
     self.assertEqual(
         bonding.parse_bond_options('mode=4 miimon=100'),
         {
             'mode': '4',
             'miimon': '100'
         },
     )
Ejemplo n.º 3
0
def bondings_caps(running_config):
    ovs_bonding_caps = {}
    routes = netinfo_routes.get_routes()
    for bonding, attrs in iter_ovs_bonds(running_config.bonds):
        options = parse_bond_options(attrs.get('options'), keep_custom=True)
        net_info = _get_net_info(bonding, routes)
        net_info['slaves'] = attrs.get('nics')
        net_info['active_slave'] = _get_active_slave(bonding)
        net_info['opts'] = options
        ovs_bonding_caps[bonding] = net_info
    return ovs_bonding_caps
Ejemplo n.º 4
0
def bondings_caps(running_config):
    ovs_bonding_caps = {}
    routes = netinfo_routes.get_routes()
    for bonding, attrs in iter_ovs_bonds(running_config.bonds):
        options = parse_bond_options(attrs.get('options'), keep_custom=True)
        net_info = _get_net_info(bonding, routes)
        net_info['slaves'] = attrs.get('nics')
        net_info['active_slave'] = _get_active_slave(bonding)
        net_info['opts'] = options
        ovs_bonding_caps[bonding] = net_info
    return ovs_bonding_caps
Ejemplo n.º 5
0
def _setup_ovs_bond(bond, attrs, running_config):
    """ Add OVS bonding and set it requested mode and lacp options.
    As we use custom entry, these values are not validated in network api,
    so we check correct values here.
    """
    commands = []
    commands.extend(['--', '--fake-iface', '--may-exist', 'add-bond',
                     BRIDGE_NAME, bond] + attrs.get('nics'))

    bond_options = parse_bond_options(attrs.get('options'))
    mode = rget(bond_options, ('custom', 'ovs_mode')) or 'active-backup'
    lacp = rget(bond_options, ('custom', 'ovs_lacp')) or 'off'
    commands.extend(['--', 'set', 'port', bond, 'bond_mode=%s' % mode])
    commands.extend(['--', 'set', 'port', bond, 'lacp=%s' % lacp])

    running_config.setBonding(bond, {'nics': attrs.get('nics'),
                                     'options': attrs.get('options')})
    return commands
Ejemplo n.º 6
0
    def _edit_mode(self, bond, options):
        # TODO: Support setup of all OVS bond-related attributes and move
        # fallback setup into a separate function.

        commands = []

        parsed_options = bonding.parse_bond_options(options)
        mode = parsed_options.get('mode')
        miimon = parsed_options.get('miimon')

        bond_mode = 'active-backup'
        if mode is None:
            lacp = 'off'
        else:
            if mode in ('1', bonding.BONDING_MODES_NUMBER_TO_NAME['1']):
                lacp = 'off'
            elif mode in ('4', bonding.BONDING_MODES_NUMBER_TO_NAME['4']):
                lacp = 'active'
            else:
                # TODO: Validation should be moved to validator.py as soon as
                # we implement bond options canonicalization.
                raise ne.ConfigNetworkError(
                    ne.ERR_BAD_PARAMS,
                    'Mode {} is not available for OVS bondings'.format(mode))
        commands.append(self._ovsdb.set_port_attr(bond, 'bond_mode',
                                                  bond_mode))
        commands.append(self._ovsdb.set_port_attr(bond, 'lacp', lacp))

        if miimon is None:
            bond_detect_mode = 'carrier'
            bond_miimon_interval = None
        else:
            bond_detect_mode = 'miimon'
            bond_miimon_interval = miimon
        commands.append(
            self._ovsdb.set_port_attr(bond, 'other_config:bond-detect-mode',
                                      bond_detect_mode))
        if bond_miimon_interval is not None:
            commands.append(
                self._ovsdb.set_port_attr(bond,
                                          'other_config:bond-miimon-interval',
                                          bond_miimon_interval))

        return commands
Ejemplo n.º 7
0
def _validate_bond_configuration(attrs, netinfo):
    nics = attrs.get('nics')
    bond_options = parse_bond_options(attrs.get('options'))

    if nics is None or len(attrs.get('nics')) < 2:
        raise Exception('You have to define at least 2 slaves for '
                        'OVS bonding')
    for nic in nics:
        if nic not in netinfo.nics:
            raise Exception('Nic %s does not exist' % nic)

    mode = rget(bond_options, ('custom', 'ovs_mode')) or 'active-backup'
    lacp = rget(bond_options, ('custom', 'ovs_lacp')) or 'off'
    if mode:
        if mode not in VALID_MODES:
            raise Exception('%s is not valid ovs bond mode' % mode)
    if lacp:
        if lacp not in VALID_LACP:
            raise Exception('%s is not valid ovs lacp value' % lacp)
Ejemplo n.º 8
0
    def _edit_mode(self, bond, options):
        # TODO: Support setup of all OVS bond-related attributes and move
        # fallback setup into a separate function.

        commands = []

        parsed_options = bonding.parse_bond_options(options)
        mode = parsed_options.get('mode')
        miimon = parsed_options.get('miimon')

        bond_mode = 'active-backup'
        if mode is None:
            lacp = 'off'
        else:
            if mode in ('1', bonding.BONDING_MODES_NUMBER_TO_NAME['1']):
                lacp = 'off'
            elif mode in ('4', bonding.BONDING_MODES_NUMBER_TO_NAME['4']):
                lacp = 'active'
            else:
                # TODO: Validation should be moved to validator.py as soon as
                # we implement bond options canonicalization.
                raise ne.ConfigNetworkError(
                    ne.ERR_BAD_PARAMS,
                    'Mode {} is not available for OVS bondings'.format(mode))
        commands.append(self._ovsdb.set_port_attr(
            bond, 'bond_mode', bond_mode))
        commands.append(self._ovsdb.set_port_attr(bond, 'lacp', lacp))

        if miimon is None:
            bond_detect_mode = 'carrier'
            bond_miimon_interval = None
        else:
            bond_detect_mode = 'miimon'
            bond_miimon_interval = miimon
        commands.append(self._ovsdb.set_port_attr(
            bond, 'other_config:bond-detect-mode', bond_detect_mode))
        if bond_miimon_interval is not None:
            commands.append(self._ovsdb.set_port_attr(
                bond, 'other_config:bond-miimon-interval',
                bond_miimon_interval))

        return commands
Ejemplo n.º 9
0
def is_ovs_bond(bond_attrs):
    bond_options = parse_bond_options(bond_attrs.get('options', ''))
    ovs_bond = get_bool(rget(bond_options, ('custom', 'ovs')))
    return ovs_bond
Ejemplo n.º 10
0
 def test_parse_bond_options(self):
     expected = {'mode': '4', 'miimon': '100'}
     assert expected == bonding.parse_bond_options('mode=4 miimon=100')
Ejemplo n.º 11
0
 def test_parse_bond_options(self):
     self.assertEqual(bonding.parse_bond_options('mode=4 custom=foo:bar'),
                      {'custom': {'foo': 'bar'}, 'mode': '4'})
Ejemplo n.º 12
0
def is_ovs_bond(bond_attrs):
    bond_options = parse_bond_options(bond_attrs.get('options', ''))
    ovs_bond = get_bool(rget(bond_options, ('custom', 'ovs')))
    return ovs_bond