On Fri, Dec 20, 2013 at 11:48 AM, Helga Velroyen <[email protected]> wrote:

>
>
>
> On Fri, Dec 20, 2013 at 10:09 AM, Hrvoje Ribicic <[email protected]> wrote:
>
>> This patch introduces additional calls adding migration and failover
>> RAPI operations, moving a DRBD-disk template instance between nodes.
>>
>> Signed-off-by: Hrvoje Ribicic <[email protected]>
>> ---
>>  qa/qa_config.py     | 42 +++++++++++++++++++++++++++++++
>>  qa/rapi-workload.py | 72
>> ++++++++++++++++++++++++++++++++++++++++++++++++-----
>>  2 files changed, 108 insertions(+), 6 deletions(-)
>>
>> diff --git a/qa/qa_config.py b/qa/qa_config.py
>> index bc650ce..d497b16 100644
>> --- a/qa/qa_config.py
>> +++ b/qa/qa_config.py
>> @@ -702,6 +702,48 @@ def AcquireInstance(_cfg=None):
>>    return instance
>>
>>
>> +def AcquireManyInstances(num, _cfg=None):
>> +  """Return instances that are not in use.
>> +
>> +  @type num: int
>> +  @param num: Number of nodes; can be 0.
>>
>
> s/nodes/instances ?
>

ACK


>
>
>> +  @rtype: list of instances
>> +  @return: C{num} different instances
>> +
>> +  """
>> +
>> +  if _cfg is None:
>> +    cfg = GetConfig()
>> +  else:
>> +    cfg = _cfg
>> +
>> +  # Filter out unwanted instances
>> +  instances = filter(lambda inst: not inst.used, cfg["instances"])
>> +
>> +  if len(instances) < num:
>> +    raise qa_error.OutOfInstancesError(
>> +      "Not enough instances left (%d needed, %d remaining)" %
>> +      (num, len(instances))
>> +    )
>> +
>> +  instances = []
>> +
>> +  try:
>> +    for _ in range(0, num):
>> +      n = AcquireInstance(_cfg=cfg)
>> +      instances.append(n)
>> +  except qa_error.OutOfInstancesError:
>> +    ReleaseManyInstances(instances)
>> +    raise
>> +
>> +  return instances
>> +
>> +
>> +def ReleaseManyInstances(instances):
>> +  for instance in instances:
>> +    instance.Release()
>> +
>> +
>>  def SetExclusiveStorage(value):
>>    """Wrapper for L{_QaConfig.SetExclusiveStorage}.
>>
>> diff --git a/qa/rapi-workload.py b/qa/rapi-workload.py
>> index a7a35b3..620e933 100755
>> --- a/qa/rapi-workload.py
>> +++ b/qa/rapi-workload.py
>> @@ -31,7 +31,7 @@ import sys
>>  import types
>>
>>  import ganeti.constants as constants
>> -from ganeti.rapi.client import GanetiApiError
>> +from ganeti.rapi.client import GanetiApiError, NODE_EVAC_PRI,
>> NODE_EVAC_SEC
>>
>>  import qa_config
>>  import qa_node
>> @@ -628,6 +628,61 @@ def TestNetworks(client):
>>    Finish(client, client.DeleteNetwork, NETWORK_NAME)
>>
>>
>> +def CreateDRBDInstance(client, node_one, node_two, instance_name):
>> +  """ Creates a DRBD-enabled instance on the given nodes.
>> +
>> +  """
>> +  Finish(client, client.CreateInstance,
>> +         "create", instance_name, "drbd", [{"size": "1000"}], [{}],
>> +         os="debian-image", pnode=node_one, snode=node_two)
>> +
>> +
>> +def TestInstanceMigrations(client, node_one, node_two, node_three,
>> +                           instance_name):
>> +  """ Test various operations related to migrating instances.
>> +
>> +  @type node_one string
>> +  @param node_one The name of a node in the cluster.
>> +  @type node_two string
>> +  @param node_two The name of a node in the cluster.
>> +  @type node_three string
>> +  @param node_three The name of a node in the cluster.
>>
>
> It might be worth mentioning that the names of the nodes must differ,
> don't they?
>
>

