]> git.proxmox.com Git - mirror_ifupdown2.git/blame - addons/vxlan.py
fix kernel lacp_fallback_* sysfs file references to use lacp_bypass_*
[mirror_ifupdown2.git] / addons / vxlan.py
CommitLineData
15ef32ea
RP
1#!/usr/bin/python
2
3from ifupdown.iface import *
4from ifupdownaddons.modulebase import moduleBase
5from ifupdownaddons.iproute2 import iproute2
e8b4b06d 6import ifupdown.rtnetlink_api as rtnetlink_api
15ef32ea 7import logging
9e012f9e 8from sets import Set
15ef32ea
RP
9
10class vxlan(moduleBase):
11 _modinfo = {'mhelp' : 'vxlan module configures vxlan interfaces.',
12 'attrs' : {
13 'vxlan-id' :
14 {'help' : 'vxlan id',
15 'required' : True,
16 'example': ['vxlan-id 100']},
17 'vxlan-local-tunnelip' :
18 {'help' : 'vxlan local tunnel ip',
19 'example': ['vxlan-local-tunnelip 172.16.20.103']},
20 'vxlan-svcnodeip' :
21 {'help' : 'vxlan id',
22 'example': ['vxlan-svcnodeip 172.16.22.125']},
23 'vxlan-peernodeip' :
24 {'help' : 'vxlan peer node ip',
25 'example': ['vxlan-peernodeip 172.16.22.127']},
26 'vxlan-learning' :
27 {'help' : 'vxlan learning on/off',
28 'example': ['vxlan-learning on']},
29 }}
30
31 def __init__(self, *args, **kargs):
32 moduleBase.__init__(self, *args, **kargs)
33 self.ipcmd = None
34
35 def _is_vxlan_device(self, ifaceobj):
36 if ifaceobj.get_attr_value_first('vxlan-id'):
37 return True
38 return False
39
40 def _up(self, ifaceobj):
41 vxlanid = ifaceobj.get_attr_value_first('vxlan-id')
42 if vxlanid:
43 self.ipcmd.link_create_vxlan(ifaceobj.name, vxlanid,
44 localtunnelip=ifaceobj.get_attr_value_first('vxlan-local-tunnelip'),
45 svcnodeips=ifaceobj.get_attr_value('vxlan-svcnodeip'),
46 peernodeips=ifaceobj.get_attr_value('vxlan-peernodeip'),
47 learning=ifaceobj.get_attr_value_first('vxlan-learning'))
e8b4b06d
RP
48 if ifaceobj.addr_method == 'manual':
49 rtnetlink_api.rtnl_api.link_set(ifaceobj.name, "up")
15ef32ea
RP
50
51 def _down(self, ifaceobj):
52 try:
53 self.ipcmd.link_delete(ifaceobj.name)
54 except Exception, e:
55 self.log_warn(str(e))
56
9e012f9e
RP
57 def _query_check_n_update(self, ifaceobjcurr, attrname, attrval,
58 running_attrval):
59 if running_attrval and attrval == running_attrval:
60 ifaceobjcurr.update_config_with_status(attrname, attrval, 0)
61 else:
62 ifaceobjcurr.update_config_with_status(attrname, running_attrval, 1)
63
64 def _query_check_n_update_addresses(self, ifaceobjcurr, attrname,
65 addresses, running_addresses):
66 if addresses:
67 for a in addresses:
68 if a in running_addresses:
69 ifaceobjcurr.update_config_with_status(attrname, a, 0)
70 else:
71 ifaceobjcurr.update_config_with_status(attrname, a, 1)
72 running_addresses = Set(running_addresses).difference(
73 Set(addresses))
74 [ifaceobjcurr.update_config_with_status(attrname, a, 1)
75 for a in running_addresses]
76
15ef32ea
RP
77 def _query_check(self, ifaceobj, ifaceobjcurr):
78 if not self.ipcmd.link_exists(ifaceobj.name):
15ef32ea 79 return
15ef32ea 80 # Update vxlan object
9e012f9e
RP
81 vxlanattrs = self.ipcmd.get_vxlandev_attrs(ifaceobj.name)
82 if not vxlanattrs:
83 ifaceobjcurr.check_n_update_config_with_status_many(
84 self.get_mod_attrs(), -1)
85 return
86 self._query_check_n_update(ifaceobjcurr, 'vxlan-id',
87 ifaceobj.get_attr_value_first('vxlan-id'),
88 vxlanattrs.get('vxlanid'))
89
90 self._query_check_n_update(ifaceobjcurr, 'vxlan-local-tunnelip',
91 ifaceobj.get_attr_value_first('vxlan-local-tunnelip'),
92 vxlanattrs.get('local'))
93
94 self._query_check_n_update_addresses(ifaceobjcurr, 'vxlan-svcnodeip',
95 ifaceobj.get_attr_value('vxlan-svcnodeip'),
96 vxlanattrs.get('svcnode', []))
97
98 self._query_check_n_update_addresses(ifaceobjcurr, 'vxlan-peernodeip',
99 ifaceobj.get_attr_value('vxlan-peernodeip'),
100 vxlanattrs.get('peernode', []))
101
102 learning = ifaceobj.get_attr_value_first('vxlan-learning')
103 running_learning = vxlanattrs.get('learning')
104 if learning == running_learning:
105 ifaceobjcurr.update_config_with_status('vxlan-learning',
106 running_learning, 0)
107 else:
108 ifaceobjcurr.update_config_with_status('vxlan-learning',
109 running_learning, 1)
15ef32ea
RP
110
111 def _query_running(self, ifaceobjrunning):
9e012f9e
RP
112 vxlanattrs = self.ipcmd.get_vxlandev_attrs(ifaceobjrunning.name)
113 if not vxlanattrs:
114 return
3eee421a
RP
115 attrval = vxlanattrs.get('vxlanid')
116 if attrval:
117 ifaceobjrunning.update_config('vxlan-id', vxlanattrs.get('vxlanid'))
9e012f9e
RP
118 attrval = vxlanattrs.get('local')
119 if attrval:
120 ifaceobjrunning.update_config('vxlan-local-tunnelip', attrval)
121 attrval = vxlanattrs.get('svcnode')
122 if attrval:
123 [ifaceobjrunning.update_config('vxlan-svcnode', a)
124 for a in attrval]
125 attrval = vxlanattrs.get('peernode')
126 if attrval:
127 [ifaceobjrunning.update_config('vxlan-peernode', a)
128 for a in attrval]
129 attrval = vxlanattrs.get('learning')
130 if attrval and attrval == 'on':
131 ifaceobjrunning.update_config('vxlan-learning', 'on')
132
15ef32ea
RP
133
134 _run_ops = {'pre-up' : _up,
135 'post-down' : _down,
136 'query-checkcurr' : _query_check,
137 'query-running' : _query_running}
138
139 def get_ops(self):
140 return self._run_ops.keys()
141
142 def _init_command_handlers(self):
143 if not self.ipcmd:
144 self.ipcmd = iproute2(**self.get_flags())
145
84ca006f 146 def run(self, ifaceobj, operation, query_ifaceobj=None, **extra_args):
15ef32ea
RP
147 op_handler = self._run_ops.get(operation)
148 if not op_handler:
149 return
150 if (operation != 'query-running' and
151 not self._is_vxlan_device(ifaceobj)):
152 return
153 self._init_command_handlers()
154 if operation == 'query-checkcurr':
155 op_handler(self, ifaceobj, query_ifaceobj)
156 else:
157 op_handler(self, ifaceobj)