Revision 2ee9171a

b/lib/rapi/rlib2.py
989 989

  
990 990
    body = objects.FillDict(self.request_body, {
991 991
      "instances": [
992
        baserlib.FillOpcode(opcodes.OpInstanceCreate, inst, {}, OPCODE_RENAME)
992
        baserlib.FillOpcode(opcodes.OpInstanceCreate, inst, {},
993
                            rename=OPCODE_RENAME)
993 994
        for inst in self.request_body["instances"]
994 995
        ],
995 996
      })
b/qa/ganeti-qa.py
809 809

  
810 810
      if (qa_config.TestEnabled("instance-add-plain-disk")
811 811
          and qa_config.IsTemplateSupported(constants.DT_PLAIN)):
812
        # Normal instance allocation via RAPI
812 813
        for use_client in [True, False]:
813 814
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
814 815
                                  use_client)
......
820 821
            rapi_instance.Release()
821 822
          del rapi_instance
822 823

  
824
        # Multi-instance allocation
825
        rapi_instance_one, rapi_instance_two = \
826
          RunTest(qa_rapi.TestRapiInstanceMultiAlloc, pnode)
827

  
828
        try:
829
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance_one, True)
830
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance_two, True)
831
        finally:
832
          rapi_instance_one.Release()
833
          rapi_instance_two.Release()
823 834
  finally:
824 835
    pnode.Release()
825 836

  
b/qa/qa_rapi.py
27 27
import random
28 28
import re
29 29
import itertools
30
import functools
30 31

  
31 32
from ganeti import utils
32 33
from ganeti import constants
......
622 623
    raise
623 624

  
624 625

  
626
def _GenInstanceAllocationDict(node, instance):
627
  """Creates an instance allocation dict to be used with the RAPI"""
628
  instance.SetDiskTemplate(constants.DT_PLAIN)
629

  
630
  disks = [{"size": utils.ParseUnit(d.get("size")),
631
              "name": str(d.get("name"))}
632
             for d in qa_config.GetDiskOptions()]
633

  
634
  nic0_mac = instance.GetNicMacAddr(0, constants.VALUE_GENERATE)
635
  nics = [{
636
    constants.INIC_MAC: nic0_mac,
637
    }]
638

  
639
  beparams = {
640
    constants.BE_MAXMEM: utils.ParseUnit(qa_config.get(constants.BE_MAXMEM)),
641
    constants.BE_MINMEM: utils.ParseUnit(qa_config.get(constants.BE_MINMEM)),
642
    }
643

  
644
  return _rapi_client.InstanceAllocation(constants.INSTANCE_CREATE,
645
                                         instance.name,
646
                                         constants.DT_PLAIN,
647
                                         disks, nics,
648
                                         os=qa_config.get("os"),
649
                                         pnode=node.primary,
650
                                         beparams=beparams)
651

  
652

  
653
def TestRapiInstanceMultiAlloc(node):
654
  """Test adding two new instances via the RAPI instance-multi-alloc method"""
655
  if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
656
    return
657

  
658
  JOBS_KEY = "jobs"
659

  
660
  instance_one = qa_config.AcquireInstance()
661
  instance_two = qa_config.AcquireInstance()
662
  instance_list = [instance_one, instance_two]
663
  try:
664
    rapi_dicts = map(functools.partial(_GenInstanceAllocationDict, node),
665
                     instance_list)
666

  
667
    job_id = _rapi_client.InstancesMultiAlloc(rapi_dicts)
668

  
669
    results, = _WaitForRapiJob(job_id)
670

  
671
    if JOBS_KEY not in results:
672
      raise qa_error.Error("RAPI instance-multi-alloc did not deliver "
673
                           "information about created jobs")
674

  
675
    if len(results[JOBS_KEY]) != len(instance_list):
676
      raise qa_error.Error("RAPI instance-multi-alloc failed to return the "
677
                           "desired number of jobs!")
678

  
679
    for success, job in results[JOBS_KEY]:
680
      if success:
681
        _WaitForRapiJob(job)
682
      else:
683
        raise qa_error.Error("Failed to create instance in "
684
                             "instance-multi-alloc call")
685
  except:
686
    # Note that although released, it may be that some of the instance creations
687
    # have in fact succeeded. Handling this in a better way may be possible, but
688
    # is not necessary as the QA has already failed at this point.
689
    for instance in instance_list:
690
      instance.Release()
691
    raise
692

  
693
  return (instance_one, instance_two)
694

  
695

  
625 696
@InstanceCheck(None, INST_DOWN, FIRST_ARG)
626 697
def TestRapiInstanceRemove(instance, use_client):
627 698
  """Test removing instance via RAPI"""

Also available in: Unified diff