1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

addons: bond: add support for attribute aliases (bond-ports)

This features will allow attributes to have aliases. Our use case today is
between bond-slaves and bridge-ports, which be a little confusing.
It follows the kernel api and existing linux tools. Bonding driver calls them
slaves and to the bridge driver they are ports.

With NCLU we we would like to be more consistent. We will now also support
"bond-ports"a

Ticket: CM-12763
Reviewed By: Roopa
Testing Done:

$ ifquery -a -c
auto bond0
iface bond0                                                         [pass]
      bond-slaves swp1                                            [pass]

auto bond1
iface bond1                                                         [pass]
      bond-ports swp2                                             [pass]

root@cel-redxp-06:~# ifquery -a -r
auto bond0
iface bond0
      bond-lacp-bypass-allow 0
      bond-slaves swp1
      bond-mode 802.3ad
      bond-use-carrier 1
      bond-lacp-rate 1
      bond-min-links 1
      bond-miimon 100
      bond-xmit-hash-policy layer3+4

auto bond1
iface bond1
      bond-lacp-bypass-allow 0
      bond-slaves swp2
      bond-mode 802.3ad
      bond-use-carrier 1
      bond-lacp-rate 1
      bond-min-links 1
      bond-miimon 100
      bond-xmit-hash-policy layer3+4

Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
This commit is contained in:
Julien Fortin
2017-01-06 17:58:49 +03:00
parent ac49bf0ec5
commit a9633d0591
3 changed files with 26 additions and 7 deletions

View File

@ -104,7 +104,8 @@ class bond(moduleBase):
'validvals': ['<interface-list>'], 'validvals': ['<interface-list>'],
'example' : ['bond-slaves swp1 swp2', 'example' : ['bond-slaves swp1 swp2',
'bond-slaves glob swp1-2', 'bond-slaves glob swp1-2',
'bond-slaves regex (swp[1|2)']}}} 'bond-slaves regex (swp[1|2)'],
'aliases': ['bond-ports']}}}
_bond_mode_num = {'0': 'balance-rr', _bond_mode_num = {'0': 'balance-rr',
'1': 'active-backup', '1': 'active-backup',
@ -139,8 +140,14 @@ class bond(moduleBase):
self.ipcmd = None self.ipcmd = None
self.bondcmd = None self.bondcmd = None
def get_bond_slaves(self, ifaceobj):
slaves = ifaceobj.get_attr_value_first('bond-slaves')
if not slaves:
slaves = ifaceobj.get_attr_value_first('bond-ports')
return slaves
def _is_bond(self, ifaceobj): def _is_bond(self, ifaceobj):
if ifaceobj.get_attr_value_first('bond-slaves'): if self.get_bond_slaves(ifaceobj):
return True return True
return False return False
@ -150,8 +157,8 @@ class bond(moduleBase):
if not self._is_bond(ifaceobj): if not self._is_bond(ifaceobj):
return None return None
slave_list = self.parse_port_list(ifaceobj.name, slave_list = self.parse_port_list(ifaceobj.name,
ifaceobj.get_attr_value_first( self.get_bond_slaves(ifaceobj),
'bond-slaves'), ifacenames_all) ifacenames_all)
ifaceobj.dependency_type = ifaceDependencyType.MASTER_SLAVE ifaceobj.dependency_type = ifaceDependencyType.MASTER_SLAVE
# Also save a copy for future use # Also save a copy for future use
ifaceobj.priv_data = list(slave_list) ifaceobj.priv_data = list(slave_list)
@ -172,14 +179,14 @@ class bond(moduleBase):
# If priv data already has slave list use that first. # If priv data already has slave list use that first.
if ifaceobj.priv_data: if ifaceobj.priv_data:
return ifaceobj.priv_data return ifaceobj.priv_data
slaves = ifaceobj.get_attr_value_first('bond-slaves') slaves = self.get_bond_slaves(ifaceobj)
if slaves: if slaves:
return self.parse_port_list(ifaceobj.name, slaves) return self.parse_port_list(ifaceobj.name, slaves)
else: else:
return None return None
def _is_clag_bond(self, ifaceobj): def _is_clag_bond(self, ifaceobj):
if ifaceobj.get_attr_value_first('bond-slaves'): if self.get_bond_slaves(ifaceobj):
attrval = ifaceobj.get_attr_value_first('clag-id') attrval = ifaceobj.get_attr_value_first('clag-id')
if attrval and attrval != '0': if attrval and attrval != '0':
return True return True
@ -337,6 +344,7 @@ class bond(moduleBase):
if 'bond-mode' in runningattrs: if 'bond-mode' in runningattrs:
runningattrs['bond-mode'] = bond._get_num_bond_mode(runningattrs['bond-mode']) runningattrs['bond-mode'] = bond._get_num_bond_mode(runningattrs['bond-mode'])
bond_slaves = True
for k in ifaceattrs: for k in ifaceattrs:
v = ifaceobj.get_attr_value_first(k) v = ifaceobj.get_attr_value_first(k)
if not v: if not v:
@ -344,6 +352,10 @@ class bond(moduleBase):
if k == 'bond-slaves': if k == 'bond-slaves':
slaves = self._get_slave_list(ifaceobj) slaves = self._get_slave_list(ifaceobj)
continue continue
elif k == 'bond-ports':
bond_slaves = False
slaves = self._get_slave_list(ifaceobj)
continue
rv = runningattrs.get(k) rv = runningattrs.get(k)
if not rv: if not rv:
ifaceobjcurr.update_config_with_status(k, 'None', 1) ifaceobjcurr.update_config_with_status(k, 'None', 1)
@ -370,7 +382,7 @@ class bond(moduleBase):
if slaves[i] in runningslaves: if slaves[i] in runningslaves:
ordered.append(slaves[i]) ordered.append(slaves[i])
slaves = ordered slaves = ordered
ifaceobjcurr.update_config_with_status('bond-slaves', ifaceobjcurr.update_config_with_status('bond-slaves' if bond_slaves else 'bond-ports',
' '.join(slaves) ' '.join(slaves)
if slaves else 'None', retslave) if slaves else 'None', retslave)

View File

@ -1134,6 +1134,11 @@ class ifupdownMain(ifupdownBase):
self.logger.warn('attribute %s is deprecated.' self.logger.warn('attribute %s is deprecated.'
%attrname) %attrname)
return True return True
else:
for key in attrsdict:
if 'aliases' in attrsdict[key]:
if attrname in attrsdict[key]['aliases']:
return True
except AttributeError: except AttributeError:
pass pass
return False return False

View File

@ -311,6 +311,8 @@ class moduleBase(object):
if not attrvals or attrvals.get('deprecated'): if not attrvals or attrvals.get('deprecated'):
continue continue
retattrs.append(attrname) retattrs.append(attrname)
if 'aliases' in attrvals:
retattrs.extend(attrvals['aliases'])
return retattrs return retattrs
except: except:
return None return None