Skip to content

Commit 2dd2683

Browse files
committed
xenserver: Support fail_mode override at network level.
This patch allows the Pool object's vswitch-controller-fail-mode setting to be overridden on by Network object. Signed-off-by: Ethan Jackson <ethan@nicira.com>
1 parent bfee9bd commit 2dd2683

3 files changed

Lines changed: 48 additions & 13 deletions

xenserver/etc_xapi.d_plugins_openvswitch-cfg-update

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,43 @@ def update(session, args):
8484
ret_str += "Successfully set controller to %s. " % controller
8585

8686
try:
87-
fail_mode = pool["other_config"]["vswitch-controller-fail-mode"]
87+
pool_fail_mode = pool["other_config"]["vswitch-controller-fail-mode"]
8888
except KeyError, e:
89-
fail_mode = None
89+
pool_fail_mode = None
9090

91-
if fail_mode != 'secure':
92-
fail_mode = 'standalone'
91+
bton = {}
92+
93+
for n in session.xenapi.network.get_all():
94+
rec = session.xenapi.network.get_record(n)
95+
try:
96+
bton[rec['bridge']] = rec
97+
except KeyError:
98+
pass
9399

94100
fail_mode_changed = False
95101
for bridge in vswitchCfgQuery(['list-br']).split():
96102
bridge = vswitchCfgQuery(['br-to-parent', bridge])
97103
bridge_fail_mode = vswitchCfgQuery(["get", "Bridge",
98104
bridge, "fail_mode"]).strip('[]"')
99105

106+
try:
107+
fail_mode = bton[bridge]["other_config"]["vswitch-controller-fail-mode"]
108+
except KeyError, e:
109+
fail_mode = None
110+
111+
if fail_mode not in ['secure', 'standalone']:
112+
fail_mode = pool_fail_mode
113+
114+
if fail_mode != 'secure':
115+
fail_mode = 'standalone'
116+
100117
if bridge_fail_mode != fail_mode:
101118
vswitchCfgMod(['--', 'set', 'Bridge', bridge,
102119
"fail_mode=%s" % fail_mode])
103120
fail_mode_changed = True
104121

105122
if fail_mode_changed:
106-
ret_str += "Set fail_mode to %s. " % fail_mode
123+
ret_str += "Updated fail_mode. "
107124

108125
if ret_str != '':
109126
return ret_str

xenserver/opt_xensource_libexec_InterfaceReconfigure.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ def _otherconfig_from_xml(n, attrs):
331331
lambda n: _strlist_from_xml(n, 'slaves', 'slave')),
332332
}
333333

334-
_NETWORK_OTHERCONFIG_ATTRS = [ 'mtu', 'static-routes' ] + _ETHTOOL_OTHERCONFIG_ATTRS
334+
_NETWORK_OTHERCONFIG_ATTRS = [ 'mtu', 'static-routes', 'vswitch-controller-fail-mode' ] + _ETHTOOL_OTHERCONFIG_ATTRS
335335

336336
_NETWORK_ATTRS = { 'uuid': (_str_to_xml,_str_from_xml),
337337
'bridge': (_str_to_xml,_str_from_xml),
@@ -604,10 +604,21 @@ def get_pifs_by_device(self, device):
604604
filter(lambda (ref,rec): rec['device'] == device,
605605
self.__pifs.items()))
606606

607+
def get_networks_with_bridge(self, bridge):
608+
return map(lambda (ref,rec): ref,
609+
filter(lambda (ref,rec): rec['bridge'] == bridge,
610+
self.__networks.items()))
611+
612+
def get_network_by_bridge(self, bridge):
613+
#Assumes one network has bridge.
614+
try:
615+
return self.get_networks_with_bridge(bridge)[0]
616+
except KeyError:
617+
return None
618+
607619
def get_pif_by_bridge(self, bridge):
608-
networks = map(lambda (ref,rec): ref,
609-
filter(lambda (ref,rec): rec['bridge'] == bridge,
610-
self.__networks.items()))
620+
networks = self.get_networks_with_bridge(bridge)
621+
611622
if len(networks) == 0:
612623
raise Error("No matching network \"%s\"" % bridge)
613624

xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,14 +332,21 @@ def configure_datapath(pif):
332332
'other-config:hwaddr=%s' % vsctl_escape(db().get_pif_record(pif)['MAC'])]
333333

334334
pool = db().get_pool_record()
335+
network = db().get_network_by_bridge(bridge)
336+
fail_mode = None
337+
valid_fail_modes = ['standalone', 'secure']
335338

336-
if pool:
339+
if network:
340+
network_rec = db().get_network_record(network)
341+
fail_mode = network_rec['other_config'].get('vswitch-controller-fail-mode')
342+
343+
if (fail_mode not in valid_fail_modes) and pool:
337344
fail_mode = pool['other_config'].get('vswitch-controller-fail-mode')
338-
else:
345+
346+
if fail_mode not in valid_fail_modes:
339347
fail_mode = 'standalone'
340348

341-
if fail_mode in ['standalone', 'secure']:
342-
vsctl_argv += ['--', 'set', 'Bridge', bridge, 'fail_mode=%s' % fail_mode]
349+
vsctl_argv += ['--', 'set', 'Bridge', bridge, 'fail_mode=%s' % fail_mode]
343350

344351
vsctl_argv += set_br_external_ids(pif)
345352
vsctl_argv += ['## done configuring datapath %s' % bridge]

0 commit comments

Comments
 (0)