]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - addons/vrf.py
3 # Copyright 2014 Cumulus Networks, Inc. All rights reserved.
4 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
9 from ifupdown
.iface
import *
10 import ifupdown
.policymanager
as policymanager
12 import ifupdown
.rtnetlink_api
as rtnetlink_api
13 from ifupdownaddons
.modulebase
import moduleBase
14 from ifupdownaddons
.bondutil
import bondutil
15 from ifupdownaddons
.iproute2
import iproute2
16 from ifupdownaddons
.dhclient
import dhclient
21 class vrf(moduleBase
):
22 """ ifupdown2 addon module to configure vrfs """
23 _modinfo
= { 'mhelp' : 'vrf configuration module',
26 {'help' : 'vrf device table id. key to ' +
27 'creating a vrf device',
28 'example': ['vrf-table-id 1']},
30 {'help' : 'vrf device default route ' +
31 'to avoid communication outside the vrf device',
32 'example': ['vrf-default-route yes/no']},
34 {'help' : 'vrf the interface is part of.',
35 'example': ['vrf blue']}}}
37 iproute2_vrf_filename
= '/etc/iproute2/rt_tables.d/ifupdown2_vrf_map.conf'
38 iproute2_vrf_filehdr
= '# This file is autogenerated by ifupdown2.\n' + \
39 '# It contains the vrf name to table mapping.\n' + \
40 '# Reserved table range %s %s\n'
41 VRF_TABLE_START
= 1001
44 def __init__(self
, *args
, **kargs
):
45 ifupdownaddons
.modulebase
.moduleBase
.__init
__(self
, *args
, **kargs
)
48 self
.dhclientcmd
= None
49 self
.name
= self
.__class
__.__name
__
51 # if perf mode is set, remove vrf map file.
52 # start afresh. PERFMODE is set at boot
53 if os
.path
.exists(self
.iproute2_vrf_filename
):
55 self
.logger
.info('vrf: removing file %s'
56 %self
.iproute2_vrf_filename
)
57 os
.remove(self
.iproute2_vrf_filename
)
59 self
.logger
.debug('vrf: removing file failed (%s)'
62 ip_rules
= self
.exec_command('/sbin/ip rule show').splitlines()
63 self
.ip_rule_cache
= [' '.join(r
.split()) for r
in ip_rules
]
65 self
.ip_rule_cache
= []
66 self
.logger
.warn('%s' %str
(e
))
69 ip_rules
= self
.exec_command('/sbin/ip -6 rule show').splitlines()
70 self
.ip6_rule_cache
= [' '.join(r
.split()) for r
in ip_rules
]
72 self
.ip6_rule_cache
= []
73 self
.logger
.warn('%s' %str
(e
))
75 #self.logger.debug("vrf: ip rule cache")
76 #self.logger.info(self.ip_rule_cache)
78 #self.logger.info("vrf: ip -6 rule cache")
79 #self.logger.info(self.ip6_rule_cache)
81 # XXX: check for vrf reserved overlap in /etc/iproute2/rt_tables
82 self
.iproute2_vrf_map
= {}
83 # read or create /etc/iproute2/rt_tables.d/ifupdown2.vrf_map
84 if os
.path
.exists(self
.iproute2_vrf_filename
):
85 self
.vrf_map_fd
= open(self
.iproute2_vrf_filename
, 'a+')
86 lines
= self
.vrf_map_fd
.readlines()
92 (table
, vrf_name
) = l
.strip().split()
93 self
.iproute2_vrf_map
[table
] = vrf_name
95 self
.logger
.info('vrf: iproute2_vrf_map: unable to parse %s'
98 #self.logger.info("vrf: dumping iproute2_vrf_map")
99 #self.logger.info(self.iproute2_vrf_map)
101 # purge vrf table entries that are not around
102 iproute2_vrf_map_pruned
= {}
103 for t
, v
in self
.iproute2_vrf_map
.iteritems():
104 if os
.path
.exists('/sys/class/net/%s' %v
):
105 iproute2_vrf_map_pruned
[t
] = v
109 self
._del
_vrf
_rules
(v
, t
)
112 self
.iproute2_vrf_map
= iproute2_vrf_map_pruned
114 self
.vrf_table_id_start
= policymanager
.policymanager_api
.get_module_globals(module_name
=self
.__class
__.__name
__, attr
='vrf-table-id-start')
115 if not self
.vrf_table_id_start
:
116 self
.vrf_table_id_start
= self
.VRF_TABLE_START
117 self
.vrf_table_id_end
= policymanager
.policymanager_api
.get_module_globals(module_name
=self
.__class
__.__name
__, attr
='vrf-table-id-end')
118 if not self
.vrf_table_id_end
:
119 self
.vrf_table_id_end
= self
.VRF_TABLE_END
120 self
.vrf_max_count
= policymanager
.policymanager_api
.get_module_globals(module_name
=self
.__class
__.__name
__, attr
='vrf-max-count')
122 last_used_vrf_table
= None
123 for t
in range(self
.vrf_table_id_start
,
124 self
.vrf_table_id_end
):
125 if not self
.iproute2_vrf_map
.get(t
):
127 last_used_vrf_table
= t
128 self
.last_used_vrf_table
= last_used_vrf_table
129 self
.iproute2_write_vrf_map
= False
130 atexit
.register(self
.iproute2_vrf_map_write
)
131 self
.vrf_fix_local_table
= True
133 self
.vrf_cgroup_create
= policymanager
.policymanager_api
.get_module_globals(module_name
=self
.__class
__.__name
__, attr
='vrf-cgroup-create')
134 if not self
.vrf_cgroup_create
:
135 self
.vrf_cgroup_create
= False
136 elif self
.vrf_cgroup_create
== 'yes':
137 self
.vrf_cgroup_create
= True
139 self
.vrf_cgroup_create
= False
141 def iproute2_vrf_map_write(self
):
142 if not self
.iproute2_write_vrf_map
:
144 self
.logger
.info('vrf: writing table map to %s'
145 %self
.iproute2_vrf_filename
)
146 with
open(self
.iproute2_vrf_filename
, 'w') as f
:
147 f
.write(self
.iproute2_vrf_filehdr
%(self
.vrf_table_id_start
,
148 self
.vrf_table_id_end
))
149 for t
, v
in self
.iproute2_vrf_map
.iteritems():
150 f
.write('%s %s\n' %(t
, v
))
152 def _is_vrf(self
, ifaceobj
):
153 if ifaceobj
.get_attr_value_first('vrf-table'):
157 def get_upper_ifacenames(self
, ifaceobj
, ifacenames_all
=None):
158 """ Returns list of interfaces dependent on ifaceobj """
160 vrf_table
= ifaceobj
.get_attr_value_first('vrf-table')
162 ifaceobj
.link_type
= ifaceLinkType
.LINK_MASTER
163 ifaceobj
.link_kind |
= ifaceLinkKind
.VRF
164 vrf_iface_name
= ifaceobj
.get_attr_value_first('vrf')
165 if not vrf_iface_name
:
167 ifaceobj
.link_type
= ifaceLinkType
.LINK_SLAVE
168 ifaceobj
.link_kind |
= ifaceLinkKind
.VRF_SLAVE
170 return [vrf_iface_name
]
172 def get_upper_ifacenames_running(self
, ifaceobj
):
175 def _get_iproute2_vrf_table(self
, vrf_dev_name
):
176 for t
, v
in self
.iproute2_vrf_map
.iteritems():
177 if v
== vrf_dev_name
:
181 def _get_avail_vrf_table_id(self
):
182 if self
.last_used_vrf_table
== None:
183 table_id_start
= self
.vrf_table_id_start
185 table_id_start
= self
.last_used_vrf_table
+ 1
186 for t
in range(table_id_start
,
187 self
.vrf_table_id_end
):
188 if not self
.iproute2_vrf_map
.get(t
):
189 self
.last_used_vrf_table
= t
193 def _iproute2_vrf_table_entry_add(self
, vrf_dev_name
, table_id
):
194 self
.iproute2_vrf_map
[table_id
] = vrf_dev_name
195 self
.iproute2_write_vrf_map
= True
197 def _iproute2_vrf_table_entry_del(self
, table_id
):
199 del self
.iproute2_vrf_map
[table_id
]
200 self
.iproute2_write_vrf_map
= True
202 self
.logger
.info('vrf: iproute2 vrf map del failed for %d (%s)'
206 def _is_dhcp_slave(self
, ifaceobj
):
207 if (not ifaceobj
.addr_method
or
208 (ifaceobj
.addr_method
!= 'dhcp' and
209 ifaceobj
.addr_method
!= 'dhcp6')):
213 def _handle_dhcp_slaves(self
, ifacename
, vrfname
, ifaceobj
,
215 """ If we have a vrf slave that has dhcp configured, bring up the
216 vrf master now. This is needed because vrf has special handling
217 in dhclient hook which requires the vrf master to be present """
218 if not self
._is
_dhcp
_slave
(ifaceobj
):
220 vrf_master
= ifaceobj
.upperifaces
[0]
222 self
.logger
.warn('%s: vrf master not found' %ifacename
)
224 if os
.path
.exists('/sys/class/net/%s' %vrf_master
):
225 self
.logger
.info('%s: vrf master %s exists returning'
226 %(ifacename
, vrf_master
))
228 vrf_master_objs
= ifaceobj_getfunc(vrf_master
)
229 if not vrf_master_objs
:
230 self
.logger
.warn('%s: vrf master ifaceobj not found' %ifacename
)
232 self
.logger
.info('%s: bringing up vrf master %s'
233 %(ifacename
, vrf_master
))
234 for mobj
in vrf_master_objs
:
235 vrf_table
= mobj
.get_attr_value_first('vrf-table')
237 if vrf_table
== 'auto':
238 vrf_table
= self
._get
_avail
_vrf
_table
_id
()
240 self
.log_error('%s: unable to get an auto table id'
242 self
.logger
.info('%s: table id auto: selected table id %s\n'
243 %(mobj
.name
, vrf_table
))
244 self
._up
_vrf
_dev
(mobj
, vrf_table
, False)
246 self
._down
_dhcp
_slave
(ifaceobj
)
247 self
.ipcmd
.link_set(ifacename
, 'master', vrfname
)
250 def _down_dhcp_slave(self
, ifaceobj
):
252 self
.dhclientcmd
.release(ifaceobj
.name
)
254 # ignore any dhclient release errors
257 def _up_vrf_slave(self
, ifacename
, vrfname
, ifaceobj
=None,
258 ifaceobj_getfunc
=None):
260 if self
.ipcmd
.link_exists(vrfname
):
261 upper
= self
.ipcmd
.link_get_upper(vrfname
)
262 if not upper
or upper
!= vrfname
:
263 if self
._is
_dhcp
_slave
(ifaceobj
):
264 self
._down
_dhcp
_slave
(ifaceobj
)
265 self
.ipcmd
.link_set(ifacename
, 'master', vrfname
)
267 self
._handle
_dhcp
_slaves
(ifacename
, vrfname
, ifaceobj
,
270 self
.log_error('%s: %s' %(ifacename
, str(e
)))
272 def _del_vrf_rules(self
, vrf_dev_name
, vrf_table
):
274 ip_rule_out_format
= '%s: from all %s %s lookup %s'
275 ip_rule_cmd
= 'ip %s rule del pref %s %s %s table %s'
277 rule
= ip_rule_out_format
%(pref
, 'oif', vrf_dev_name
, vrf_dev_name
)
278 if rule
in self
.ip_rule_cache
:
279 rule_cmd
= ip_rule_cmd
%('', pref
, 'oif', vrf_dev_name
, vrf_table
)
280 self
.exec_command(rule_cmd
)
282 rule
= ip_rule_out_format
%(pref
, 'iif', vrf_dev_name
, vrf_dev_name
)
283 if rule
in self
.ip_rule_cache
:
284 rule_cmd
= ip_rule_cmd
%('', pref
, 'iif', vrf_dev_name
, vrf_table
)
285 self
.exec_command(rule_cmd
)
287 rule
= ip_rule_out_format
%(pref
, 'oif', vrf_dev_name
, vrf_dev_name
)
288 if rule
in self
.ip6_rule_cache
:
289 rule_cmd
= ip_rule_cmd
%('-6', pref
, 'oif', vrf_dev_name
,
291 self
.exec_command(rule_cmd
)
293 rule
= ip_rule_out_format
%(pref
, 'iif', vrf_dev_name
, vrf_dev_name
)
294 if rule
in self
.ip6_rule_cache
:
295 rule_cmd
= ip_rule_cmd
%('-6', pref
, 'iif', vrf_dev_name
,
297 self
.exec_command(rule_cmd
)
299 def _add_vrf_rules(self
, vrf_dev_name
, vrf_table
):
301 ip_rule_out_format
= '%s: from all %s %s lookup %s'
302 ip_rule_cmd
= 'ip %s rule add pref %s %s %s table %s'
303 if self
.vrf_fix_local_table
:
304 self
.vrf_fix_local_table
= False
305 rule
= '0: from all lookup local'
306 if rule
in self
.ip_rule_cache
:
308 self
.exec_command('ip rule del pref 0')
309 self
.exec_command('ip rule add pref 32765 table local')
311 self
.logger
.info('%s' %str
(e
))
313 if rule
in self
.ip6_rule_cache
:
315 self
.exec_command('ip -6 rule del pref 0')
316 self
.exec_command('ip -6 rule add pref 32765 table local')
318 self
.logger
.info('%s' %str
(e
))
322 #200: from all oif blue lookup blue
323 #200: from all iif blue lookup blue
325 rule
= ip_rule_out_format
%(pref
, 'oif', vrf_dev_name
, vrf_dev_name
)
326 if rule
not in self
.ip_rule_cache
:
327 rule_cmd
= ip_rule_cmd
%('', pref
, 'oif', vrf_dev_name
, vrf_table
)
328 self
.exec_command(rule_cmd
)
330 rule
= ip_rule_out_format
%(pref
, 'iif', vrf_dev_name
, vrf_dev_name
)
331 if rule
not in self
.ip_rule_cache
:
332 rule_cmd
= ip_rule_cmd
%('', pref
, 'iif', vrf_dev_name
, vrf_table
)
333 self
.exec_command(rule_cmd
)
335 rule
= ip_rule_out_format
%(pref
, 'oif', vrf_dev_name
, vrf_dev_name
)
336 if rule
not in self
.ip6_rule_cache
:
337 rule_cmd
= ip_rule_cmd
%('-6', pref
, 'oif', vrf_dev_name
, vrf_table
)
338 self
.exec_command(rule_cmd
)
340 rule
= ip_rule_out_format
%(pref
, 'iif', vrf_dev_name
, vrf_dev_name
)
341 if rule
not in self
.ip6_rule_cache
:
342 rule_cmd
= ip_rule_cmd
%('-6', pref
, 'iif', vrf_dev_name
,
344 self
.exec_command(rule_cmd
)
346 def _add_vrf_slaves(self
, ifaceobj
, ifaceobj_getfunc
=None):
347 running_slaves
= self
.ipcmd
.link_get_lowers(ifaceobj
.name
)
348 config_slaves
= ifaceobj
.lowerifaces
349 if not config_slaves
and not running_slaves
:
352 if not config_slaves
: config_slaves
= []
353 if not running_slaves
: running_slaves
= []
354 add_slaves
= set(config_slaves
).difference(set(running_slaves
))
355 del_slaves
= set(running_slaves
).difference(set(config_slaves
))
359 self
._up
_vrf
_slave
(s
, ifaceobj
.name
)
361 self
.logger
.info('%s: %s' %(ifaceobj
.name
, str(e
)))
367 sobj
= ifaceobj_getfunc(s
)
368 # if dhcp slave, release the dhcp lease
369 if sobj
and self
._is
_dhcp
_slave
(sobj
[0]):
370 self
._down
_dhcp
_slave
(sobj
[0])
371 self
._down
_vrf
_slave
(s
, ifaceobj
.name
)
373 self
.logger
.info('%s: %s' %(ifaceobj
.name
, str(e
)))
375 if ifaceobj
.link_type
== ifaceLinkType
.LINK_MASTER
:
376 for s
in config_slaves
:
378 rtnetlink_api
.rtnl_api
.link_set(s
, "up")
380 self
.logger
.debug('%s: %s: link set up (%s)'
381 %(ifaceobj
.name
, s
, str(e
)))
384 def _create_cgroup(self
, ifaceobj
):
385 if not self
.vrf_cgroup_create
:
388 if not os
.path
.exists('/sys/fs/cgroup/l3mdev/%s' %ifaceobj
.name
):
389 self
.exec_command('/usr/bin/cgcreate -g l3mdev:%s' %ifaceobj
.name
)
391 self
.log_error('%s: cgroup create failed (%s)\n'
392 %(ifaceobj
.name
, str(e
)), ifaceobj
)
394 self
.exec_command('/usr/bin/cgset -r l3mdev.master-device=%s %s'
395 %(ifaceobj
.name
, ifaceobj
.name
))
397 self
.log_warn('%s: cgset failed (%s)\n'
398 %(ifaceobj
.name
, str(e
)), ifaceobj
)
400 def _set_vrf_dev_processed_flag(self
, ifaceobj
):
401 ifaceobj
.module_flags
[self
.name
] = \
402 ifaceobj
.module_flags
.setdefault(self
.name
, 0) | \
403 vrfPrivFlags
.PROCESSED
405 def _check_vrf_dev_processed_flag(self
, ifaceobj
):
406 if (ifaceobj
.module_flags
.get(self
.name
, 0x0) & vrfPrivFlags
.PROCESSED
):
410 def _create_vrf_dev(self
, ifaceobj
, vrf_table
):
411 if not self
.ipcmd
.link_exists(ifaceobj
.name
):
412 if vrf_table
== 'auto':
413 vrf_table
= self
._get
_avail
_vrf
_table
_id
()
415 self
.log_error('%s: unable to get an auto table id'
417 self
.logger
.info('%s: table id auto: selected table id %s\n'
418 %(ifaceobj
.name
, vrf_table
))
420 if not vrf_table
.isdigit():
421 self
.log_error('%s: vrf-table must be an integer or \'auto\''
422 %(ifaceobj
.name
), ifaceobj
)
424 # XXX: If we decide to not allow vrf id usages out of
425 # the reserved ifupdown range, then uncomment this code.
427 # if (int(vrf_table) < self.vrf_table_id_start or
428 # int(vrf_table) > self.vrf_table_id_end):
429 # self.log_error('%s: vrf table id %s out of reserved range [%d,%d]'
430 # %(ifaceobj.name, vrf_table,
431 # self.vrf_table_id_start,
432 # self.vrf_table_id_end))
434 self
.ipcmd
.link_create(ifaceobj
.name
, 'vrf',
435 {'table' : '%s' %vrf_table
})
437 self
.log_error('%s: create failed (%s)\n'
438 %(ifaceobj
.name
, str(e
)))
440 if vrf_table
== 'auto':
441 vrf_table
= self
._get
_iproute
2_vrf
_table
(ifaceobj
.name
)
443 self
.log_error('%s: unable to get vrf table id'
446 # if the device exists, check if table id is same
447 vrfdev_attrs
= self
.ipcmd
.link_get_linkinfo_attrs(ifaceobj
.name
)
449 running_table
= vrfdev_attrs
.get('table', None)
450 if vrf_table
!= running_table
:
451 self
.log_error('%s: cannot change vrf table id,running table id %s is different from config id %s' %(ifaceobj
.name
,
452 running_table
, vrf_table
))
453 if vrf_table
!= 'auto':
454 self
._iproute
2_vrf
_table
_entry
_add
(ifaceobj
.name
, vrf_table
)
458 def _add_vrf_default_route(self
, ifaceobj
, vrf_table
):
459 vrf_default_route
= ifaceobj
.get_attr_value_first('vrf-default-route')
460 if not vrf_default_route
:
461 vrf_default_route
= policymanager
.policymanager_api
.get_attr_default(
462 module_name
=self
.__class
__.__name
__,
463 attr
='vrf-default-route')
464 if not vrf_default_route
:
466 if str(vrf_default_route
).lower() == "yes":
468 self
.exec_command('ip route add table %s unreachable default'
469 ' metric %d' %(vrf_table
, 240))
476 self
.exec_command('ip -6 route add table %s unreachable '
477 'default metric %d' %(vrf_table
, 240))
483 def _up_vrf_dev(self
, ifaceobj
, vrf_table
, add_slaves
=True,
484 ifaceobj_getfunc
=None):
486 # if vrf dev is already processed return. This can happen
487 # if we had a dhcp slave. See self._handle_dhcp_slaves
488 if self
._check
_vrf
_dev
_processed
_flag
(ifaceobj
):
491 vrf_table
= self
._create
_vrf
_dev
(ifaceobj
, vrf_table
)
493 self
._add
_vrf
_rules
(ifaceobj
.name
, vrf_table
)
494 self
._create
_cgroup
(ifaceobj
)
496 self
._add
_vrf
_slaves
(ifaceobj
, ifaceobj_getfunc
)
497 self
._add
_vrf
_default
_route
(ifaceobj
, vrf_table
)
498 self
._set
_vrf
_dev
_processed
_flag
(ifaceobj
)
500 self
.log_error('%s: %s' %(ifaceobj
.name
, str(e
)))
502 def _up(self
, ifaceobj
, ifaceobj_getfunc
=None):
504 vrf_table
= ifaceobj
.get_attr_value_first('vrf-table')
506 if self
.vrf_count
== self
.vrf_max_count
:
507 self
.log_error('%s: max vrf count %d hit...not '
508 'creating vrf' %(ifaceobj
.name
,
510 self
._up
_vrf
_dev
(ifaceobj
, vrf_table
, True, ifaceobj_getfunc
)
512 vrf
= ifaceobj
.get_attr_value_first('vrf')
514 self
._up
_vrf
_slave
(ifaceobj
.name
, vrf
, ifaceobj
,
517 self
.log_error(str(e
))
519 def _delete_cgroup(self
, ifaceobj
):
521 if os
.path
.exists('/sys/fs/cgroup/l3mdev/%s' %ifaceobj
.name
):
522 self
.exec_command('cgdelete -g l3mdev:%s' %ifaceobj
.name
)
524 self
.log_warn('%s: cgroup delete failed (%s)\n'
525 %(ifaceobj
.name
, str(e
)), ifaceobj
)
527 def _down_vrf_dev(self
, ifaceobj
, vrf_table
):
528 if vrf_table
== 'auto':
529 vrf_table
= self
._get
_iproute
2_vrf
_table
(ifaceobj
.name
)
531 self
.ipcmd
.link_delete(ifaceobj
.name
)
533 self
.logger
.info('%s: %s' %(ifaceobj
.name
, str(e
)))
537 self
._iproute
2_vrf
_table
_entry
_del
(vrf_table
)
538 self
._delete
_cgroup
(ifaceobj
)
540 self
.logger
.info('%s: %s' %(ifaceobj
.name
, str(e
)))
544 self
._del
_vrf
_rules
(ifaceobj
.name
, vrf_table
)
546 self
.logger
.info('%s: %s' %(ifaceobj
.name
, str(e
)))
549 def _down_vrf_slave(self
, ifacename
, vrf
):
551 self
.ipcmd
.link_set(ifacename
, 'nomaster')
553 self
.logger
.warn('%s: %s' %(ifacename
, str(e
)))
555 def _down(self
, ifaceobj
, ifaceobj_getfunc
=None):
557 vrf_table
= ifaceobj
.get_attr_value_first('vrf-table')
559 self
._down
_vrf
_dev
(ifaceobj
, vrf_table
)
561 vrf
= ifaceobj
.get_attr_value_first('vrf')
563 self
._down
_vrf
_slave
(ifaceobj
.name
, vrf
)
565 self
.log_warn(str(e
))
567 def _query_check_vrf_slave(self
, ifaceobj
, ifaceobjcurr
, vrf
):
569 master
= self
.ipcmd
.link_get_master(ifaceobj
.name
)
570 if not master
or master
!= vrf
:
571 ifaceobjcurr
.update_config_with_status('vrf', master
, 1)
573 ifaceobjcurr
.update_config_with_status('vrf', master
, 0)
575 self
.log_warn(str(e
))
577 def _query_check_vrf_dev(self
, ifaceobj
, ifaceobjcurr
, vrf_table
):
579 if not self
.ipcmd
.link_exists(ifaceobj
.name
):
580 self
.logger
.info('%s: vrf: does not exist' %(ifaceobj
.name
))
582 if vrf_table
== 'auto':
583 config_table
= self
._get
_iproute
2_vrf
_table
(ifaceobj
.name
)
585 config_table
= vrf_table
586 vrfdev_attrs
= self
.ipcmd
.link_get_linkinfo_attrs(ifaceobj
.name
)
588 ifaceobjcurr
.update_config_with_status('vrf-table', 'None', 1)
590 running_table
= vrfdev_attrs
.get('table')
591 if not running_table
:
592 ifaceobjcurr
.update_config_with_status('vrf-table', 'None', 1)
594 if config_table
!= running_table
:
595 ifaceobjcurr
.update_config_with_status('vrf-table',
598 ifaceobjcurr
.update_config_with_status('vrf-table',
601 self
.log_warn(str(e
))
603 def _query_check(self
, ifaceobj
, ifaceobjcurr
):
605 vrf_table
= ifaceobj
.get_attr_value_first('vrf-table')
607 self
._query
_check
_vrf
_dev
(ifaceobj
, ifaceobjcurr
, vrf_table
)
609 vrf
= ifaceobj
.get_attr_value_first('vrf')
611 self
._query
_check
_vrf
_slave
(ifaceobj
, ifaceobjcurr
, vrf
)
613 self
.log_warn(str(e
))
615 def _query_running(self
, ifaceobjrunning
, ifaceobj_getfunc
=None):
617 kind
= self
.ipcmd
.link_get_kind(ifaceobjrunning
.name
)
619 vrfdev_attrs
= self
.ipcmd
.link_get_linkinfo_attrs(ifaceobjrunning
.name
)
621 running_table
= vrfdev_attrs
.get('table')
623 ifaceobjrunning
.update_config('vrf-table',
625 elif kind
== 'vrf_slave':
626 vrf
= self
.ipcmd
.link_get_master(ifaceobjrunning
.name
)
628 ifaceobjrunning
.update_config('vrf', vrf
)
630 self
.log_warn(str(e
))
632 _run_ops
= {'pre-up' : _up
,
634 'query-running' : _query_running
,
635 'query-checkcurr' : _query_check
}
638 """ returns list of ops supported by this module """
639 return self
._run
_ops
.keys()
641 def _init_command_handlers(self
):
642 flags
= self
.get_flags()
644 self
.ipcmd
= iproute2(**flags
)
646 self
.bondcmd
= bondutil(**flags
)
647 if not self
.dhclientcmd
:
648 self
.dhclientcmd
= dhclient(**flags
)
650 def run(self
, ifaceobj
, operation
, query_ifaceobj
=None,
651 ifaceobj_getfunc
=None, **extra_args
):
652 """ run bond configuration on the interface object passed as argument
655 **ifaceobj** (object): iface object
657 **operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
661 **query_ifaceobj** (object): query check ifaceobject. This is only
662 valid when op is 'query-checkcurr'. It is an object same as
663 ifaceobj, but contains running attribute values and its config
664 status. The modules can use it to return queried running state
665 of interfaces. status is success if the running state is same
666 as user required state in ifaceobj. error otherwise.
668 op_handler
= self
._run
_ops
.get(operation
)
671 self
._init
_command
_handlers
()
672 if operation
== 'query-checkcurr':
673 op_handler(self
, ifaceobj
, query_ifaceobj
)
675 op_handler(self
, ifaceobj
, ifaceobj_getfunc
=ifaceobj_getfunc
)