I will strategically add another's in the parameter documentation.


> +  @type instance_name string
>> +  @param instance_name An instance name that can be used.
>> +
>> +  """
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.FailoverInstance, instance_name)
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.EvacuateNode,
>> +         node_two, early_release=False, mode=NODE_EVAC_SEC,
>> +         remote_node=node_three)
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.EvacuateNode,
>> +         node_one, early_release=False, mode=NODE_EVAC_PRI,
>> iallocator="hail")
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.MigrateInstance,
>> +         instance_name, cleanup=True, target_node=node_two)
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.MigrateNode,
>> +         node_one, iallocator="hail", mode="non-live")
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +  CreateDRBDInstance(client, node_one, node_two, instance_name)
>> +  Finish(client, client.MigrateNode,
>> +         node_one, target_node=node_two, mode="non-live")
>> +  Finish(client, client.DeleteInstance, instance_name)
>> +
>> +
>>  def Workload(client):
>>    """ The actual RAPI workload used for tests.
>>
>> @@ -657,12 +712,10 @@ def Workload(client):
>>    RemoveAllInstances(client)
>>
>>    nodes = qa_config.AcquireManyNodes(2)
>> -  instance_one = qa_config.AcquireInstance()
>> -  instance_two = qa_config.AcquireInstance()
>> -  TestSingleInstance(client, instance_one.name, instance_two.name,
>> +  instances = qa_config.AcquireManyInstances(2)
>> +  TestSingleInstance(client, instances[0].name, instances[1].name,
>>                       nodes[0].primary, nodes[1].primary)
>> -  instance_two.Release()
>> -  instance_one.Release()
>> +  qa_config.ReleaseManyInstances(instances)
>>    qa_config.ReleaseManyNodes(nodes)
>>
>>    # Test all the queries which involve resources that do not have
>> functions
>> @@ -682,6 +735,13 @@ def Workload(client):
>>
>>    TestNetworks(client)
>>
>> +  nodes = qa_config.AcquireManyNodes(3)
>> +  instance = qa_config.AcquireInstance()
>> +  TestInstanceMigrations(client, nodes[0].primary, nodes[1].primary,
>> +                         nodes[2].primary, instance.name)
>> +  instance.Release()
>> +  qa_config.ReleaseManyNodes(nodes)
>> +
>>
>>  def Usage():
>>    sys.stderr.write("Usage:\n\trapi-workload.py qa-config-file")
>> --
>> 1.8.5.1
>>
>>
> LGTM, thanks
>
> --
> --
> Helga Velroyen | Software Engineer | [email protected] |
>
> Google Germany GmbH
> Dienerstr. 12
> 80331 München
>
> Registergericht und -nummer: Hamburg, HRB 86891
> Sitz der Gesellschaft: Hamburg
> Geschäftsführer: Graham Law, Christine Elizabeth Flores
>

diff --git a/qa/qa_config.py b/qa/qa_config.py
index d497b16..40307d9 100644
--- a/qa/qa_config.py
+++ b/qa/qa_config.py
@@ -706,7 +706,7 @@ def AcquireManyInstances(num, _cfg=None):
   """Return instances that are not in use.

   @type num: int
-  @param num: Number of nodes; can be 0.
+  @param num: Number of instances; can be 0.
   @rtype: list of instances
   @return: C{num} different instances

diff --git a/qa/rapi-workload.py b/qa/rapi-workload.py
index 9a5b9d3..2cabe79 100755
--- a/qa/rapi-workload.py
+++ b/qa/rapi-workload.py
@@ -642,9 +642,9 @@ def TestInstanceMigrations(client, node_one, node_two,
node_three,
   @type node_one string
   @param node_one The name of a node in the cluster.
   @type node_two string
-  @param node_two The name of a node in the cluster.
+  @param node_two The name of another node in the cluster.
   @type node_three string
-  @param node_three The name of a node in the cluster.
+  @param node_three The name of yet another node in the cluster.
   @type instance_name string
   @param instance_name An instance name that can be used.

Reply via email to