Revision 2ee9171a qa/qa_rapi.py

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