diff --git a/qa/qa_instance.py b/qa/qa_instance.py
index 9dab9daacd3320fd7fed83a26ef42558810e3409..3d6695e7130ee76e49d56fa97b246f9ba2e3cbe4 100644
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@ -161,6 +161,21 @@ def _GetBoolInstanceField(instance, field):
" %s" % (field, instance, info_out))
+def IsFailoverSupported(instance):
+ templ = qa_config.GetInstanceTemplate(instance)
+ return templ in constants.DTS_MIRRORED
+
+
+def IsMigrationSupported(instance):
+ templ = qa_config.GetInstanceTemplate(instance)
+ return templ in constants.DTS_MIRRORED
+
+
+def IsDiskReplacingSupported(instance):
+ templ = qa_config.GetInstanceTemplate(instance)
+ return templ == constants.DT_DRBD8
+
+
@InstanceCheck(None, INST_UP, RETURN_VALUE)
def TestInstanceAddWithPlainDisk(node):
"""gnt-instance add -t plain"""
@@ -302,6 +317,11 @@ def TestInstanceRenameAndBack(rename_source, rename_target):
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestInstanceFailover(instance):
"""gnt-instance failover"""
+ if not IsFailoverSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support failover, skipping"
+ " test")
+ return
+
cmd = ["gnt-instance", "failover", "--force", instance["name"]]
# failover ...
@@ -315,6 +335,11 @@ def TestInstanceFailover(instance):
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestInstanceMigrate(instance, toggle_always_failover=True):
"""gnt-instance migrate"""
+ if not IsMigrationSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support migration, skipping"
+ " test")
+ return
+
cmd = ["gnt-instance", "migrate", "--force", instance["name"]]
af_par = constants.BE_ALWAYS_FAILOVER
af_field = "be/" + constants.BE_ALWAYS_FAILOVER
@@ -459,6 +484,11 @@ def TestInstanceStoppedModify(instance):
def TestInstanceConvertDisk(instance, snode):
"""gnt-instance modify -t"""
name = instance["name"]
+ template = qa_config.GetInstanceTemplate(instance)
+ if template != "drbd":
+ print qa_utils.FormatInfo("Unsupported template %s, skipping conversion"
+ " test" % template)
+ return
AssertCommand(["gnt-instance", "modify", "-t", "plain", name])
AssertCommand(["gnt-instance", "modify", "-t", "drbd",
"-n", snode["primary"], name])
@@ -467,6 +497,9 @@ def TestInstanceConvertDisk(instance, snode):
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
def TestInstanceGrowDisk(instance):
"""gnt-instance grow-disk"""
+ if qa_config.GetExclusiveStorage():
+ print qa_utils.FormatInfo("Test not supported with exclusive_storage")
+ return
name = instance["name"]
all_size = qa_config.get("disk")
all_grow = qa_config.get("disk-growth")
@@ -515,6 +548,11 @@ def TestReplaceDisks(instance, pnode, snode, othernode):
cmd.append(instance["name"])
return cmd
+ if not IsDiskReplacingSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support disk replacing,"
+ " skipping test")
+ return
+
options = qa_config.get("options", {})
use_ialloc = options.get("use-iallocators", True)
for data in [
diff --git a/qa/qa_rapi.py b/qa/qa_rapi.py
index 5189304dca2c64bd5c066f0f4e4dcb0d852409de..b34bb2551f03bcfefd6f9d0ab1a7bd9984dc8f69 100644
--- a/qa/qa_rapi.py
+++ b/qa/qa_rapi.py
@@ -46,6 +46,9 @@ import qa_config
import qa_utils
import qa_error
+from qa_instance import IsFailoverSupported
+from qa_instance import IsMigrationSupported
+from qa_instance import IsDiskReplacingSupported
from qa_utils import (AssertEqual, AssertIn, AssertMatch, StartLocalCommand)
from qa_utils import InstanceCheck, INST_DOWN, INST_UP, FIRST_ARG
@@ -617,6 +620,10 @@ def TestRapiInstanceRemove(instance, use_client):
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestRapiInstanceMigrate(instance):
"""Test migrating instance via RAPI"""
+ if not IsMigrationSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support migration, skipping"
+ " test")
+ return
# Move to secondary node
_WaitForRapiJob(_rapi_client.MigrateInstance(instance["name"]))
qa_utils.RunInstanceCheck(instance, True)
@@ -627,6 +634,10 @@ def TestRapiInstanceMigrate(instance):
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestRapiInstanceFailover(instance):
"""Test failing over instance via RAPI"""
+ if not IsFailoverSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support failover, skipping"
+ " test")
+ return
# Move to secondary node
_WaitForRapiJob(_rapi_client.FailoverInstance(instance["name"]))
qa_utils.RunInstanceCheck(instance, True)
@@ -676,6 +687,10 @@ def TestRapiInstanceReinstall(instance):
@InstanceCheck(INST_UP, INST_UP, FIRST_ARG)
def TestRapiInstanceReplaceDisks(instance):
"""Test replacing instance disks via RAPI"""
+ if not IsDiskReplacingSupported(instance):
+ print qa_utils.FormatInfo("Instance doesn't support disk replacing,"
+ " skipping test")
+ return
fn = _rapi_client.ReplaceInstanceDisks
_WaitForRapiJob(fn(instance["name"],
mode=constants.REPLACE_DISK_AUTO, disks=[]))