Merge "[Verify] New command to list Tempest plugins"
This commit is contained in:
commit
40bb832700
@ -54,6 +54,7 @@ _rally()
|
||||
OPTS["verify_install"]="--deployment --source --version --system-wide"
|
||||
OPTS["verify_installplugin"]="--deployment --source --version --system-wide"
|
||||
OPTS["verify_list"]=""
|
||||
OPTS["verify_listplugins"]="--deployment --system-wide"
|
||||
OPTS["verify_reinstall"]="--deployment --source --version --system-wide"
|
||||
OPTS["verify_results"]="--uuid --html --json --output-file"
|
||||
OPTS["verify_show"]="--uuid --sort-by --detailed"
|
||||
|
15
rally/api.py
15
rally/api.py
@ -511,6 +511,21 @@ class Verification(object):
|
||||
|
||||
verifier.install_plugin()
|
||||
|
||||
@classmethod
|
||||
def list_tempest_plugins(cls, deployment, system_wide=False):
|
||||
"""List all installed Tempest plugins.
|
||||
|
||||
:param deployment: UUID or name of a deployment
|
||||
:param system_wide: List all plugins installed in the local env or
|
||||
in Tempest virtual env
|
||||
"""
|
||||
deployment_uuid = objects.Deployment.get(deployment)["uuid"]
|
||||
verifier = tempest.Tempest(deployment_uuid, system_wide=system_wide)
|
||||
|
||||
cls._check_tempest_tree_existence(verifier)
|
||||
|
||||
return verifier.list_plugins()
|
||||
|
||||
@classmethod
|
||||
def discover_tests(cls, deployment, pattern=""):
|
||||
"""Get a list of discovered tests.
|
||||
|
@ -504,6 +504,22 @@ class VerifyCommands(object):
|
||||
api.Verification.install_tempest_plugin(deployment, source,
|
||||
version, system_wide)
|
||||
|
||||
@cliutils.args("--deployment", type=str, dest="deployment",
|
||||
required=False, help="UUID or name of a deployment")
|
||||
@cliutils.args("--system-wide", dest="system_wide",
|
||||
help="List all plugins installed in the local env, "
|
||||
"not in Tempest virtual env",
|
||||
required=False, action="store_true")
|
||||
@envutils.with_default_deployment(cli_arg_name="deployment")
|
||||
def listplugins(self, deployment=None, system_wide=False):
|
||||
"""List all installed Tempest plugins.
|
||||
|
||||
:param deployment: UUID or name of a deployment
|
||||
:param system_wide: List all plugins installed in the local env or
|
||||
in Tempest virtual env
|
||||
"""
|
||||
print(api.Verification.list_tempest_plugins(deployment, system_wide))
|
||||
|
||||
@cliutils.args("--deployment", dest="deployment", type=str, required=False,
|
||||
metavar="<uuid>", help="UUID or name of a deployment")
|
||||
@cliutils.args("--pattern", dest="pattern", type=str,
|
||||
|
@ -53,10 +53,6 @@
|
||||
<a href="{{ install.stdout_file }}">Tempest installation</a>
|
||||
<code>$ {{ install.cmd }}</code>
|
||||
|
||||
<span class="{{ discover.status }}">[{{ discover.status }}]</span>
|
||||
<a href="{{ discover.stdout_file }}">Discovering tests</a>
|
||||
<code>$ {{ discover.cmd }}</code>
|
||||
|
||||
<span class="{{ reinstall.status }}">[{{ reinstall.status }}]</span>
|
||||
<a href="{{ reinstall.stdout_file }}">Tempest re-installation</a>
|
||||
<code>$ {{ reinstall.cmd }}</code>
|
||||
@ -65,6 +61,14 @@
|
||||
<a href="{{ installplugin.stdout_file }}">Tempest plugin installation</a>
|
||||
<code>$ {{ installplugin.cmd }}</code>
|
||||
|
||||
<span class="{{ listplugins.status }}">[{{ listplugins.status }}]</span>
|
||||
<a href="{{ listplugins.stdout_file }}">List installed Tempest plugins</a>
|
||||
<code>$ {{ listplugins.cmd }}</code>
|
||||
|
||||
<span class="{{ discover.status }}">[{{ discover.status }}]</span>
|
||||
<a href="{{ discover.stdout_file }}">Discovering tests</a>
|
||||
<code>$ {{ discover.cmd }}</code>
|
||||
|
||||
<span class="{{ genconfig.status }}">[{{ genconfig.status }}]</span>
|
||||
<a href="{{ genconfig.stdout_file }}">Tempest config generation</a>
|
||||
<code>$ {{ genconfig.cmd }}</code>
|
||||
|
@ -41,6 +41,7 @@ class TempestSetupFailure(exceptions.RallyException):
|
||||
|
||||
|
||||
def check_output(*args, **kwargs):
|
||||
print_debug_output = kwargs.pop("print_debug_output", True)
|
||||
kwargs["stderr"] = subprocess.STDOUT
|
||||
try:
|
||||
output = subprocess.check_output(*args, **kwargs)
|
||||
@ -49,7 +50,8 @@ def check_output(*args, **kwargs):
|
||||
LOG.error("Error output: '%s'" % encodeutils.safe_decode(e.output))
|
||||
raise
|
||||
|
||||
LOG.debug("subprocess output: '%s'" % encodeutils.safe_decode(output))
|
||||
if print_debug_output:
|
||||
LOG.debug("Subprocess output: '%s'" % encodeutils.safe_decode(output))
|
||||
return output
|
||||
|
||||
|
||||
@ -311,6 +313,13 @@ class Tempest(object):
|
||||
check_output(cmd, cwd=self.path())
|
||||
LOG.info(_("Tempest plugin has been successfully installed!"))
|
||||
|
||||
def list_plugins(self):
|
||||
"""List all installed Tempest plugins for local Tempest repo."""
|
||||
cmd = ["tempest", "list-plugins"]
|
||||
if not self._system_wide:
|
||||
cmd.insert(0, self.path("tools/with_venv.sh"))
|
||||
return check_output(cmd, cwd=self.path(), print_debug_output=False)
|
||||
|
||||
@logging.log_verification_wrapper(LOG.info, _("Run verification."))
|
||||
def _prepare_and_run(self, set_name, regex, tests_file,
|
||||
tests_file_to_skip, concur, failing):
|
||||
|
@ -255,6 +255,9 @@ def main():
|
||||
render_vars["installplugin"] = call_rally(
|
||||
"verify installplugin --source %s" % TEMPEST_PLUGIN)
|
||||
|
||||
# List installed Tempest plugins
|
||||
render_vars["listplugins"] = call_rally("verify listplugins")
|
||||
|
||||
# Discover tests depending on Tempest suite
|
||||
discover_cmd = "verify discover"
|
||||
if args.mode == "light":
|
||||
|
@ -530,7 +530,7 @@ class VerifyCommandsTestCase(test.TestCase):
|
||||
deployment_uuid, None, version, False)
|
||||
|
||||
@mock.patch("rally.api.Verification.install_tempest_plugin")
|
||||
def test_install_plugin_from_url(
|
||||
def test_installplugin_from_url(
|
||||
self, mock_verification_install_tempest_plugin):
|
||||
deployment_uuid = "83514de2-a770-4e28-82dd-2826b725e733"
|
||||
url = "https://github.com/fake/plugin"
|
||||
@ -539,7 +539,7 @@ class VerifyCommandsTestCase(test.TestCase):
|
||||
deployment_uuid, url, None, False)
|
||||
|
||||
@mock.patch("rally.api.Verification.install_tempest_plugin")
|
||||
def test_install_plugin_from_path(
|
||||
def test_installplugin_from_path(
|
||||
self, mock_verification_install_tempest_plugin):
|
||||
deployment_uuid = "83514de2-a770-4e28-82dd-2826b725e733"
|
||||
path = "/tmp/fake/plugin"
|
||||
@ -547,6 +547,13 @@ class VerifyCommandsTestCase(test.TestCase):
|
||||
mock_verification_install_tempest_plugin.assert_called_once_with(
|
||||
deployment_uuid, path, None, False)
|
||||
|
||||
@mock.patch("rally.api.Verification.list_tempest_plugins")
|
||||
def test_listplugins(self, mock_verification_list_tempest_plugins):
|
||||
deployment_uuid = "83514de2-a770-4e28-82dd-2826b725e733"
|
||||
self.verify.listplugins(deployment_uuid)
|
||||
mock_verification_list_tempest_plugins.assert_called_once_with(
|
||||
deployment_uuid, False)
|
||||
|
||||
@mock.patch("rally.api.Verification.discover_tests")
|
||||
def test_discover(self, mock_verification_discover_tests):
|
||||
deployment_uuid = "97725f22-1cd2-46a5-8c62-3cdc36ed6d2a"
|
||||
|
@ -517,6 +517,15 @@ class VerificationAPITestCase(BaseDeploymentTestCase):
|
||||
"/tmp/fake/plugin")
|
||||
self.tempest.install_plugin.assert_called_once_with()
|
||||
|
||||
@mock.patch("os.path.exists", return_value=True)
|
||||
@mock.patch("rally.common.objects.Deployment.get")
|
||||
@mock.patch("rally.verification.tempest.tempest.Tempest")
|
||||
def test_list_tempest_plugins(
|
||||
self, mock_tempest, mock_deployment_get, mock_exists):
|
||||
mock_tempest.return_value = self.tempest
|
||||
api.Verification.list_tempest_plugins(self.deployment_uuid)
|
||||
self.tempest.list_plugins.assert_called_once_with()
|
||||
|
||||
@mock.patch("os.path.exists", return_value=True)
|
||||
@mock.patch("rally.common.objects.Deployment.get")
|
||||
@mock.patch("rally.verification.tempest.tempest.Tempest")
|
||||
|
@ -342,6 +342,14 @@ class TempestInstallPluginsTestCase(BaseTestCase):
|
||||
mock_tempest_check_output.assert_called_with(cmd,
|
||||
cwd=self.verifier.path())
|
||||
|
||||
@mock.patch(TEMPEST_PATH + ".tempest.check_output")
|
||||
def test_list_plugins(self, mock_tempest_check_output):
|
||||
self.verifier.list_plugins()
|
||||
|
||||
cmd = [self.verifier.venv_wrapper, "tempest", "list-plugins"]
|
||||
mock_tempest_check_output.assert_called_with(
|
||||
cmd, cwd=self.verifier.path(), print_debug_output=False)
|
||||
|
||||
|
||||
class TempestVerifyTestCase(BaseTestCase):
|
||||
def _get_fake_call(self, testr_args,
|
||||
|
Loading…
Reference in New Issue
Block a user