mirror of
				https://github.com/CumulusNetworks/ifupdown2.git
				synced 2024-05-06 15:54:50 +00:00 
			
		
		
		
	Ticket: Reviewed By: Roopa, Daniel W, Nikhil G, Dave O, Scott E Testing Done: ifupdown2 smokes Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
		
			
				
	
	
		
			150 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/python
 | 
						|
#
 | 
						|
# Copyright 2016 Cumulus Networks, Inc. All rights reserved.
 | 
						|
# Author: Julien Fortin, julien@cumulusnetworks.com
 | 
						|
#
 | 
						|
 | 
						|
try:
 | 
						|
    from ifupdownaddons.utilsbase import utilsBase
 | 
						|
    import ifupdown.ifupdownflags as ifupdownflags
 | 
						|
except ImportError, e:
 | 
						|
    raise ImportError(str(e) + "- required module not found")
 | 
						|
 | 
						|
 | 
						|
class Netlink(utilsBase):
 | 
						|
    VXLAN_UDP_PORT = 4789
 | 
						|
 | 
						|
    def __init__(self, *args, **kargs):
 | 
						|
        utilsBase.__init__(self, *args, **kargs)
 | 
						|
        try:
 | 
						|
            import sys
 | 
						|
            sys.path.insert(0, '/usr/share/ifupdown2/')
 | 
						|
            from nlmanager.nlmanager import NetlinkManager
 | 
						|
            # this should force the use of the local nlmanager
 | 
						|
            self._nlmanager_api = NetlinkManager(extra_debug=False)
 | 
						|
        except Exception as e:
 | 
						|
            self.logger.error('cannot initialize ifupdown2\'s '
 | 
						|
                              'netlink manager: %s' % str(e))
 | 
						|
            raise
 | 
						|
 | 
						|
    def get_iface_index(self, ifacename):
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.get_iface_index(ifacename)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('%s: netlink: %s: cannot get ifindex: %s'
 | 
						|
                            % (ifacename, ifacename, str(e)))
 | 
						|
 | 
						|
    def link_add_vlan(self, vlanrawdevice, ifacename, vlanid):
 | 
						|
        self.logger.info('%s: netlink: ip link add link %s name %s type vlan id %s'
 | 
						|
                         % (ifacename, vlanrawdevice, ifacename, vlanid))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        ifindex = self.get_iface_index(vlanrawdevice)
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_add_vlan(ifindex, ifacename, vlanid)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot create vlan %s: %s'
 | 
						|
                            % (vlanrawdevice, vlanid, str(e)))
 | 
						|
 | 
						|
    def link_add_macvlan(self, ifacename, macvlan_ifacename):
 | 
						|
        self.logger.info('%s: netlink: ip link add link %s name %s type macvlan mode private'
 | 
						|
                         % (ifacename, ifacename, macvlan_ifacename))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        ifindex = self.get_iface_index(ifacename)
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_add_macvlan(ifindex, macvlan_ifacename)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot create macvlan %s: %s'
 | 
						|
                            % (ifacename, macvlan_ifacename, str(e)))
 | 
						|
 | 
						|
    def link_set_updown(self, ifacename, state):
 | 
						|
        self.logger.info('%s: netlink: ip link set dev %s %s'
 | 
						|
                         % (ifacename, ifacename, state))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_set_updown(ifacename, state)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: cannot set link %s %s: %s'
 | 
						|
                            % (ifacename, state, str(e)))
 | 
						|
 | 
						|
    def link_set_protodown(self, ifacename, state):
 | 
						|
        self.logger.info('%s: netlink: set link %s protodown %s'
 | 
						|
                         % (ifacename, ifacename, state))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_set_protodown(ifacename, state)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: cannot set link %s protodown %s: %s'
 | 
						|
                            % (ifacename, state, str(e)))
 | 
						|
 | 
						|
    def link_set_master(self, ifacename, master_dev, state=None):
 | 
						|
        self.logger.info('%s: netlink: ip link set dev %s master %s %s'
 | 
						|
                         % (ifacename, ifacename, master_dev,
 | 
						|
                            state if state else ''))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            master = 0 if not master_dev else self.get_iface_index(master_dev)
 | 
						|
            return self._nlmanager_api.link_set_master(ifacename, master,
 | 
						|
                                                       state=state)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot set %s master %s: %s'
 | 
						|
                            % (ifacename, ifacename, master_dev, str(e)))
 | 
						|
 | 
						|
    def link_set_nomaster(self, ifacename, state=None):
 | 
						|
        self.logger.info('%s: netlink: ip link set dev %s nomaster %s'
 | 
						|
                         % (ifacename, ifacename, state if state else ''))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_set_master(ifacename, 0,
 | 
						|
                                                       state=state)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot set %s nomaster: %s'
 | 
						|
                            % (ifacename, ifacename, str(e)))
 | 
						|
 | 
						|
    def link_add_bridge_vlan(self, ifacename, vlanid):
 | 
						|
        self.logger.info('%s: netlink: bridge vlan add vid %s dev %s'
 | 
						|
                         % (ifacename, vlanid, ifacename))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        ifindex = self.get_iface_index(ifacename)
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_add_bridge_vlan(ifindex, vlanid)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot create bridge vlan %s: %s'
 | 
						|
                            % (ifacename, vlanid, str(e)))
 | 
						|
 | 
						|
    def link_del_bridge_vlan(self, ifacename, vlanid):
 | 
						|
        self.logger.info('%s: netlink: bridge vlan del vid %s dev %s'
 | 
						|
                         % (ifacename, vlanid, ifacename))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        ifindex = self.get_iface_index(ifacename)
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_del_bridge_vlan(ifindex, vlanid)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot remove bridge vlan %s: %s'
 | 
						|
                            % (ifacename, vlanid, str(e)))
 | 
						|
 | 
						|
    def link_add_vxlan(self, ifacename, vxlanid, local=None, dstport=VXLAN_UDP_PORT,
 | 
						|
                       group=None, learning='on', ageing=None):
 | 
						|
        cmd = 'ip link add %s type vxlan id %s dstport %s' % (ifacename,
 | 
						|
                                                              vxlanid,
 | 
						|
                                                              dstport)
 | 
						|
        cmd += ' local %s' % local if local else ''
 | 
						|
        cmd += ' ageing %s' % ageing if ageing else ''
 | 
						|
        cmd += ' remote %s' % group if group else ' noremote'
 | 
						|
        cmd += ' nolearning' if learning == 'off' else ''
 | 
						|
        self.logger.info('%s: netlink: %s' % (ifacename, cmd))
 | 
						|
        if ifupdownflags.flags.DRYRUN: return
 | 
						|
        try:
 | 
						|
            return self._nlmanager_api.link_add_vxlan(ifacename,
 | 
						|
                                                      vxlanid,
 | 
						|
                                                      dstport=dstport,
 | 
						|
                                                      local=local,
 | 
						|
                                                      group=group,
 | 
						|
                                                      learning=learning,
 | 
						|
                                                      ageing=ageing)
 | 
						|
        except Exception as e:
 | 
						|
            raise Exception('netlink: %s: cannot create vxlan %s: %s'
 | 
						|
                            % (ifacename, vxlanid, str(e)))
 | 
						|
 | 
						|
netlink = Netlink()
 |