]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - addons/bridgevlan.py
3 # Copyright 2014 Cumulus Networks, Inc. All rights reserved.
4 # Author: Roopa Prabhu, roopa@cumulusnetworks.com
7 from ifupdown
.iface
import *
8 from ifupdownaddons
.modulebase
import moduleBase
9 from ifupdownaddons
.iproute2
import iproute2
10 from ifupdownaddons
.bridgeutils
import brctl
11 from ipaddr
import IPv4Address
12 import ifupdown
.ifupdownflags
as ifupdownflags
15 class bridgevlan(moduleBase
):
16 """ ifupdown2 addon module to configure vlan attributes on a vlan
19 _modinfo
= {'mhelp' : 'bridgevlan module configures vlan attributes ' +
20 'on a vlan aware bridge. This module only ' +
21 'understands vlan interface name ' +
22 'with dot notations. eg br0.100. where br0 is the ' +
23 'vlan aware bridge this config is for',
25 'bridge-igmp-querier-src' :
26 { 'help' : 'bridge igmp querier src. Must be ' +
27 'specified under the vlan interface',
28 'validvals' : ['<ipv4>', ],
29 'example' : ['bridge-igmp-querier-src 172.16.101.1']}}}
31 def __init__(self
, *args
, **kargs
):
32 moduleBase
.__init
__(self
, *args
, **kargs
)
36 def _is_bridge_vlan_device(self
, ifaceobj
):
37 if ifaceobj
.type == ifaceType
.BRIDGE_VLAN
:
41 def _get_bridge_n_vlan(self
, ifaceobj
):
42 vlist
= ifaceobj
.name
.split('.', 1)
44 return (vlist
[0], vlist
[1])
47 def _get_bridgename(self
, ifaceobj
):
48 vlist
= ifaceobj
.name
.split('.', 1)
53 def get_dependent_ifacenames(self
, ifaceobj
, ifaceobjs_all
=None):
54 if not self
._is
_bridge
_vlan
_device
(ifaceobj
):
56 return [self
._get
_bridgename
(ifaceobj
)]
58 def _up(self
, ifaceobj
):
60 (bridgename
, vlan
) = self
._get
_bridge
_n
_vlan
(ifaceobj
)
61 vlanid
= int(vlan
, 10)
63 self
.log_error('%s: bridge vlan interface name ' %ifaceobj
.name
+
64 'does not correspond to format (eg. br0.100)', ifaceobj
)
67 if not self
.ipcmd
.link_exists(bridgename
):
68 #self.logger.warn('%s: bridge %s does not exist' %(ifaceobj.name,
73 if not ifupdownflags
.flags
.PERFMODE
:
74 running_mcqv4src
= self
.brctlcmd
.get_mcqv4src(bridgename
)
76 r_mcqv4src
= running_mcqv4src
.get(vlan
)
79 mcqv4src
= ifaceobj
.get_attr_value_first('bridge-igmp-querier-src')
82 self
.brctlcmd
.del_mcqv4src(bridgename
, vlanid
)
85 if r_mcqv4src
and r_mcqv4src
!= mcqv4src
:
86 self
.brctlcmd
.del_mcqv4src(bridgename
, vlanid
)
87 self
.brctlcmd
.set_mcqv4src(bridgename
, vlanid
, mcqv4src
)
89 self
.brctlcmd
.set_mcqv4src(bridgename
, vlanid
, mcqv4src
)
91 def _down(self
, ifaceobj
):
93 (bridgename
, vlan
) = self
._get
_bridge
_n
_vlan
(ifaceobj
)
94 vlanid
= int(vlan
, 10)
96 self
.logger
.warn('%s: bridge vlan interface name ' %ifaceobj
.name
+
97 'does not correspond to format (eg. br0.100)')
100 if not self
.ipcmd
.link_exists(bridgename
):
101 #self.logger.warn('%s: bridge %s does not exist' %(ifaceobj.name,
104 mcqv4src
= ifaceobj
.get_attr_value_first('bridge-igmp-querier-src')
106 self
.brctlcmd
.del_mcqv4src(bridgename
, vlanid
)
108 def _query_running_bridge_igmp_querier_src(self
, ifaceobj
):
109 (bridgename
, vlanid
) = ifaceobj
.name
.split('.')
110 running_mcqv4src
= self
.brctlcmd
.get_mcqv4src(bridgename
)
112 return running_mcqv4src
.get(vlanid
)
115 def _query_check(self
, ifaceobj
, ifaceobjcurr
):
116 attrval
= ifaceobj
.get_attr_value_first('bridge-igmp-querier-src')
118 running_mcq
= self
._query
_running
_bridge
_igmp
_querier
_src
(ifaceobj
)
119 if not running_mcq
or running_mcq
!= attrval
:
120 ifaceobjcurr
.update_config_with_status(
121 'bridge-igmp-querier-src', running_mcq
, 1)
123 ifaceobjcurr
.update_config_with_status(
124 'bridge-igmp-querier-src', attrval
, 0)
125 ifaceobjcurr
.status
= ifaceStatus
.SUCCESS
128 def _query_running(self
, ifaceobjrunning
):
132 _run_ops
= {'pre-up' : _up
,
134 'query-checkcurr' : _query_check
,
135 'query-running' : _query_running
}
138 """ returns list of ops supported by this module """
139 return self
._run
_ops
.keys()
141 def _init_command_handlers(self
):
143 self
.ipcmd
= iproute2()
144 if not self
.brctlcmd
:
145 self
.brctlcmd
= brctl()
147 def run(self
, ifaceobj
, operation
, query_ifaceobj
=None, **extra_args
):
148 """ run vlan configuration on the interface object passed as argument
151 **ifaceobj** (object): iface object
153 **operation** (str): any of 'pre-up', 'post-down', 'query-checkcurr',
156 **query_ifaceobj** (object): query check ifaceobject. This is only
157 valid when op is 'query-checkcurr'. It is an object same as
158 ifaceobj, but contains running attribute values and its config
159 status. The modules can use it to return queried running state
160 of interfaces. status is success if the running state is same
161 as user required state in ifaceobj. error otherwise.
163 op_handler
= self
._run
_ops
.get(operation
)
166 if (operation
!= 'query-running' and
167 not self
._is
_bridge
_vlan
_device
(ifaceobj
)):
169 self
._init
_command
_handlers
()
170 if operation
== 'query-checkcurr':
171 op_handler(self
, ifaceobj
, query_ifaceobj
)
173 op_handler(self
, ifaceobj
)