]> git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/addons/link.py
addons: address: add l3_intf_arp_accept policy to control ARP_ACCEPT
[mirror_ifupdown2.git] / ifupdown2 / addons / link.py
1 #!/usr/bin/python
2 #
3 # Copyright 2014-2017 Cumulus Networks, Inc. All rights reserved.
4 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
5 #
6 # This should be pretty simple and might not really even need to exist.
7 # The key is that we need to call link_create with a type of "dummy"
8 # since that will translate to 'ip link add loopbackX type dummy'
9 # The config file should probably just indicate that the type is
10 # loopback or dummy.
11
12 try:
13 from ifupdown2.ifupdown.iface import *
14 from ifupdown2.ifupdown.utils import utils
15
16 from ifupdown2.ifupdownaddons.LinkUtils import LinkUtils
17 from ifupdown2.ifupdownaddons.modulebase import moduleBase
18
19 import ifupdown2.ifupdown.ifupdownflags as ifupdownflags
20 import ifupdown2.ifupdown.policymanager as policymanager
21 except ImportError:
22 from ifupdown.iface import *
23 from ifupdown.utils import utils
24
25 from ifupdownaddons.LinkUtils import LinkUtils
26 from ifupdownaddons.modulebase import moduleBase
27
28 import ifupdown.ifupdownflags as ifupdownflags
29 import ifupdown.policymanager as policymanager
30
31
32 class link(moduleBase):
33 _modinfo = {'mhelp' : 'create/configure link types. similar to ip-link',
34 'attrs' : {
35 'link-type' :
36 {'help' : 'type of link as in \'ip link\' command.',
37 'validvals' : ['dummy', 'veth'],
38 'example' : ['link-type <dummy|veth>']},
39 'link-down' :
40 {'help': 'keep link down',
41 'example' : ['link-down yes/no'],
42 'default' : 'no',
43 'validvals' : ['yes', 'no']}}}
44
45 def __init__(self, *args, **kargs):
46 moduleBase.__init__(self, *args, **kargs)
47 self.ipcmd = None
48
49 self.check_physical_port_existance = utils.get_boolean_from_string(policymanager.policymanager_api.get_module_globals(
50 self.__class__.__name__,
51 'warn_on_physdev_not_present'
52 ))
53
54 def syntax_check(self, ifaceobj, ifaceobj_getfunc):
55 if self.check_physical_port_existance:
56 if not ifaceobj.link_kind and not LinkUtils.link_exists(ifaceobj.name):
57 self.logger.warning('%s: interface does not exist' % ifaceobj.name)
58 return False
59 return True
60
61 def _is_my_interface(self, ifaceobj):
62 if (ifaceobj.get_attr_value_first('link-type')
63 or ifaceobj.get_attr_value_first('link-down')):
64 return True
65 return False
66
67 def get_dependent_ifacenames(self, ifaceobj, ifacenames_all=None):
68 if ifaceobj.get_attr_value_first('link-down') == 'yes':
69 ifaceobj.link_privflags |= ifaceLinkPrivFlags.KEEP_LINK_DOWN
70 if ifaceobj.get_attr_value_first('link-type'):
71 ifaceobj.link_kind = ifaceLinkKind.OTHER
72
73 def _up(self, ifaceobj):
74 link_type = ifaceobj.get_attr_value_first('link-type')
75 if link_type:
76 self.ipcmd.link_create(ifaceobj.name,
77 ifaceobj.get_attr_value_first('link-type'))
78
79 def _down(self, ifaceobj):
80 if not ifaceobj.get_attr_value_first('link-type'):
81 return
82 if (not ifupdownflags.flags.PERFMODE and
83 not self.ipcmd.link_exists(ifaceobj.name)):
84 return
85 try:
86 self.ipcmd.link_delete(ifaceobj.name)
87 except Exception, e:
88 self.log_warn(str(e))
89
90 def _query_check(self, ifaceobj, ifaceobjcurr):
91 if ifaceobj.get_attr_value('link-type'):
92 if not self.ipcmd.link_exists(ifaceobj.name):
93 ifaceobjcurr.update_config_with_status('link-type', 'None', 1)
94 else:
95 link_type = ifaceobj.get_attr_value_first('link-type')
96 if self.ipcmd.link_get_kind(ifaceobj.name) == link_type:
97 ifaceobjcurr.update_config_with_status('link-type',
98 link_type, 0)
99 else:
100 ifaceobjcurr.update_config_with_status('link-type',
101 link_type, 1)
102
103 link_down = ifaceobj.get_attr_value_first('link-down')
104 if link_down:
105 link_up = self.ipcmd.is_link_up(ifaceobj.name)
106 link_should_be_down = utils.get_boolean_from_string(link_down)
107
108 if link_should_be_down and link_up:
109 status = 1
110 link_down = 'no'
111 elif link_should_be_down and not link_up:
112 status = 0
113 elif not link_should_be_down and link_up:
114 status = 0
115 else:
116 status = 1
117
118 ifaceobjcurr.update_config_with_status('link-down', link_down, status)
119
120 _run_ops = {'pre-up' : _up,
121 'post-down' : _down,
122 'query-checkcurr' : _query_check}
123
124 def get_ops(self):
125 return self._run_ops.keys()
126
127 def _init_command_handlers(self):
128 if not self.ipcmd:
129 self.ipcmd = LinkUtils()
130
131 def run(self, ifaceobj, operation, query_ifaceobj=None, **extra_args):
132 op_handler = self._run_ops.get(operation)
133 if not op_handler:
134 return
135 if (operation != 'query-running' and
136 not self._is_my_interface(ifaceobj)):
137 return
138 self._init_command_handlers()
139 if operation == 'query-checkcurr':
140 op_handler(self, ifaceobj, query_ifaceobj)
141 else:
142 op_handler(self, ifaceobj)