Revision 6395cebb lib/rapi/rlib2.py

b/lib/rapi/rlib2.py
45 45
from ganeti import http
46 46
from ganeti import constants
47 47
from ganeti import cli
48
from ganeti import utils
48 49
from ganeti import rapi
49 50
from ganeti.rapi import baserlib
50 51

  
......
86 87
# Request data version field
87 88
_REQ_DATA_VERSION = "__version__"
88 89

  
90
# Feature string for instance creation request data version 1
91
_INST_CREATE_REQV1 = "instance-create-reqv1"
92

  
89 93
# Timeout for /2/jobs/[job_id]/wait. Gives job up to 10 seconds to change.
90 94
_WFJC_TIMEOUT = 10
91 95

  
......
127 131
    """Returns list of optional RAPI features implemented.
128 132

  
129 133
    """
130
    return []
134
    return [_INST_CREATE_REQV1]
131 135

  
132 136

  
133 137
class R_2_os(baserlib.R_Generic):
......
486 490
    return baserlib.SubmitJob([op])
487 491

  
488 492

  
493
def _ParseInstanceCreateRequestVersion1(data, dry_run):
494
  """Parses an instance creation request version 1.
495

  
496
  @rtype: L{opcodes.OpCreateInstance}
497
  @return: Instance creation opcode
498

  
499
  """
500
  # Disks
501
  disks_input = baserlib.CheckParameter(data, "disks", exptype=list)
502

  
503
  disks = []
504
  for idx, i in enumerate(disks_input):
505
    baserlib.CheckType(i, dict, "Disk %d specification" % idx)
506

  
507
    # Size is mandatory
508
    try:
509
      size = i["size"]
510
    except KeyError:
511
      raise http.HttpBadRequest("Disk %d specification wrong: missing disk"
512
                                " size" % idx)
513

  
514
    disk = {
515
      "size": size,
516
      }
517

  
518
    # Optional disk access mode
519
    try:
520
      disk_access = i["mode"]
521
    except KeyError:
522
      pass
523
    else:
524
      disk["mode"] = disk_access
525

  
526
    disks.append(disk)
527

  
528
  assert len(disks_input) == len(disks)
529

  
530
  # Network interfaces
531
  nics_input = baserlib.CheckParameter(data, "nics", exptype=list)
532

  
533
  nics = []
534
  for idx, i in enumerate(nics_input):
535
    baserlib.CheckType(i, dict, "NIC %d specification" % idx)
536

  
537
    nic = {}
538

  
539
    for field in ["mode", "ip", "link", "bridge"]:
540
      try:
541
        value = i[field]
542
      except KeyError:
543
        continue
544

  
545
      nic[field] = value
546

  
547
    nics.append(nic)
548

  
549
  assert len(nics_input) == len(nics)
550

  
551
  # HV/BE parameters
552
  hvparams = baserlib.CheckParameter(data, "hvparams", default={})
553
  utils.ForceDictType(hvparams, constants.HVS_PARAMETER_TYPES)
554

  
555
  beparams = baserlib.CheckParameter(data, "beparams", default={})
556
  utils.ForceDictType(beparams, constants.BES_PARAMETER_TYPES)
557

  
558
  return opcodes.OpCreateInstance(
559
    mode=baserlib.CheckParameter(data, "mode"),
560
    instance_name=baserlib.CheckParameter(data, "name"),
561
    os_type=baserlib.CheckParameter(data, "os", default=None),
562
    force_variant=baserlib.CheckParameter(data, "force_variant",
563
                                          default=False),
564
    pnode=baserlib.CheckParameter(data, "pnode", default=None),
565
    snode=baserlib.CheckParameter(data, "snode", default=None),
566
    disk_template=baserlib.CheckParameter(data, "disk_template"),
567
    disks=disks,
568
    nics=nics,
569
    src_node=baserlib.CheckParameter(data, "src_node", default=None),
570
    src_path=baserlib.CheckParameter(data, "src_path", default=None),
571
    start=baserlib.CheckParameter(data, "start", default=True),
572
    wait_for_sync=True,
573
    ip_check=baserlib.CheckParameter(data, "ip_check", default=True),
574
    name_check=baserlib.CheckParameter(data, "name_check", default=True),
575
    file_storage_dir=baserlib.CheckParameter(data, "file_storage_dir",
576
                                             default=None),
577
    file_driver=baserlib.CheckParameter(data, "file_driver",
578
                                        default=constants.FD_LOOP),
579
    iallocator=baserlib.CheckParameter(data, "iallocator", default=None),
580
    hypervisor=baserlib.CheckParameter(data, "hypervisor", default=None),
581
    hvparams=hvparams,
582
    beparams=beparams,
583
    dry_run=dry_run,
584
    )
585

  
586

  
489 587
class R_2_instances(baserlib.R_Generic):
490 588
  """/2/instances resource.
491 589

  
......
509 607
  def _ParseVersion0CreateRequest(self):
510 608
    """Parses an instance creation request version 0.
511 609

  
610
    Request data version 0 is deprecated and should not be used anymore.
611

  
512 612
    @rtype: L{opcodes.OpCreateInstance}
513 613
    @return: Instance creation opcode
514 614

  
515 615
    """
616
    # Do not modify anymore, request data version 0 is deprecated
516 617
    beparams = baserlib.MakeParamsDict(self.req.request_body,
517 618
                                       constants.BES_PARAMETERS)
518 619
    hvparams = baserlib.MakeParamsDict(self.req.request_body,
......
541 642
    if fn("bridge", None) is not None:
542 643
      nics[0]["bridge"] = fn("bridge")
543 644

  
645
    # Do not modify anymore, request data version 0 is deprecated
544 646
    return opcodes.OpCreateInstance(
545 647
      mode=constants.INSTANCE_CREATE,
546 648
      instance_name=fn('name'),
......
559 661
      hvparams=hvparams,
560 662
      beparams=beparams,
561 663
      file_storage_dir=fn('file_storage_dir', None),
562
      file_driver=fn('file_driver', 'loop'),
664
      file_driver=fn('file_driver', constants.FD_LOOP),
563 665
      dry_run=bool(self.dryRun()),
564 666
      )
565 667

  
......
577 679

  
578 680
    if data_version == 0:
579 681
      op = self._ParseVersion0CreateRequest()
682
    elif data_version == 1:
683
      op = _ParseInstanceCreateRequestVersion1(self.req.request_body,
684
                                               self.dryRun())
580 685
    else:
581 686
      raise http.HttpBadRequest("Unsupported request data version %s" %
582 687
                                data_version)

Also available in: Unified diff