This patch extends the NIC related checks of the LUInstanceCreate and
LUInstanceSetParams logical units to include the MacVTap connection mode
too.

Signed-off-by: Dimitris Bliablias <db...@skroutz.gr>
---
 lib/cmdlib/instance_create.py     | 14 ++++++++++++--
 lib/cmdlib/instance_set_params.py | 10 +++++++++-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/lib/cmdlib/instance_create.py b/lib/cmdlib/instance_create.py
index 4b2c6ee..f8f1917 100644
--- a/lib/cmdlib/instance_create.py
+++ b/lib/cmdlib/instance_create.py
@@ -73,7 +73,8 @@ from ganeti.cmdlib.instance_utils import \
   CheckHostnameSane, CheckOpportunisticLocking, \
   ComputeFullBeParams, ComputeNics, GetClusterDomainSecret, \
   CheckInstanceExistence, CreateInstanceAllocRequest, BuildInstanceHookEnv, \
-  NICListToTuple, CheckNicsBridgesExist, CheckCompressionTool
+  NICListToTuple, CheckNicsBridgesExist, CheckCompressionTool, \
+  ComputeMacvtapModeNicParam
 import ganeti.masterd.instance
 
 
@@ -720,7 +721,7 @@ class LUInstanceCreate(LogicalUnit):
       node_names.append(self.op.snode)
     self.LogInfo("Nodes of instance %s: %s", name, node_names)
 
-  def CheckPrereq(self): # pylint: disable=R0914
+  def CheckPrereq(self): # pylint: disable=R0914,R0915
     """Check prerequisites.
 
     """
@@ -875,6 +876,15 @@ class LUInstanceCreate(LogicalUnit):
       if nic.mac in (constants.VALUE_AUTO, constants.VALUE_GENERATE):
         nic.mac = self.cfg.GenerateMAC(nic.network, self.proc.GetECId())
 
+      #### macvtap_mode validation
+      # In case of a NIC in MacVTap connection mode, we validate and properly
+      # compute the macvtap_mode nicparam.
+      mode = nic.nicparams.get(constants.INIC_MODE, None)
+      if mode == constants.NIC_MODE_MACVTAP:
+        macvtap_mode = nic.nicparams.get(constants.NIC_MACVTAP_MODE, "")
+        nic.nicparams[constants.NIC_MACVTAP_MODE] = \
+          ComputeMacvtapModeNicParam(macvtap_mode)
+
     #### allocator run
 
     if self.op.iallocator is not None:
diff --git a/lib/cmdlib/instance_set_params.py 
b/lib/cmdlib/instance_set_params.py
index 486c14e..eb2a4c8 100644
--- a/lib/cmdlib/instance_set_params.py
+++ b/lib/cmdlib/instance_set_params.py
@@ -64,7 +64,7 @@ from ganeti.cmdlib.instance_utils import 
BuildInstanceHookEnvByObject, \
   NICToTuple, CheckNodeNotDrained, CopyLockList, \
   ReleaseLocks, CheckNodeVmCapable, CheckTargetNodeIPolicy, \
   GetInstanceInfoText, RemoveDisks, CheckNodeFreeMemory, \
-  UpdateMetadata, CheckForConflictingIp, \
+  UpdateMetadata, CheckForConflictingIp, ComputeMacvtapModeNicParam, \
   PrepareContainerMods, ComputeInstanceCommunicationNIC, \
   ApplyContainerMods, ComputeIPolicyInstanceSpecViolation, \
   CheckNodesPhysicalCPUs
@@ -526,6 +526,14 @@ class LUInstanceSetParams(LogicalUnit):
     else:
       new_params = GetUpdatedParams(old_params, update_params_dict)
 
+    # In case of a modification of a NIC in MacVTap connection mode,
+    # check and properly compute the macvtap_mode nicparam.
+    mode = new_params.get(constants.NIC_MODE, None)
+    if mode == constants.NIC_MODE_MACVTAP:
+      req_macvtap_mode = update_params_dict.get(constants.NIC_MACVTAP_MODE, "")
+      new_params[constants.NIC_MACVTAP_MODE] = \
+          ComputeMacvtapModeNicParam(req_macvtap_mode)
+
     utils.ForceDictType(new_params, constants.NICS_PARAMETER_TYPES)
 
     new_filled_params = cluster.SimpleFillNIC(new_params)
-- 
2.1.4

Reply via email to