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

Reply via email to