This patch exposes the 'macvtap_mode' nicparam to the LUNetworkConnect logical unit, so that a user can also handle MacVTap networks. Also it makes use of the ComputeMacvtapModeNicParam function to validate and compute the macvtap_mode nicparam before connecting it to the respective network.
Signed-off-by: Dimitris Bliablias <db...@skroutz.gr> --- lib/client/gnt_network.py | 2 ++ lib/cmdlib/network.py | 13 +++++++++++++ lib/objects.py | 2 +- lib/rapi/client.py | 3 ++- src/Ganeti/OpCodes.hs | 1 + src/Ganeti/OpParams.hs | 7 +++++++ test/hs/Test/Ganeti/OpCodes.hs | 5 +++-- 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/client/gnt_network.py b/lib/client/gnt_network.py index 4fb060b..e32b955 100644 --- a/lib/client/gnt_network.py +++ b/lib/client/gnt_network.py @@ -124,6 +124,7 @@ def ConnectNetwork(opts, args): network = args[0] nicparams = objects.FillDict(constants.NICC_DEFAULTS, opts.nicparams) + macvtap_mode = nicparams[constants.NIC_MACVTAP_MODE] groups = _GetDefaultGroups(cl, args[1:]) @@ -134,6 +135,7 @@ def ConnectNetwork(opts, args): network_mode=nicparams[constants.NIC_MODE], network_link=nicparams[constants.NIC_LINK], network_vlan=nicparams[constants.NIC_VLAN], + network_macvtap_mode=macvtap_mode, conflicts_check=opts.conflicts_check) SubmitOpCode(op, opts=opts, cl=cl) diff --git a/lib/cmdlib/network.py b/lib/cmdlib/network.py index ec112d8..04da5a4 100644 --- a/lib/cmdlib/network.py +++ b/lib/cmdlib/network.py @@ -38,6 +38,7 @@ from ganeti import objects from ganeti import utils from ganeti.cmdlib.base import LogicalUnit from ganeti.cmdlib.common import CheckNodeGroupInstances +from ganeti.cmdlib.instance_utils import ComputeMacvtapModeNicParam def _BuildNetworkHookEnv(name, subnet, gateway, network6, gateway6, @@ -456,6 +457,7 @@ class LUNetworkConnect(LogicalUnit): self.network_mode = self.op.network_mode self.network_link = self.op.network_link self.network_vlan = self.op.network_vlan + self.network_macvtap_mode = self.op.network_macvtap_mode self.network_uuid = self.cfg.LookupNetwork(self.network_name) self.group_uuid = self.cfg.LookupNodeGroup(self.group_name) @@ -487,6 +489,7 @@ class LUNetworkConnect(LogicalUnit): "GROUP_NETWORK_MODE": self.network_mode, "GROUP_NETWORK_LINK": self.network_link, "GROUP_NETWORK_VLAN": self.network_vlan, + "GROUP_NETWORK_MACVTAP_MODE": self.network_macvtap_mode, } return ret @@ -508,13 +511,21 @@ class LUNetworkConnect(LogicalUnit): constants.NIC_MODE: self.network_mode, constants.NIC_LINK: self.network_link, constants.NIC_VLAN: self.network_vlan, + constants.NIC_MACVTAP_MODE: self.network_macvtap_mode, } + if self.network_mode == constants.NIC_MODE_MACVTAP: + self.netparams[constants.NIC_MACVTAP_MODE] = \ + ComputeMacvtapModeNicParam(self.network_macvtap_mode) objects.NIC.CheckParameterSyntax(self.netparams) self.group = self.cfg.GetNodeGroup(self.group_uuid) #if self.network_mode == constants.NIC_MODE_BRIDGED: # _CheckNodeGroupBridgesExist(self, self.network_link, self.group_uuid) + #if self.network_mode == constants.NIC_MODE_MACVTAP: + # TODO: the _CheckNodeGroupNetdevsExist function should be implemented + # along with the _CheckNodeGroupBridgesExist equivalent + # _CheckNodeGroupNetdevsExist(self, self.network_link, self.group_uuid) self.connected = False if self.network_uuid in self.group.networks: self.LogWarning("Network '%s' is already mapped to group '%s'" % @@ -578,6 +589,8 @@ class LUNetworkDisconnect(LogicalUnit): "GROUP_NETWORK_MODE": self.netparams[constants.NIC_MODE], "GROUP_NETWORK_LINK": self.netparams[constants.NIC_LINK], "GROUP_NETWORK_VLAN": self.netparams[constants.NIC_VLAN], + "GROUP_NETWORK_MACVTAP_MODE": + self.netparams[constants.NIC_MACVTAP_MODE], }) return ret diff --git a/lib/objects.py b/lib/objects.py index f53f846..314f3e5 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -2479,7 +2479,7 @@ class SerializableConfigParser(ConfigParser.SafeConfigParser, object): if value.lower() == constants.VALUE_NONE: value = None except ConfigParser.NoOptionError: - r = re.compile(r"(disk|nic)\d+_name|nic\d+_(network|vlan)") + r = re.compile(r"(disk|nic)\d+_name|nic\d+_(network|vlan|macvtap_mode)") match = r.match(option) if match: pass diff --git a/lib/rapi/client.py b/lib/rapi/client.py index c1f0aba..3491738 100644 --- a/lib/rapi/client.py +++ b/lib/rapi/client.py @@ -2049,7 +2049,7 @@ class GanetiRapiClient(object): # pylint: disable=R0904 query, body) def ConnectNetwork(self, network_name, group_name, mode, link, - vlan="", dry_run=False, reason=None): + vlan="", macvtap_mode="", dry_run=False, reason=None): """Connects a Network to a NodeGroup with the given netparams """ @@ -2058,6 +2058,7 @@ class GanetiRapiClient(object): # pylint: disable=R0904 "network_mode": mode, "network_link": link, "network_vlan": vlan, + "network_macvtap_mode": macvtap_mode, } query = [] diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs index 8b0dc91..abb5bc0 100644 --- a/src/Ganeti/OpCodes.hs +++ b/src/Ganeti/OpCodes.hs @@ -985,6 +985,7 @@ $(genOpCode "OpCode" , pNetworkMode , pNetworkLink , pNetworkVlan + , pNetworkMacvtapMode , pIpConflictsCheck ], "network_name") diff --git a/src/Ganeti/OpParams.hs b/src/Ganeti/OpParams.hs index a965df3..000cd45 100644 --- a/src/Ganeti/OpParams.hs +++ b/src/Ganeti/OpParams.hs @@ -288,6 +288,7 @@ module Ganeti.OpParams , pNetworkMode , pNetworkLink , pNetworkVlan + , pNetworkMacvtapMode , pDryRun , pDebugLevel , pOpPriority @@ -398,6 +399,7 @@ $(buildObject "INicParams" "inic" , optionalField $ simpleField C.inicLink [t| NonEmptyString |] , optionalField $ simpleField C.inicName [t| NonEmptyString |] , optionalField $ simpleField C.inicVlan [t| String |] + , optionalField $ simpleField C.inicMacvtapMode [t| String |] , optionalField $ simpleField C.inicBridge [t| NonEmptyString |] , optionalField $ simpleField C.inicNetwork [t| NonEmptyString |] ]) @@ -1896,6 +1898,11 @@ pNetworkVlan = withDoc "Network vlan when connecting to a group" . defaultField [| "" |] $ stringField "network_vlan" +pNetworkMacvtapMode :: Field +pNetworkMacvtapMode = + withDoc "Network macvtap mode when connecting to a group" . + defaultField [| "" |] $ stringField "network_macvtap_mode" + pEnabledDataCollectors :: Field pEnabledDataCollectors = withDoc "Set the active data collectors" . diff --git a/test/hs/Test/Ganeti/OpCodes.hs b/test/hs/Test/Ganeti/OpCodes.hs index 4d2167e..b8e6cda 100644 --- a/test/hs/Test/Ganeti/OpCodes.hs +++ b/test/hs/Test/Ganeti/OpCodes.hs @@ -97,7 +97,7 @@ instance Arbitrary INicParams where arbitrary = INicParams <$> genMaybe genNameNE <*> genMaybe genName <*> genMaybe genNameNE <*> genMaybe genNameNE <*> genMaybe genNameNE <*> genMaybe genName <*> - genMaybe genNameNE <*> genMaybe genNameNE + genMaybe genName <*> genMaybe genNameNE <*> genMaybe genNameNE instance Arbitrary IDiskParams where arbitrary = IDiskParams <$> arbitrary <*> arbitrary <*> @@ -519,7 +519,8 @@ instance Arbitrary OpCodes.OpCode where genMaybe (listOf genIPv4Address) "OP_NETWORK_CONNECT" -> OpCodes.OpNetworkConnect <$> genNameNE <*> genNameNE <*> - arbitrary <*> genNameNE <*> genPrintableAsciiString <*> arbitrary + arbitrary <*> genNameNE <*> genPrintableAsciiString <*> + genPrintableAsciiString <*> arbitrary "OP_NETWORK_DISCONNECT" -> OpCodes.OpNetworkDisconnect <$> genNameNE <*> genNameNE "OP_RESTRICTED_COMMAND" -> -- 2.1.4