]> git.proxmox.com Git - mirror_ifupdown2.git/blame - addons/address.py
addons: vrf: flush addresses and down slaves before deleting vrf device
[mirror_ifupdown2.git] / addons / address.py
CommitLineData
15ef32ea
RP
1#!/usr/bin/python
2#
3# Copyright 2014 Cumulus Networks, Inc. All rights reserved.
4# Author: Roopa Prabhu, roopa@cumulusnetworks.com
5#
6
9087e727
JF
7import os
8
15ef32ea
RP
9try:
10 from ipaddr import IPNetwork
11 from sets import Set
12 from ifupdown.iface import *
13 from ifupdownaddons.modulebase import moduleBase
14 from ifupdownaddons.iproute2 import iproute2
15 from ifupdownaddons.dhclient import dhclient
84f33af6 16 import ifupdown.policymanager as policymanager
264dcaa0 17 import ifupdown.rtnetlink_api as rtnetlink_api
0582f185 18 import ifupdown.ifupdownconfig as ifupdownConfig
fc5e1735 19 import ifupdown.ifupdownflags as ifupdownflags
15ef32ea
RP
20except ImportError, e:
21 raise ImportError (str(e) + "- required module not found")
22
23class address(moduleBase):
24 """ ifupdown2 addon module to configure address, mtu, hwaddress, alias
25 (description) on an interface """
26
27 _modinfo = {'mhelp' : 'address configuration module for interfaces',
28 'attrs': {
29 'address' :
30 {'help' : 'ipv4 or ipv6 addresses',
31 'example' : ['address 10.0.12.3/24',
32 'address 2000:1000:1000:1000:3::5/128']},
33 'netmask' :
34 {'help': 'netmask',
35 'example' : ['netmask 255.255.255.0'],
36 'compat' : True},
37 'broadcast' :
38 {'help': 'broadcast address',
39 'example' : ['broadcast 10.0.1.255']},
40 'scope' :
41 {'help': 'scope',
42 'example' : ['scope host']},
43 'preferred-lifetime' :
44 {'help': 'preferred lifetime',
45 'example' : ['preferred-lifetime forever',
46 'preferred-lifetime 10']},
47 'gateway' :
48 {'help': 'default gateway',
49 'example' : ['gateway 255.255.255.0']},
50 'mtu' :
51 { 'help': 'interface mtu',
52 'example' : ['mtu 1600'],
53 'default' : '1500'},
54 'hwaddress' :
55 {'help' : 'hw address',
56 'example': ['hwaddress 44:38:39:00:27:b8']},
57 'alias' :
58 { 'help': 'description/alias',
394e68b5
RP
59 'example' : ['alias testnetwork']},
60 'address-purge' :
61 { 'help': 'purge existing addresses. By default ' +
62 'any existing ip addresses on an interface are ' +
63 'purged to match persistant addresses in the ' +
64 'interfaces file. Set this attribute to \'no\'' +
65 'if you want to preserve existing addresses',
66 'default' : 'yes',
a794fb31
BR
67 'example' : ['address-purge yes/no']},
68 'clagd-vxlan-anycast-ip' :
69 { 'help' : 'Anycast local IP address for ' +
70 'dual connected VxLANs',
71 'example' : ['clagd-vxlan-anycast-ip 36.0.0.11']}}}
15ef32ea
RP
72
73 def __init__(self, *args, **kargs):
74 moduleBase.__init__(self, *args, **kargs)
75 self.ipcmd = None
8e113d63 76 self._bridge_fdb_query_cache = {}
84f33af6 77 self.default_mtu = policymanager.policymanager_api.get_attr_default(module_name=self.__class__.__name__, attr='mtu')
15ef32ea 78
75afe2a7
RP
79 def _address_valid(self, addrs):
80 if not addrs:
81 return False
82 if any(map(lambda a: True if a[:7] != '0.0.0.0'
83 else False, addrs)):
84 return True
85 return False
86
428206bf 87 def _get_hwaddress(self, ifaceobj):
2876ca35 88 hwaddress = ifaceobj.get_attr_value_first('hwaddress')
428206bf
JF
89 if hwaddress and hwaddress.startswith("ether"):
90 hwaddress = hwaddress[5:].strip()
91 return hwaddress
92
93 def _process_bridge(self, ifaceobj, up):
94 hwaddress = self._get_hwaddress(ifaceobj)
75afe2a7
RP
95 addrs = ifaceobj.get_attr_value_first('address')
96 is_vlan_dev_on_vlan_aware_bridge = False
97 is_bridge = self.ipcmd.is_bridge(ifaceobj.name)
98 if not is_bridge:
99 if '.' in ifaceobj.name:
100 (bridgename, vlan) = ifaceobj.name.split('.')
101 is_vlan_dev_on_vlan_aware_bridge = self.ipcmd.bridge_is_vlan_aware(bridgename)
8c2c9f26
RP
102 if ((is_bridge and not self.ipcmd.bridge_is_vlan_aware(ifaceobj.name))
103 or is_vlan_dev_on_vlan_aware_bridge):
75afe2a7
RP
104 if self._address_valid(addrs):
105 if up:
106 self.write_file('/proc/sys/net/ipv4/conf/%s' %ifaceobj.name +
107 '/arp_accept', '1')
108 else:
109 self.write_file('/proc/sys/net/ipv4/conf/%s' %ifaceobj.name +
110 '/arp_accept', '0')
111 if hwaddress and is_vlan_dev_on_vlan_aware_bridge:
112 if up:
113 self.ipcmd.bridge_fdb_add(bridgename, hwaddress, vlan)
114 else:
115 self.ipcmd.bridge_fdb_del(bridgename, hwaddress, vlan)
cb46a208 116
0582f185
RP
117 def _get_anycast_addr(self, ifaceobjlist):
118 for ifaceobj in ifaceobjlist:
119 anycast_addr = ifaceobj.get_attr_value_first('clagd-vxlan-anycast-ip')
120 if anycast_addr:
121 anycast_addr = anycast_addr+'/32'
122 return anycast_addr
123 return None
124
125 def _inet_address_convert_to_cidr(self, ifaceobjlist):
15ef32ea 126 newaddrs = []
0582f185
RP
127 newaddr_attrs = {}
128
129 for ifaceobj in ifaceobjlist:
130 addrs = ifaceobj.get_attr_value('address')
131 if not addrs:
132 continue
133
858a230f
RP
134 if (((ifaceobj.role & ifaceRole.SLAVE) and
135 not (ifaceobj.link_privflags & ifaceLinkPrivFlags.VRF_SLAVE)) or
136 ((ifaceobj.link_kind & ifaceLinkKind.BRIDGE) and
137 (ifaceobj.link_privflags & ifaceLinkPrivFlags.BRIDGE_VLAN_AWARE))):
e6a66e79
RP
138 # we must not configure an IP address if the interface is
139 # enslaved or is a VLAN AWARE BRIDGE
140 self.logger.info('%s: ignoring ip address. Interface is '
141 'enslaved or a vlan aware bridge and cannot'
142 ' have an IP Address' %(ifaceobj.name))
0582f185 143 return (False, newaddrs, newaddr_attrs)
15ef32ea
RP
144 # If user address is not in CIDR notation, convert them to CIDR
145 for addr_index in range(0, len(addrs)):
146 addr = addrs[addr_index]
147 if '/' in addr:
148 newaddrs.append(addr)
149 continue
494d31d2 150 newaddr = addr
15ef32ea
RP
151 netmask = ifaceobj.get_attr_value_n('netmask', addr_index)
152 if netmask:
153 prefixlen = IPNetwork('%s' %addr +
154 '/%s' %netmask).prefixlen
0582f185
RP
155 newaddr = addr + '/%s' %prefixlen
156 newaddrs.append(newaddr)
15ef32ea 157
0582f185
RP
158 attrs = {}
159 for a in ['broadcast', 'pointopoint', 'scope',
160 'preferred-lifetime']:
161 aval = ifaceobj.get_attr_value_n(a, addr_index)
162 if aval:
72c964c2 163 attrs[a] = aval
0582f185
RP
164
165 if attrs:
166 newaddr_attrs[newaddr]= attrs
167 return (True, newaddrs, newaddr_attrs)
168
169 def _inet_address_config(self, ifaceobj, ifaceobj_getfunc=None):
170 squash_addr_config = (True if \
171 ifupdownConfig.config.get('addr_config_squash', \
172 '0') == '1' else False)
173
174 if (squash_addr_config and
175 not (ifaceobj.flags & ifaceobj.YOUNGEST_SIBLING)):
176 return
177
178 purge_addresses = ifaceobj.get_attr_value_first('address-purge')
179 if not purge_addresses:
180 purge_addresses = 'yes'
181
182 if squash_addr_config and ifaceobj.flags & iface.HAS_SIBLINGS:
183 ifaceobjlist = ifaceobj_getfunc(ifaceobj.name)
184 else:
185 ifaceobjlist = [ifaceobj]
186
187 (addr_supported, newaddrs, newaddr_attrs) = self._inet_address_convert_to_cidr(ifaceobjlist)
188 if not addr_supported:
189 return
190 if (not squash_addr_config and (ifaceobj.flags & iface.HAS_SIBLINGS)):
191 # if youngest sibling and squash addr is not set
192 # print a warning that addresses will not be purged
193 if (ifaceobj.flags & iface.YOUNGEST_SIBLING):
194 self.logger.warn('%s: interface has multiple ' %ifaceobj.name +
195 'iface stanzas, skip purging existing addresses')
196 purge_addresses = 'no'
197
fc5e1735 198 if not ifupdownflags.flags.PERFMODE and purge_addresses == 'yes':
0582f185
RP
199 # if perfmode is not set and purge addresses is not set to 'no'
200 # lets purge addresses not in the config
15ef32ea 201 runningaddrs = self.ipcmd.addr_get(ifaceobj.name, details=False)
0582f185 202
a794fb31
BR
203 # if anycast address is configured on 'lo' and is in running config
204 # add it to newaddrs so that ifreload doesn't wipe it out
0582f185
RP
205 anycast_addr = self._get_anycast_addr(ifaceobjlist)
206
a794fb31
BR
207 if runningaddrs and anycast_addr and anycast_addr in runningaddrs:
208 newaddrs.append(anycast_addr)
15ef32ea
RP
209 if newaddrs == runningaddrs:
210 return
211 try:
212 # if primary address is not same, there is no need to keep any.
213 # reset all addresses
214 if (newaddrs and runningaddrs and
215 (newaddrs[0] != runningaddrs[0])):
216 self.ipcmd.del_addr_all(ifaceobj.name)
217 else:
218 self.ipcmd.del_addr_all(ifaceobj.name, newaddrs)
219 except Exception, e:
220 self.log_warn(str(e))
221 if not newaddrs:
222 return
223 for addr_index in range(0, len(newaddrs)):
224 try:
0582f185
RP
225 if newaddr_attrs:
226 self.ipcmd.addr_add(ifaceobj.name, newaddrs[addr_index],
227 newaddr_attrs.get(newaddrs[addr_index],
228 {}).get('broadcast'),
229 newaddr_attrs.get(newaddrs[addr_index],
230 {}).get('pointopoint'),
231 newaddr_attrs.get(newaddrs[addr_index],
232 {}).get('scope'),
233 newaddr_attrs.get(newaddrs[addr_index],
234 {}).get('preferred-lifetime'))
235 else:
236 self.ipcmd.addr_add(ifaceobj.name, newaddrs[addr_index])
15ef32ea
RP
237 except Exception, e:
238 self.log_error(str(e))
239
0582f185 240 def _up(self, ifaceobj, ifaceobj_getfunc=None):
15ef32ea
RP
241 if not self.ipcmd.link_exists(ifaceobj.name):
242 return
68d9fee0 243 addr_method = ifaceobj.addr_method
15ef32ea
RP
244 try:
245 # release any stale dhcp addresses if present
fc5e1735 246 if (addr_method != "dhcp" and not ifupdownflags.flags.PERFMODE and
15ef32ea
RP
247 not (ifaceobj.flags & iface.HAS_SIBLINGS)):
248 # if not running in perf mode and ifaceobj does not have
249 # any sibling iface objects, kill any stale dhclient
250 # processes
75afe2a7 251 dhclientcmd = dhclient()
15ef32ea
RP
252 if dhclient.is_running(ifaceobj.name):
253 # release any dhcp leases
254 dhclientcmd.release(ifaceobj.name)
255 elif dhclient.is_running6(ifaceobj.name):
256 dhclientcmd.release6(ifaceobj.name)
257 except:
258 pass
8e113d63 259
15ef32ea 260 self.ipcmd.batch_start()
68d9fee0 261 if addr_method != "dhcp":
0582f185 262 self._inet_address_config(ifaceobj, ifaceobj_getfunc)
15ef32ea
RP
263 mtu = ifaceobj.get_attr_value_first('mtu')
264 if mtu:
8e113d63 265 self.ipcmd.link_set(ifaceobj.name, 'mtu', mtu)
13e22530
RP
266
267 # logical devices like bridges and vlan devices rely on mtu
268 # from their lower devices. ie mtu travels from
269 # lower devices to upper devices. For bonds mtu travels from
270 # upper to lower devices. running mtu depends on upper and
271 # lower device mtu. With all this implicit mtu
272 # config by the kernel in play, it becomes almost impossible
273 # to decide if the running mtu is valid. It will require
274 # some more thinking. Commenting this for now.
275 #elif self.default_mtu:
276 # running_mtu = self.ipcmd.link_get_mtu(ifaceobj.name)
277 # if running_mtu != self.default_mtu:
278 # self.ipcmd.link_set(ifaceobj.name, 'mtu', self.default_mtu)
279
15ef32ea
RP
280 alias = ifaceobj.get_attr_value_first('alias')
281 if alias:
8e113d63 282 self.ipcmd.link_set_alias(ifaceobj.name, alias)
264dcaa0
RP
283 self.ipcmd.batch_commit()
284
428206bf 285 hwaddress = self._get_hwaddress(ifaceobj)
cb46a208 286 if hwaddress:
264dcaa0 287 running_hwaddress = None
fc5e1735 288 if not ifupdownflags.flags.PERFMODE: # system is clean
2876ca35 289 running_hwaddress = self.ipcmd.link_get_hwaddress(ifaceobj.name)
264dcaa0
RP
290 if hwaddress != running_hwaddress:
291 slave_down = False
292 rtnetlink_api.rtnl_api.link_set(ifaceobj.name, "down")
293 if ifaceobj.link_kind & ifaceLinkKind.BOND:
294 # if bond, down all the slaves
295 if ifaceobj.lowerifaces:
296 for l in ifaceobj.lowerifaces:
297 rtnetlink_api.rtnl_api.link_set(l, "down")
298 slave_down = True
299 try:
300 self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
301 finally:
302 rtnetlink_api.rtnl_api.link_set(ifaceobj.name, "up")
303 if slave_down:
304 for l in ifaceobj.lowerifaces:
305 rtnetlink_api.rtnl_api.link_set(l, "up")
cb46a208 306
68d9fee0
RP
307 try:
308 # Handle special things on a bridge
309 self._process_bridge(ifaceobj, True)
310 except Exception, e:
311 self.log_warn('%s: %s' %(ifaceobj.name, str(e)))
312 pass
cb46a208 313
68d9fee0
RP
314 if addr_method != "dhcp":
315 self.ipcmd.route_add_gateway(ifaceobj.name,
016e9325
N
316 ifaceobj.get_attr_value_first('gateway'),
317 ifaceobj.get_attr_value_first('vrf'))
15ef32ea 318
0582f185 319 def _down(self, ifaceobj, ifaceobj_getfunc=None):
15ef32ea
RP
320 try:
321 if not self.ipcmd.link_exists(ifaceobj.name):
322 return
68d9fee0
RP
323 addr_method = ifaceobj.addr_method
324 if addr_method != "dhcp":
325 self.ipcmd.route_del_gateway(ifaceobj.name,
15ef32ea 326 ifaceobj.get_attr_value_first('gateway'),
016e9325 327 ifaceobj.get_attr_value_first('vrf'),
15ef32ea 328 ifaceobj.get_attr_value_first('metric'))
aa052170
N
329 if ifaceobj.get_attr_value_first('address-purge')=='no':
330 addrlist = ifaceobj.get_attr_value('address')
331 for addr in addrlist:
332 self.ipcmd.addr_del(ifaceobj.name, addr)
333 #self.ipcmd.addr_del(ifaceobj.name, ifaceobj.get_attr_value('address')[0])
334 else:
335 self.ipcmd.del_addr_all(ifaceobj.name)
84f33af6
JF
336 mtu = ifaceobj.get_attr_value_first('mtu')
337 if (mtu and self.default_mtu and (mtu != self.default_mtu)):
338 self.ipcmd.link_set(ifaceobj.name, 'mtu', self.default_mtu)
15ef32ea
RP
339 alias = ifaceobj.get_attr_value_first('alias')
340 if alias:
9087e727 341 filename = '/sys/class/net/%s/ifalias' %ifaceobj.name
a4a53f4b 342 self.logger.info('executing echo "" > %s' %filename)
9087e727 343 os.system('echo "" > %s' %filename)
75afe2a7
RP
344 # XXX hwaddress reset cannot happen because we dont know last
345 # address.
346
347 # Handle special things on a bridge
348 self._process_bridge(ifaceobj, False)
15ef32ea 349 except Exception, e:
bcf11b14
RP
350 self.logger.debug('%s : %s' %(ifaceobj.name, str(e)))
351 pass
15ef32ea
RP
352
353 def _get_iface_addresses(self, ifaceobj):
354 addrlist = ifaceobj.get_attr_value('address')
355 outaddrlist = []
356
357 if not addrlist: return None
358 for addrindex in range(0, len(addrlist)):
359 addr = addrlist[addrindex]
360 netmask = ifaceobj.get_attr_value_n('netmask', addrindex)
361 if netmask:
362 prefixlen = IPNetwork('%s' %addr +
363 '/%s' %netmask).prefixlen
364 addr = addr + '/%s' %prefixlen
365 outaddrlist.append(addr)
366 return outaddrlist
367
8e113d63
RP
368 def _get_bridge_fdbs(self, bridgename, vlan):
369 fdbs = self._bridge_fdb_query_cache.get(bridgename)
370 if not fdbs:
371 fdbs = self.ipcmd.bridge_fdb_show_dev(bridgename)
372 if not fdbs:
373 return
374 self._bridge_fdb_query_cache[bridgename] = fdbs
375 return fdbs.get(vlan)
376
377 def _check_addresses_in_bridge(self, ifaceobj, hwaddress):
378 """ If the device is a bridge, make sure the addresses
379 are in the bridge """
380 if '.' in ifaceobj.name:
381 (bridgename, vlan) = ifaceobj.name.split('.')
382 if self.ipcmd.bridge_is_vlan_aware(bridgename):
383 fdb_addrs = self._get_bridge_fdbs(bridgename, vlan)
384 if not fdb_addrs or hwaddress not in fdb_addrs:
385 return False
386 return True
387
0582f185 388 def _query_check(self, ifaceobj, ifaceobjcurr, ifaceobj_getfunc=None):
15ef32ea
RP
389 runningaddrsdict = None
390 if not self.ipcmd.link_exists(ifaceobj.name):
391 self.logger.debug('iface %s not found' %ifaceobj.name)
392 return
16d854b4 393 addr_method = ifaceobj.addr_method
15ef32ea
RP
394 self.query_n_update_ifaceobjcurr_attr(ifaceobj, ifaceobjcurr,
395 'mtu', self.ipcmd.link_get_mtu)
428206bf 396 hwaddress = self._get_hwaddress(ifaceobj)
8e113d63 397 if hwaddress:
2876ca35 398 rhwaddress = self.ipcmd.link_get_hwaddress(ifaceobj.name)
8e113d63
RP
399 if not rhwaddress or rhwaddress != hwaddress:
400 ifaceobjcurr.update_config_with_status('hwaddress', rhwaddress,
401 1)
402 elif not self._check_addresses_in_bridge(ifaceobj, hwaddress):
403 # XXX: hw address is not in bridge
404 ifaceobjcurr.update_config_with_status('hwaddress', rhwaddress,
405 1)
406 ifaceobjcurr.status_str = 'bridge fdb error'
407 else:
408 ifaceobjcurr.update_config_with_status('hwaddress', rhwaddress,
409 0)
15ef32ea
RP
410 self.query_n_update_ifaceobjcurr_attr(ifaceobj, ifaceobjcurr,
411 'alias', self.ipcmd.link_get_alias)
412 # compare addresses
16d854b4
RP
413 if addr_method == 'dhcp':
414 return
15ef32ea
RP
415 addrs = self._get_iface_addresses(ifaceobj)
416 runningaddrsdict = self.ipcmd.addr_get(ifaceobj.name)
a794fb31
BR
417 # if anycast address is configured on 'lo' and is in running config
418 # add it to addrs so that query_check doesn't fail
419 anycast_addr = ifaceobj.get_attr_value_first('clagd-vxlan-anycast-ip')
420 if anycast_addr:
421 anycast_addr = anycast_addr+'/32'
422 if runningaddrsdict and anycast_addr and runningaddrsdict.get(anycast_addr):
423 addrs.append(anycast_addr)
15ef32ea
RP
424
425 # Set ifaceobjcurr method and family
426 ifaceobjcurr.addr_method = ifaceobj.addr_method
427 ifaceobjcurr.addr_family = ifaceobj.addr_family
428 if not runningaddrsdict and not addrs:
429 return
430 runningaddrs = runningaddrsdict.keys() if runningaddrsdict else []
431 if runningaddrs != addrs:
432 runningaddrsset = set(runningaddrs) if runningaddrs else set([])
433 addrsset = set(addrs) if addrs else set([])
434 if (ifaceobj.flags & iface.HAS_SIBLINGS):
435 if not addrsset:
436 return
437 # only check for addresses present in running config
438 addrsdiff = addrsset.difference(runningaddrsset)
439 for addr in addrs:
440 if addr in addrsdiff:
441 ifaceobjcurr.update_config_with_status('address',
442 addr, 1)
443 else:
444 ifaceobjcurr.update_config_with_status('address',
445 addr, 0)
446 else:
447 addrsdiff = addrsset.symmetric_difference(runningaddrsset)
448 for addr in addrsset.union(runningaddrsset):
449 if addr in addrsdiff:
450 ifaceobjcurr.update_config_with_status('address',
451 addr, 1)
452 else:
453 ifaceobjcurr.update_config_with_status('address',
454 addr, 0)
455 elif addrs:
456 [ifaceobjcurr.update_config_with_status('address',
457 addr, 0) for addr in addrs]
458 #XXXX Check broadcast address, scope, etc
459 return
460
0582f185 461 def _query_running(self, ifaceobjrunning, ifaceobj_getfunc=None):
15ef32ea
RP
462 if not self.ipcmd.link_exists(ifaceobjrunning.name):
463 self.logger.debug('iface %s not found' %ifaceobjrunning.name)
15ef32ea
RP
464 return
465 dhclientcmd = dhclient()
466 if (dhclientcmd.is_running(ifaceobjrunning.name) or
467 dhclientcmd.is_running6(ifaceobjrunning.name)):
468 # If dhcp is configured on the interface, we skip it
84f33af6 469 return
15ef32ea
RP
470 isloopback = self.ipcmd.link_isloopback(ifaceobjrunning.name)
471 if isloopback:
472 default_addrs = ['127.0.0.1/8', '::1/128']
473 ifaceobjrunning.addr_family = 'inet'
474 ifaceobjrunning.addr_method = 'loopback'
475 else:
476 default_addrs = []
477 runningaddrsdict = self.ipcmd.addr_get(ifaceobjrunning.name)
478 if runningaddrsdict:
479 [ifaceobjrunning.update_config('address', addr)
480 for addr, addrattrs in runningaddrsdict.items()
481 if addr not in default_addrs]
482 mtu = self.ipcmd.link_get_mtu(ifaceobjrunning.name)
483 if (mtu and
484 (ifaceobjrunning.name == 'lo' and mtu != '16436') or
485 (ifaceobjrunning.name != 'lo' and
486 mtu != self.get_mod_subattr('mtu', 'default'))):
487 ifaceobjrunning.update_config('mtu', mtu)
488 alias = self.ipcmd.link_get_alias(ifaceobjrunning.name)
84f33af6 489 if alias:
15ef32ea
RP
490 ifaceobjrunning.update_config('alias', alias)
491
492 _run_ops = {'up' : _up,
493 'down' : _down,
494 'query-checkcurr' : _query_check,
495 'query-running' : _query_running }
496
497 def get_ops(self):
498 """ returns list of ops supported by this module """
499 return self._run_ops.keys()
500
501 def _init_command_handlers(self):
502 if not self.ipcmd:
fc5e1735 503 self.ipcmd = iproute2()
15ef32ea 504
6e16e5ae 505 def run(self, ifaceobj, operation, query_ifaceobj=None, ifaceobj_getfunc=None):
15ef32ea
RP
506 """ run address configuration on the interface object passed as argument
507
508 Args:
509 **ifaceobj** (object): iface object
510
511 **operation** (str): any of 'up', 'down', 'query-checkcurr',
512 'query-running'
513 Kwargs:
514 query_ifaceobj (object): query check ifaceobject. This is only
515 valid when op is 'query-checkcurr'. It is an object same as
516 ifaceobj, but contains running attribute values and its config
517 status. The modules can use it to return queried running state
518 of interfaces. status is success if the running state is same
519 as user required state in ifaceobj. error otherwise.
520 """
8e113d63
RP
521 if ifaceobj.type == ifaceType.BRIDGE_VLAN:
522 return
15ef32ea
RP
523 op_handler = self._run_ops.get(operation)
524 if not op_handler:
525 return
15ef32ea
RP
526 self._init_command_handlers()
527 if operation == 'query-checkcurr':
0582f185
RP
528 op_handler(self, ifaceobj, query_ifaceobj,
529 ifaceobj_getfunc=ifaceobj_getfunc)
15ef32ea 530 else:
0582f185
RP
531 op_handler(self, ifaceobj,
532 ifaceobj_getfunc=ifaceobj_getfunc)