diff --git a/README.md b/README.md index 10a8cda..41f3ff4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ > *cmdline tool for interact with KernelCI* -kci-dev is a cmdline tool for interact with a enabled KernelCI server +Stand alone tool for Linux Kernel developers and maintainers to interact with KernelCI services. ## Quickstart diff --git a/docs/_index.md b/docs/_index.md index 448deb4..ee8d342 100644 --- a/docs/_index.md +++ b/docs/_index.md @@ -4,29 +4,51 @@ date = 2024-01-14T07:07:07+01:00 description = 'Tool for interact programmatically with KernelCI instances.' +++ -kci-dev is a cmdline tool for interact with a enabled KernelCI server. -Purpose of this tool to provide a easy way to use features of KernelCI Pipeline instance. +Stand alone tool for Linux Kernel developers and maintainers to interact with KernelCI. + +Purpose of this tool to provide an easy-to-use command line tool for developers and maintainers request test from KernelCI, view results, download logs, integrate with scripts, etc. ## Installation -### Using PyPI and virtualenv +You may want to use python virtual environment. +If you are not familiar with it, check [this](https://docs.python.org/3/library/venv.html). + +To quickly setup it: + ```sh virtualenv .venv source .venv/bin/activate +``` + +### Using package from PyPI + +Simply install it using `pip`: + +```sh pip install kci-dev ``` -### Using poetry and virtualenv +### Development snapshot through poetry + +Clone the `kci-dev` repo you want, select the desired branch and run: + ```sh virtualenv .venv source .venv/bin/activate pip install poetry poetry install -poetry run kci-dev +``` + +Then, to execute kci-dev: + +```sh +poetry run kci-dev ``` ## Configuration +> Configuration is only necessary if you are using any of the Maestro Commands listed in the Maestro section. + kci-dev searches for and loads a configuration file in the following order of priority: 1) The global configuration file located at /etc/kci-dev.toml. 2) The user-specific configuration file at ~/.config/kci-dev/kci-dev.toml @@ -61,9 +83,9 @@ pipeline is the URL of the KernelCI Pipeline API endpoint, api is the URL of the If you are using KernelCI Pipeline instance, you can get the token from the project maintainers. If it is a local instance, you can generate your token using [kernelci-pipeline/tools/jwt_generator.py](https://github.com/kernelci/kernelci-pipeline/blob/main/tools/jwt_generator.py) script. -## Options +### Configuration options -### instance +#### --instance You can provide the instance name to use for the command. Example: @@ -71,7 +93,7 @@ Example: kci-dev --instance staging ``` -### settings +#### --settings You can provide the configuration file path to use for the command. @@ -80,17 +102,23 @@ Example: kci-dev --settings /path/to/.kci-dev.toml ``` -## Commands +### General Commands + +#### results + +Pull results from the Dashboard. See detailed [documentation](results). + +### Maestro Commands -### checkout +#### checkout - [checkout](checkout) -### testretry +#### testretry - [testretry](testretry) -### results +#### maestro-results -- [results](results) +- [maestro-results](maestro-results) diff --git a/docs/maestro-results.md b/docs/maestro-results.md new file mode 100644 index 0000000..37927ce --- /dev/null +++ b/docs/maestro-results.md @@ -0,0 +1,115 @@ ++++ +title = 'maestro-results' +date = 2024-01-14T07:07:07+01:00 +description = 'Command for show Maestro test results.' ++++ + +This command is Maestro-specific and will show the test result by node id. + +Do not use it, unless you are requesting test on Maestro through `kci-dev`. + +Example: +```sh +kci-dev maestro-results --nodeid +``` + +This command will show the results of tests by page nodes limit and page offset. + +Example: +```sh +kci-dev maestro-results --nodes --limit --offset +``` + +Result sample: +```yaml +{'artifacts': None, + 'created': '2024-10-04T00:49:15.691000', + 'data': {'arch': 'x86_64', + 'compiler': 'gcc-12', + 'config_full': 'x86_64_defconfig+lab-setup+x86-board', + 'defconfig': 'x86_64_defconfig', + 'device': None, + 'error_code': None, + 'error_msg': None, + 'job_context': None, + 'job_id': None, + 'kernel_revision': {'branch': 'staging-mainline', + 'commit': '232edaea0fd9b4b7feb7b43508834bba7e820584', + 'commit_message': 'staging-mainline-20241004.0', + 'commit_tags': ['staging-mainline-20241004.0'], + 'describe': 'staging-mainline-20241004.0', + 'patchset': None, + 'tip_of_branch': False, + 'tree': 'kernelci', + 'url': 'https://github.com/kernelci/linux.git', + 'version': {'extra': '-rc1-115-g232edaea0fd9b', + 'name': None, + 'patchlevel': 12, + 'sublevel': None, + 'version': 6}}, + 'kernel_type': 'bzimage', + 'platform': 'hp-14b-na0052xx-zork', + 'regression': None, + 'runtime': 'lava-collabora', + 'test_revision': None, + 'test_source': None}, + 'debug': None, + 'group': 'kselftest-exec', + 'holdoff': None, + 'id': '66ff3b8c0abcc4c8343d1c71', + 'jobfilter': None, + 'kind': 'test', + 'name': 'exec_execveat_Check_success_of_execveat_20_4096', + 'owner': 'staging.kernelci.org', + 'parent': '66ff3b8b0abcc4c8343d1b8a', + 'path': ['checkout', + 'kbuild-gcc-12-x86', + 'kselftest-exec', + 'kselftest-exec', + 'exec_execveat_Check_success_of_execveat_20_4096'], + 'result': 'pass', + 'state': 'done', + 'submitter': 'service:pipeline', + 'timeout': '2024-10-04T06:49:15.691000', + 'treeid': 'a44035dadc31327a5c30db4013b0e7e90acbb6a8fc45f94a6d91671e76cdfd8a', + 'updated': '2024-10-04T00:49:15.691000', + 'user_groups': []} +``` + +testnodeid is the node id of the test job, which you can get from the KernelCI dashboard. +Usually it is hexadecimal string. + +Additionally, for --nodes you can provide optional parameters --filter to filter the results by the given key and value. +For example: +```sh +./kci-dev.py results --nodes --filter treeid=e25266f77837de335edba3c1b8d2a04edc2bfb195b77c44711d81ebea4494140 --filter kind=test +``` +This command will show the nodes of tests in particular tree checkout. +But as you might see, there is a lot of fields you might be not interested in. + +For this we have additional option --field, that will restrict output only to specified fields. +For example: +```sh +./kci-dev.py results --nodes --filter treeid=e25266f77837de335edba3c1b8d2a04edc2bfb195b77c44711d81ebea4494140 --filter kind=test --field name --field result +``` +Example: + +```json +{'name': 'kver', 'result': 'pass'} +{'name': 'config', 'result': 'pass'} +{'name': 'build', 'result': 'pass'} +{'name': 'example_init_test', 'result': 'pass'} +{'name': 'time64_to_tm_test_date_range', 'result': 'pass'} +{'name': 'test_one_cpu', 'result': 'skip'} +{'name': 'test_many_cpus', 'result': 'skip'} +{'name': 'test_one_task_on_all_cpus', 'result': 'skip'} +{'name': 'test_two_tasks_on_all_cpus', 'result': 'skip'} +{'name': 'test_one_task_on_one_cpu', 'result': 'skip'} +{'name': 'test_one_task_mixed', 'result': 'skip'} +{'name': 'test_two_tasks_on_one_cpu', 'result': 'skip'} +{'name': 'test_two_tasks_on_one_all_cpus', 'result': 'skip'} +{'name': 'test_task_on_all_and_one_cpu', 'result': 'skip'} +{'name': 'resource_test_union', 'result': 'pass'} +{'name': 'resource_test_intersection', 'result': 'pass'} +.... +``` diff --git a/docs/results.md b/docs/results.md index 660831e..8d93ebf 100644 --- a/docs/results.md +++ b/docs/results.md @@ -1,113 +1,66 @@ +++ title = 'results' -date = 2024-01-14T07:07:07+01:00 -description = 'Command for show test results.' +date = 2024-12-10T07:07:07+01:00 +description = 'Fetch results from the KernelCI ecosystem.' +++ -This command will show the test result by node id. +`kci-dev` pulls from our Dashboard API. As of now, it is an EXPERIMENTAL tooling under development with close collaboration from Linux kernel maintainers. + +> KNOWN ISSUE: The Dashboard endpoint we are using returns a file of a few megabytes in size, so download may take +a few seconds, slowing down your usage of `kci-dev results`. We are working on [it](https://github.com/kernelci/dashboard/issues/661). + +## Base parameters + +### --origin + +Set the KCIDB origin desired. 'maestro' is the default. + +### --giturl + +The url of the tree to fetch results + +### --branch + +The branch to get results for + +### --commit + +The tip of tree commit being tested. It needs to be the full commit hash. + +Unfortunately the Dashboard API doesn't support git tags as parameters yet. + +## Results actions + +### --action=summary + +Shows a numeric summary of the build, boot and test results. +If `--action` is omitted, it will show the summary by default. Example: + ```sh -kci-dev results --nodeid +kci-dev results --giturl 'https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git' --branch master --commit d1486dca38afd08ca279ae94eb3a397f10737824 --action=summary ``` -This command will show the results of tests by page nodes limit and page offset. +### --action=failed-builds + +List failed builds. Example: + ```sh -kci-dev results --nodes --limit --offset +kci-dev results --giturl 'https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git' --branch master --commit d1486dca38afd08ca279ae94eb3a397f10737824 --action failed-builds ``` -Result sample: -```yaml -{'artifacts': None, - 'created': '2024-10-04T00:49:15.691000', - 'data': {'arch': 'x86_64', - 'compiler': 'gcc-12', - 'config_full': 'x86_64_defconfig+lab-setup+x86-board', - 'defconfig': 'x86_64_defconfig', - 'device': None, - 'error_code': None, - 'error_msg': None, - 'job_context': None, - 'job_id': None, - 'kernel_revision': {'branch': 'staging-mainline', - 'commit': '232edaea0fd9b4b7feb7b43508834bba7e820584', - 'commit_message': 'staging-mainline-20241004.0', - 'commit_tags': ['staging-mainline-20241004.0'], - 'describe': 'staging-mainline-20241004.0', - 'patchset': None, - 'tip_of_branch': False, - 'tree': 'kernelci', - 'url': 'https://github.com/kernelci/linux.git', - 'version': {'extra': '-rc1-115-g232edaea0fd9b', - 'name': None, - 'patchlevel': 12, - 'sublevel': None, - 'version': 6}}, - 'kernel_type': 'bzimage', - 'platform': 'hp-14b-na0052xx-zork', - 'regression': None, - 'runtime': 'lava-collabora', - 'test_revision': None, - 'test_source': None}, - 'debug': None, - 'group': 'kselftest-exec', - 'holdoff': None, - 'id': '66ff3b8c0abcc4c8343d1c71', - 'jobfilter': None, - 'kind': 'test', - 'name': 'exec_execveat_Check_success_of_execveat_20_4096', - 'owner': 'staging.kernelci.org', - 'parent': '66ff3b8b0abcc4c8343d1b8a', - 'path': ['checkout', - 'kbuild-gcc-12-x86', - 'kselftest-exec', - 'kselftest-exec', - 'exec_execveat_Check_success_of_execveat_20_4096'], - 'result': 'pass', - 'state': 'done', - 'submitter': 'service:pipeline', - 'timeout': '2024-10-04T06:49:15.691000', - 'treeid': 'a44035dadc31327a5c30db4013b0e7e90acbb6a8fc45f94a6d91671e76cdfd8a', - 'updated': '2024-10-04T00:49:15.691000', - 'user_groups': []} -``` +## Downloading logs -testnodeid is the node id of the test job, which you can get from the KernelCI dashboard. -Usually it is hexadecimal string. +`--download-logs` Download failed logs when used with `--action=failed-*` commands. -Additionally, for --nodes you can provide optional parameters --filter to filter the results by the given key and value. -For example: +Example: ```sh -./kci-dev.py results --nodes --filter treeid=e25266f77837de335edba3c1b8d2a04edc2bfb195b77c44711d81ebea4494140 --filter kind=test +kci-dev results --giturl 'https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git' --branch master --commit d1486dca38afd08ca279ae94eb3a397f10737824 --action failed-builds --download-logs ``` -This command will show the nodes of tests in particular tree checkout. -But as you might see, there is a lot of fields you might be not interested in. -For this we have additional option --field, that will restrict output only to specified fields. -For example: -```sh -./kci-dev.py results --nodes --filter treeid=e25266f77837de335edba3c1b8d2a04edc2bfb195b77c44711d81ebea4494140 --filter kind=test --field name --field result -``` -Example: -```json -{'name': 'kver', 'result': 'pass'} -{'name': 'config', 'result': 'pass'} -{'name': 'build', 'result': 'pass'} -{'name': 'example_init_test', 'result': 'pass'} -{'name': 'time64_to_tm_test_date_range', 'result': 'pass'} -{'name': 'test_one_cpu', 'result': 'skip'} -{'name': 'test_many_cpus', 'result': 'skip'} -{'name': 'test_one_task_on_all_cpus', 'result': 'skip'} -{'name': 'test_two_tasks_on_all_cpus', 'result': 'skip'} -{'name': 'test_one_task_on_one_cpu', 'result': 'skip'} -{'name': 'test_one_task_mixed', 'result': 'skip'} -{'name': 'test_two_tasks_on_one_cpu', 'result': 'skip'} -{'name': 'test_two_tasks_on_one_all_cpus', 'result': 'skip'} -{'name': 'test_task_on_all_and_one_cpu', 'result': 'skip'} -{'name': 'resource_test_union', 'result': 'pass'} -{'name': 'resource_test_intersection', 'result': 'pass'} -.... -``` + + diff --git a/kcidev/libs/common.py b/kcidev/libs/common.py index cd97cef..68b5336 100644 --- a/kcidev/libs/common.py +++ b/kcidev/libs/common.py @@ -34,3 +34,11 @@ def load_toml(settings): raise click.Abort() return config + + +def kci_print(content): + click.echo(content) + + +def kci_err(content): + click.secho(content, fg="red", err=True) diff --git a/kcidev/main.py b/kcidev/main.py index b62f666..544b2a5 100755 --- a/kcidev/main.py +++ b/kcidev/main.py @@ -4,11 +4,18 @@ import click from kcidev.libs.common import * -from kcidev.subcommands import checkout, commit, patch, results, testretry +from kcidev.subcommands import ( + checkout, + commit, + maestro_results, + patch, + results, + testretry, +) @click.group( - help="Stand alone tool for Linux Kernel developers and maintainers to interact with KernelCI" + help="Stand alone tool for Linux Kernel developers and maintainers to interact with KernelCI." ) @click.version_option("0.1.0", prog_name="kci-dev") @click.option( @@ -20,26 +27,30 @@ @click.option("--instance", help="API instance to use", required=False) @click.pass_context def cli(ctx, settings, instance): - ctx.obj = {"CFG": load_toml(settings)} - if instance: - ctx.obj["INSTANCE"] = instance - else: - ctx.obj["INSTANCE"] = ctx.obj["CFG"].get("default_instance") - if not ctx.obj["INSTANCE"]: - click.secho("No instance defined in settings or as argument", fg="red") - raise click.Abort() - if ctx.obj["INSTANCE"] not in ctx.obj["CFG"]: - click.secho(f"Instance {ctx.obj['INSTANCE']} not found in {settings}", fg="red") - raise click.Abort() - pass + if ctx.invoked_subcommand != "results": + ctx.obj = {"CFG": load_toml(settings)} + if instance: + ctx.obj["INSTANCE"] = instance + else: + ctx.obj["INSTANCE"] = ctx.obj["CFG"].get("default_instance") + if not ctx.obj["INSTANCE"]: + click.secho("No instance defined in settings or as argument", fg="red") + raise click.Abort() + if ctx.obj["INSTANCE"] not in ctx.obj["CFG"]: + click.secho( + f"Instance {ctx.obj['INSTANCE']} not found in {settings}", fg="red" + ) + raise click.Abort() + pass def run(): cli.add_command(checkout.checkout) cli.add_command(commit.commit) cli.add_command(patch.patch) - cli.add_command(results.results) + cli.add_command(maestro_results.maestro_results) cli.add_command(testretry.testretry) + cli.add_command(results.results) cli() diff --git a/kcidev/subcommands/maestro_results.py b/kcidev/subcommands/maestro_results.py new file mode 100644 index 0000000..97d138b --- /dev/null +++ b/kcidev/subcommands/maestro_results.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import json +import pprint + +import click +import requests +import toml +from git import Repo + + +def api_connection(host): + click.secho("api connect: " + host, fg="green") + return host + + +def print_nodes(nodes, field): + if not isinstance(nodes, list): + nodes = [nodes] + for node in nodes: + if field: + data = {} + for f in field: + data[f] = node.get(f) + click.secho(pprint.pprint(data), fg="green", nl=False) + else: + click.secho(pprint.pprint(node), fg="green", nl=False) + + +def get_node(url, nodeid, field): + headers = { + "Content-Type": "application/json; charset=utf-8", + } + url = url + "latest/node/" + nodeid + click.secho(url) + response = requests.get(url, headers=headers) + try: + response.raise_for_status() + except requests.exceptions.HTTPError as ex: + click.secho(ex.response.json().get("detail"), fg="red") + return None + except Exception as ex: + click.secho(ex, fg="red") + return None + print_nodes(response.json(), field) + + +def get_nodes(url, limit, offset, filter, field): + headers = { + "Content-Type": "application/json; charset=utf-8", + } + url = url + "latest/nodes/fast?limit=" + str(limit) + "&offset=" + str(offset) + if filter: + for f in filter: + # TBD: We need to add translate filter to API + # if we need anything more complex than eq(=) + url = url + "&" + f + + click.secho(url) + response = requests.get(url, headers=headers) + try: + response.raise_for_status() + except requests.exceptions.HTTPError as ex: + click.secho(ex.response.json().get("detail"), fg="red") + return None + except Exception as ex: + click.secho(ex, fg="red") + return None + + nodes = response.json() + print_nodes(nodes, field) + + +@click.command(help="Get results directly from KernelCI's Maestro") +@click.option( + "--nodeid", + required=False, + help="select node_id", +) +@click.option( + "--nodes", + is_flag=True, + required=False, + help="Get last nodes results", +) +@click.option( + "--limit", + default=50, + required=False, + help="Pagination limit for nodes", +) +@click.option( + "--offset", + default=0, + required=False, + help="Offset of the pagination", +) +@click.option( + "--filter", + required=False, + multiple=True, + help="Filter nodes by conditions", +) +@click.option( + "--field", + required=False, + multiple=True, + help="Print only particular field(s) from node data", +) +@click.pass_context +def maestro_results(ctx, nodeid, nodes, limit, offset, filter, field): + config = ctx.obj.get("CFG") + instance = ctx.obj.get("INSTANCE") + url = api_connection(config[instance]["api"]) + if nodeid: + get_node(url, nodeid, field) + if nodes: + get_nodes(url, limit, offset, filter, field) + + +if __name__ == "__main__": + main_kcidev() diff --git a/kcidev/subcommands/results.py b/kcidev/subcommands/results.py index a6a2da0..1f0bdae 100644 --- a/kcidev/subcommands/results.py +++ b/kcidev/subcommands/results.py @@ -1,122 +1,115 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import gzip import json -import pprint +import urllib import click import requests -import toml -from git import Repo +from kcidev.libs.common import * -def api_connection(host): - click.secho("api connect: " + host, fg="green") - return host +DASHBOARD_API = "https://dashboard.kernelci.org/api/" -def print_nodes(nodes, field): - if not isinstance(nodes, list): - nodes = [nodes] - for node in nodes: - if field: - data = {} - for f in field: - data[f] = node.get(f) - click.secho(pprint.pprint(data), fg="green", nl=False) - else: - click.secho(pprint.pprint(node), fg="green", nl=False) - - -def get_node(url, nodeid, field): - headers = { - "Content-Type": "application/json; charset=utf-8", - } - url = url + "latest/node/" + nodeid - click.secho(url) - response = requests.get(url, headers=headers) +def fetch_from_api(endpoint, params): + base_url = urllib.parse.urljoin(DASHBOARD_API, endpoint) try: - response.raise_for_status() - except requests.exceptions.HTTPError as ex: - click.secho(ex.response.json().get("detail"), fg="red") - return None - except Exception as ex: - click.secho(ex, fg="red") - return None - print_nodes(response.json(), field) - - -def get_nodes(url, limit, offset, filter, field): - headers = { - "Content-Type": "application/json; charset=utf-8", + url = "{}?{}".format(base_url, urllib.parse.urlencode(params)) + r = requests.get(url) + except: + click.secho(f"Failed to fetch from {DASHBOARD_API}.") + raise click.Abort() + + return r.json() + + +def cmd_summary(data): + kci_print(f"Builds: {data['buildsSummary']['builds']}") + kci_print(f"Boots: {data['bootStatusSummary']}") + kci_print(f"Tests: {data['testStatusSummary']}") + + +def cmd_failed_builds(data, download_logs): + kci_print("Failed builds:") + for build in data["builds"]: + if not build["valid"]: + log_path = build["log_url"] + if download_logs: + try: + log_gz = requests.get(build["log_url"]) + log = gzip.decompress(log_gz.content) + log_file = f"{build['config_name']}-{build['architecture']}-{build['compiler']}.log" + with open(log_file, mode="wb") as file: + file.write(log) + log_path = os.path.join(os.getcwd(), log_file) + except: + kci_err(f"Failed to fetch log {log_file}).") + pass + + kci_print( + f"- config: {build['config_name']}; arch: {build['architecture']}" + ) + kci_print(f" compiler: {build['compiler']}") + kci_print(f" config_url: {build['config_url']}") + kci_print(f" log: {log_path}") + kci_print(f" id: {build['id']}") + + +def process_action(action, data, download_logs): + if action == None or action == "summary": + cmd_summary(data) + elif action == "failed-builds": + cmd_failed_builds(data, download_logs) + + +def fetch_full_results(origin, giturl, branch, commit): + endpoint = f"tree/{commit}/full" + params = { + "origin": origin, + "git_url": giturl, + "git_branch": branch, + "commit": commit, } - url = url + "latest/nodes/fast?limit=" + str(limit) + "&offset=" + str(offset) - if filter: - for f in filter: - # TBD: We need to add translate filter to API - # if we need anything more complex than eq(=) - url = url + "&" + f - - click.secho(url) - response = requests.get(url, headers=headers) - try: - response.raise_for_status() - except requests.exceptions.HTTPError as ex: - click.secho(ex.response.json().get("detail"), fg="red") - return None - except Exception as ex: - click.secho(ex, fg="red") - return None - nodes = response.json() - print_nodes(nodes, field) + return fetch_from_api(endpoint, params) -@click.command(help="Get results") +@click.command(help=" [Experimental] Get results from the dashboard") @click.option( - "--nodeid", - required=False, - help="select node_id", + "--origin", + help="Select KCIDB origin", + default="maestro", ) @click.option( - "--nodes", - is_flag=True, - required=False, - help="Get last nodes results", + "--giturl", + help="Git URL of kernel tree ", + required=True, ) @click.option( - "--limit", - default=50, - required=False, - help="Pagination limit for nodes", + "--branch", + help="Branch to get results for", + required=True, ) @click.option( - "--offset", - default=0, - required=False, - help="Offset of the pagination", + "--commit", + help="Commit or tag to get results for", + required=True, ) @click.option( - "--filter", - required=False, - multiple=True, - help="Filter nodes by conditions", + "--action", + help="Select desired results action", ) @click.option( - "--field", - required=False, - multiple=True, - help="Print only particular field(s) from node data", + "--download-logs", + is_flag=True, + help="Select desired results action", ) @click.pass_context -def results(ctx, nodeid, nodes, limit, offset, filter, field): - config = ctx.obj.get("CFG") - instance = ctx.obj.get("INSTANCE") - url = api_connection(config[instance]["api"]) - if nodeid: - get_node(url, nodeid, field) - if nodes: - get_nodes(url, limit, offset, filter, field) +def results(ctx, origin, giturl, branch, commit, action, download_logs): + data = fetch_full_results(origin, giturl, branch, commit) + process_action(action, data, download_logs) if __name__ == "__main__": diff --git a/tests/test_kcidev.py b/tests/test_kcidev.py index 989e24f..69bff16 100644 --- a/tests/test_kcidev.py +++ b/tests/test_kcidev.py @@ -46,7 +46,7 @@ def test_kcidev_patch_help(): def test_kcidev_results_help(): - command = ["poetry", "run", "kci-dev", "results", "--help"] + command = ["poetry", "run", "kci-dev", "maestro-results", "--help"] result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True) print("returncode: " + str(result.returncode)) print("#### stdout ####") @@ -85,7 +85,7 @@ def test_kcidev_results_tests(): "kci-dev", "--instance", "staging", - "results", + "maestro-results", "--nodeid", "65a1355ee98651d0fe81e41d", ]