If VLAN parameter is present, check its format: either .<id>[:id], :id[:id...], or just id.
Signed-off-by: Sebastian Gebhard <[email protected]> --- lib/cmdlib/instance.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lib/cmdlib/instance.py b/lib/cmdlib/instance.py index 56806bf..4f38087 100644 --- a/lib/cmdlib/instance.py +++ b/lib/cmdlib/instance.py @@ -173,6 +173,7 @@ def _ComputeNics(op, cluster, default_ip, cfg, ec_id): net = nic.get(constants.INIC_NETWORK, None) link = nic.get(constants.NIC_LINK, None) ip = nic.get(constants.INIC_IP, None) + vlan = nic.get(constants.INIC_VLAN, None) if net is None or net.lower() == constants.VALUE_NONE: net = None @@ -182,6 +183,10 @@ def _ComputeNics(op, cluster, default_ip, cfg, ec_id): " is allowed to be passed", errors.ECODE_INVAL) + if vlan is not None and nic_mode != constants.NIC_MODE_OVS: + raise errors.OpPrereqError("VLAN is given, but network mode is not" + " openvswitch", errors.ECODE_INVAL) + # ip validity checks if ip is None or ip.lower() == constants.VALUE_NONE: nic_ip = None @@ -230,6 +235,8 @@ def _ComputeNics(op, cluster, default_ip, cfg, ec_id): nicparams[constants.NIC_MODE] = nic_mode if link: nicparams[constants.NIC_LINK] = link + if vlan: + nicparams[constants.NIC_VLAN] = vlan check_params = cluster.SimpleFillNIC(nicparams) objects.NIC.CheckParameterSyntax(check_params) @@ -383,6 +390,38 @@ class LUInstanceCreate(LogicalUnit): self.adopt_disks = has_adopt + def _CheckVLANArguments(self): + """ Check validity of VLANs if given + + """ + for nic in self.op.nics: + if nic[constants.INIC_VLAN]: + vlan = nic[constants.INIC_VLAN] + if vlan[0] == ".": + # vlan starting with dot means single untagged vlan, + # might be followed by trunk (:) + if not vlan[1:].isdigit(): + vlanlist = vlan[1:].split(':') + for vl in vlanlist: + if not vl.isdigit(): + raise errors.OpPrereqError("Specified VLAN parameter is " + "invalid : %s" % vlan, + errors.ECODE_INVAL) + elif vlan[0] == ":": + # Trunk - tagged only + vlanlist = vlan[1:].split(':') + for vl in vlanlist: + if not vl.isdigit(): + raise errors.OpPrereqError("Specified VLAN parameter is invalid" + " : %s" % vlan, errors.ECODE_INVAL) + elif vlan.isdigit(): + # This is the simplest case. No dots, only single digit + # -> Create untagged access port, dot needs to be added + nic[constants.INIC_VLAN] = "." + vlan + else: + raise errors.OpPrereqError("Specified VLAN parameter is invalid" + " : %s" % vlan, errors.ECODE_INVAL) + def CheckArguments(self): """Check arguments. @@ -407,6 +446,8 @@ class LUInstanceCreate(LogicalUnit): # check that NIC's parameters names are unique and valid utils.ValidateDeviceNames("NIC", self.op.nics) + self._CheckVLANArguments() + self._CheckDiskArguments() # instance name verification -- 1.8.1.2
