3 # Copyright 2014-2017 Cumulus Networks, Inc. All rights reserved.
4 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
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
13 from ifupdown2
.ifupdown
.iface
import *
14 from ifupdown2
.ifupdown
.utils
import utils
16 from ifupdown2
.ifupdownaddons
.LinkUtils
import LinkUtils
17 from ifupdown2
.ifupdownaddons
.modulebase
import moduleBase
19 import ifupdown2
.ifupdown
.ifupdownflags
as ifupdownflags
20 import ifupdown2
.ifupdown
.policymanager
as policymanager
22 from ifupdown
.iface
import *
23 from ifupdown
.utils
import utils
25 from ifupdownaddons
.LinkUtils
import LinkUtils
26 from ifupdownaddons
.modulebase
import moduleBase
28 import ifupdown
.ifupdownflags
as ifupdownflags
29 import ifupdown
.policymanager
as policymanager
32 class link(moduleBase
):
33 _modinfo
= {'mhelp' : 'create/configure link types. similar to ip-link',
36 {'help' : 'type of link as in \'ip link\' command.',
37 'validvals' : ['dummy', 'veth'],
38 'example' : ['link-type <dummy|veth>']},
40 {'help': 'keep link down',
41 'example' : ['link-down yes/no'],
43 'validvals' : ['yes', 'no']}}}
45 def __init__(self
, *args
, **kargs
):
46 moduleBase
.__init
__(self
, *args
, **kargs
)
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'
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
)
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')):
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
73 def _up(self
, ifaceobj
):
74 link_type
= ifaceobj
.get_attr_value_first('link-type')
76 self
.ipcmd
.link_create(ifaceobj
.name
,
77 ifaceobj
.get_attr_value_first('link-type'))
79 def _down(self
, ifaceobj
):
80 if not ifaceobj
.get_attr_value_first('link-type'):
82 if (not ifupdownflags
.flags
.PERFMODE
and
83 not self
.ipcmd
.link_exists(ifaceobj
.name
)):
86 self
.ipcmd
.link_delete(ifaceobj
.name
)
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)
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',
100 ifaceobjcurr
.update_config_with_status('link-type',
103 link_down
= ifaceobj
.get_attr_value_first('link-down')
105 link_up
= self
.ipcmd
.is_link_up(ifaceobj
.name
)
106 link_should_be_down
= utils
.get_boolean_from_string(link_down
)
108 if link_should_be_down
and link_up
:
111 elif link_should_be_down
and not link_up
:
113 elif not link_should_be_down
and link_up
:
118 ifaceobjcurr
.update_config_with_status('link-down', link_down
, status
)
120 _run_ops
= {'pre-up' : _up
,
122 'query-checkcurr' : _query_check
}
125 return self
._run
_ops
.keys()
127 def _init_command_handlers(self
):
129 self
.ipcmd
= LinkUtils()
131 def run(self
, ifaceobj
, operation
, query_ifaceobj
=None, **extra_args
):
132 op_handler
= self
._run
_ops
.get(operation
)
135 if (operation
!= 'query-running' and
136 not self
._is
_my
_interface
(ifaceobj
)):
138 self
._init
_command
_handlers
()
139 if operation
== 'query-checkcurr':
140 op_handler(self
, ifaceobj
, query_ifaceobj
)
142 op_handler(self
, ifaceobj
)