Revision c5c72215

b/lib/cmdlib/instance.py
2277 2277
      else:
2278 2278
        raise errors.ProgrammerError("Unhandled operation '%s'" % op)
2279 2279

  
2280
  @staticmethod
2281
  def _VerifyDiskModification(op, params):
2280
  def _VerifyDiskModification(self, op, params):
2282 2281
    """Verifies a disk modification.
2283 2282

  
2284 2283
    """
......
2308 2307
      if constants.IDISK_SIZE in params:
2309 2308
        raise errors.OpPrereqError("Disk size change not possible, use"
2310 2309
                                   " grow-disk", errors.ECODE_INVAL)
2311
      if len(params) > 2:
2312
        raise errors.OpPrereqError("Disk modification doesn't support"
2313
                                   " additional arbitrary parameters",
2314
                                   errors.ECODE_INVAL)
2310

  
2311
      # Disk modification supports changing only the disk name and mode.
2312
      # Changing arbitrary parameters is allowed only for ext disk template",
2313
      if self.instance.disk_template != constants.DT_EXT:
2314
        utils.ForceDictType(params, constants.MODIFIABLE_IDISK_PARAMS_TYPES)
2315

  
2315 2316
      name = params.get(constants.IDISK_NAME, None)
2316 2317
      if name is not None and name.lower() == constants.VALUE_NONE:
2317 2318
        params[constants.IDISK_NAME] = None
......
3182 3183
      ("disk/%d" % idx, "add:size=%s,mode=%s" % (disk.size, disk.mode)),
3183 3184
      ])
3184 3185

  
3185
  @staticmethod
3186
  def _ModifyDisk(idx, disk, params, _):
3186
  def _ModifyDisk(self, idx, disk, params, _):
3187 3187
    """Modifies a disk.
3188 3188

  
3189 3189
    """
......
3196 3196
      disk.name = params.get(constants.IDISK_NAME)
3197 3197
      changes.append(("disk.name/%d" % idx, disk.name))
3198 3198

  
3199
    # Modify arbitrary params in case instance template is ext
3200
    for key, value in params.iteritems():
3201
      if (key not in constants.MODIFIABLE_IDISK_PARAMS and
3202
          self.instance.disk_template == constants.DT_EXT):
3203
        disk.params[key] = value
3204
        changes.append(("disk.params:%s/%d" % (key, idx), value))
3205

  
3199 3206
    return changes
3200 3207

  
3201 3208
  def _RemoveDisk(self, idx, root, _):
b/lib/constants.py
1354 1354
  }
1355 1355
IDISK_PARAMS = frozenset(IDISK_PARAMS_TYPES.keys())
1356 1356

  
1357
MODIFIABLE_IDISK_PARAMS_TYPES = {
1358
  IDISK_MODE: VTYPE_STRING,
1359
  IDISK_NAME: VTYPE_STRING,
1360
  }
1361
MODIFIABLE_IDISK_PARAMS = frozenset(MODIFIABLE_IDISK_PARAMS_TYPES.keys())
1362

  
1357 1363
# INIC_* constants are used in opcodes, to create/change nics
1358 1364
INIC_MAC = "mac"
1359 1365
INIC_IP = "ip"

Also available in: Unified diff