예제 #1
0
 def test_parse_bond_options(self):
     self.assertEqual(bonding.parse_bond_options('mode=4 custom=foo:bar'), {
         'custom': {
             'foo': 'bar'
         },
         'mode': '4'
     })
예제 #2
0
 def test_parse_bond_options(self):
     self.assertEqual(
         bonding.parse_bond_options('mode=4 miimon=100'),
         {
             'mode': '4',
             'miimon': '100'
         },
     )
예제 #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
예제 #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
예제 #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
예제 #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
예제 #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)
예제 #8
0
파일: switch.py 프로젝트: yingyun001/vdsm
    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
예제 #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
예제 #10
0
 def test_parse_bond_options(self):
     expected = {'mode': '4', 'miimon': '100'}
     assert expected == bonding.parse_bond_options('mode=4 miimon=100')
예제 #11
0
파일: netinfo_test.py 프로젝트: nirs/vdsm
 def test_parse_bond_options(self):
     self.assertEqual(bonding.parse_bond_options('mode=4 custom=foo:bar'),
                      {'custom': {'foo': 'bar'}, 'mode': '4'})
예제 #12
0
파일: ovs_utils.py 프로젝트: rexhsu/vdsm
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