Revision 9f7d5fe4

b/lib/cmdlib/instance.py
174 174
    net = nic.get(constants.INIC_NETWORK, None)
175 175
    link = nic.get(constants.NIC_LINK, None)
176 176
    ip = nic.get(constants.INIC_IP, None)
177
    vlan = nic.get(constants.INIC_VLAN, None)
177 178

  
178 179
    if net is None or net.lower() == constants.VALUE_NONE:
179 180
      net = None
......
183 184
                                   " is allowed to be passed",
184 185
                                   errors.ECODE_INVAL)
185 186

  
187
    if vlan is not None and nic_mode != constants.NIC_MODE_OVS:
188
      raise errors.OpPrereqError("VLAN is given, but network mode is not"
189
                                 " openvswitch", errors.ECODE_INVAL)
190

  
186 191
    # ip validity checks
187 192
    if ip is None or ip.lower() == constants.VALUE_NONE:
188 193
      nic_ip = None
......
231 236
      nicparams[constants.NIC_MODE] = nic_mode
232 237
    if link:
233 238
      nicparams[constants.NIC_LINK] = link
239
    if vlan:
240
      nicparams[constants.NIC_VLAN] = vlan
234 241

  
235 242
    check_params = cluster.SimpleFillNIC(nicparams)
236 243
    objects.NIC.CheckParameterSyntax(check_params)
......
379 386

  
380 387
    self.adopt_disks = has_adopt
381 388

  
389
  def _CheckVLANArguments(self):
390
    """ Check validity of VLANs if given
391

  
392
    """
393
    for nic in self.op.nics:
394
      if nic[constants.INIC_VLAN]:
395
        vlan = nic[constants.INIC_VLAN]
396
        if vlan[0] == ".":
397
          # vlan starting with dot means single untagged vlan,
398
          # might be followed by trunk (:)
399
          if not vlan[1:].isdigit():
400
            vlanlist = vlan[1:].split(':')
401
            for vl in vlanlist:
402
              if not vl.isdigit():
403
                raise errors.OpPrereqError("Specified VLAN parameter is "
404
                                           "invalid : %s" % vlan,
405
                                             errors.ECODE_INVAL)
406
        elif vlan[0] == ":":
407
          # Trunk - tagged only
408
          vlanlist = vlan[1:].split(':')
409
          for vl in vlanlist:
410
            if not vl.isdigit():
411
              raise errors.OpPrereqError("Specified VLAN parameter is invalid"
412
                                           " : %s" % vlan, errors.ECODE_INVAL)
413
        elif vlan.isdigit():
414
          # This is the simplest case. No dots, only single digit
415
          # -> Create untagged access port, dot needs to be added
416
          nic[constants.INIC_VLAN] = "." + vlan
417
        else:
418
          raise errors.OpPrereqError("Specified VLAN parameter is invalid"
419
                                       " : %s" % vlan, errors.ECODE_INVAL)
420

  
382 421
  def CheckArguments(self):
383 422
    """Check arguments.
384 423

  
......
403 442
    # check that NIC's parameters names are unique and valid
404 443
    utils.ValidateDeviceNames("NIC", self.op.nics)
405 444

  
445
    self._CheckVLANArguments()
446

  
406 447
    self._CheckDiskArguments()
407 448

  
408 449
    # instance name verification

Also available in: Unified diff