neoload 1.3.12__tar.gz → 1.3.14.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.github/workflows/python-release.yml +1 -1
- {neoload-1.3.12/neoload.egg-info → neoload-1.3.14.dev1}/PKG-INFO +38 -2
- neoload-1.3.12/PKG-INFO → neoload-1.3.14.dev1/README.md +17 -12
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/github/neoload-github-actions-demo.yml +8 -1
- neoload-1.3.14.dev1/neoload/commands/logs.py +21 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/report.py +33 -37
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/__init__.py +1 -1
- neoload-1.3.14.dev1/neoload/neoload_cli_lib/logs_tools.py +21 -0
- neoload-1.3.14.dev1/neoload/neoload_cli_lib/logs_traduction_map.py +31 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/rest_crud.py +0 -1
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/running_tools.py +13 -6
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/sample-custom-report.html.j2 +1 -1
- neoload-1.3.14.dev1/neoload/version.py +1 -0
- neoload-1.3.12/README.md → neoload-1.3.14.dev1/neoload.egg-info/PKG-INFO +48 -1
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload.egg-info/SOURCES.txt +4 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload.egg-info/requires.txt +0 -1
- {neoload-1.3.12 → neoload-1.3.14.dev1}/setup.py +0 -1
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/project/test_upload.py +2 -2
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_report_json_output.py +9 -3
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_trends_json_output.py +11 -2
- neoload-1.3.14.dev1/tests/commands/test_logs/test_logs.py +43 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_validate.py +9 -10
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/conftest.py +28 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/helpers/test_utils.py +3 -3
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_SchemaValidation.py +5 -5
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_running_tools.py +14 -10
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/test_readme.py +1 -1
- neoload-1.3.12/neoload/version.py +0 -1
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.github/workflows/python-integration-tests.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.github/workflows/python-package.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.github/workflows/python-post-release-changelog-pr.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.gitignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/.travis.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/CHANGELOG.md +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/LICENSE +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/MANIFEST.in +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/docker/Dockerfile +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/aws/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/aws/buildspec.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_CLI.jpg +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/README.md +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/neoload-cli-docker.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/azure_devops/neoload-cli-dyninfra.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/bamboo-specs/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/bamboo-specs/Bamboo_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/bamboo-specs/README.md +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/bamboo-specs/bamboo-v1.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/bamboo-specs/bamboo-v2.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/gitlab/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/gitlab/openshift.gitlab-ci.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/jenkins/Jenkinsfile_dyninfra +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/jenkins/Jenkinsfile_slafails +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/__main__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/config.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/docker.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/fastfail.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/login.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/logout.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/logs_url.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/project.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/run.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/status.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/stop.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/test_results.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/test_settings.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/validate.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/wait.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/workspaces.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/commands/zones.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/bad_as_code_exception.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/cli_exception.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/config_global.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/displayer.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/docker_lib.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/filtering.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/hooks.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/name_resolver.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/neoLoad_project.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/paths.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/schema_validation.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/tools.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/neoload_cli_lib/user_data.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/builtin_console_summary.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/builtin_transactions_csv.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/common.js +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/external_data.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/general_details.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/header.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/hits_per_second.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/running_vus.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/styles.css +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/transactions.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/common/workload_characteristics.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/custom_transactions_export.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/sample-trends-report.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/trends/general_details.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/trends/transaction_trends.html.j2 +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload/resources/jinja/trends/trends.js +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload.egg-info/dependency_links.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload.egg-info/entry_points.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/neoload.egg-info/top_level.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/notes/PSB_20200421_TODO.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/notes/acceptance.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/pull_request_template.md +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/pytest.ini +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/requirements.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/resources/as-code.latest.schema.json +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/setup.cfg +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/sonar-project.properties +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/docker/test_docker_cleanups.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/docker/test_docker_connections.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/docker/test_docker_hooks.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/fastfail/test_fastfail_slas.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_report.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_report_templates.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_report_transactions.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_report_trends.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/report/test_trends_templates.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/status/test_status_with_names.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_config.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_login.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_logout.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_logs_url.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_results/test_result_delete.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_results/test_result_ls.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_results/test_result_patch.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_results/test_result_put.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_run.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_create.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_createorpatch.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_delete.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_ls.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_patch.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/test_settings/test_put.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/wait/test_wait.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/workspaces/test_workspace_ls.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/workspaces/test_workspace_use.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/commands/zones/test_zones.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/helpers/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/expected/fastfail.log +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/expected/junit-sla.xml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/expected/run.log +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/expected/summary.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/runAllScripts.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/cleanup.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/project.upload.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/results.delete.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/results.patch.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/results.put.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/run.fastfail.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/run.oneliner.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/run.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/settings.create.delete.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/settings.patch.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/settings.put.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/validate.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/wait.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/integration/scripts/zones.ls.test.sh +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_displayer.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_docker.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_filtering.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_rest_crud.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_tools.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_cli_lib/test_user_data.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/broken_yaml.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/empty.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/.gitlab-ci.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/.nlignore +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/data/cities.csv +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/default.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/paths/geosearch_get.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/slas/prod.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1/slas/uat.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/example_1.zip +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/invalid_to_schema.yaml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/neoload_projects/simpledemo.yml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/expected_neoload_junit_slas.xml +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/expected_summary_text_no_sla.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/expected_summary_text_with_sla.txt +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/jinja/__init__.py +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_custom_report.html +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_custom_report_filtered.html +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_custom_transactions.csv +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_report.json +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_report_filtered.json +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_template_transactions.json +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_template_transactions_csv.csv +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_template_trends.html +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/expected_trends.json +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/raw_expected_custom_report.html +0 -0
- {neoload-1.3.12 → neoload-1.3.14.dev1}/tests/resources/report/raw_expected_report.json +0 -0
|
@@ -25,6 +25,6 @@ jobs:
|
|
|
25
25
|
python setup.py sdist bdist_wheel
|
|
26
26
|
- name: Publish distribution to PyPI
|
|
27
27
|
if: startsWith(github.ref, 'refs/tags')
|
|
28
|
-
uses: pypa/gh-action-pypi-publish@
|
|
28
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
29
29
|
with:
|
|
30
30
|
password: ${{ secrets.PYPI_TOKEN }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: neoload
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.14.dev1
|
|
4
4
|
Summary: A command-line native utility for launching and observing NeoLoad performance tests
|
|
5
5
|
Home-page: https://github.com/Neotys-Labs/neoload-cli
|
|
6
6
|
Author: Neotys
|
|
@@ -8,6 +8,26 @@ Author-email:
|
|
|
8
8
|
License: Apache 2.0
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
10
|
License-File: LICENSE
|
|
11
|
+
Requires-Dist: click>=7
|
|
12
|
+
Requires-Dist: pyconfig
|
|
13
|
+
Requires-Dist: appdirs
|
|
14
|
+
Requires-Dist: requests>=2.25.1
|
|
15
|
+
Requires-Dist: jsonschema
|
|
16
|
+
Requires-Dist: PyYAML>=5
|
|
17
|
+
Requires-Dist: junit_xml
|
|
18
|
+
Requires-Dist: termcolor
|
|
19
|
+
Requires-Dist: coloredlogs
|
|
20
|
+
Requires-Dist: gitignorefile
|
|
21
|
+
Requires-Dist: jinja2
|
|
22
|
+
Requires-Dist: python-dateutil
|
|
23
|
+
Requires-Dist: tqdm
|
|
24
|
+
Requires-Dist: requests_toolbelt
|
|
25
|
+
Requires-Dist: urllib3>=1.26.5
|
|
26
|
+
Requires-Dist: docker
|
|
27
|
+
Requires-Dist: pyparsing
|
|
28
|
+
Requires-Dist: simplejson
|
|
29
|
+
Requires-Dist: colorama
|
|
30
|
+
Requires-Dist: importlib-resources
|
|
11
31
|
|
|
12
32
|
# NeoLoad CLI [](https://github.com/Neotys-Labs/neoload-cli/actions?query=workflow%3A%22Python+package%22+branch%3A%22master%22)
|
|
13
33
|
|
|
@@ -111,7 +131,7 @@ The CLI allows you to choose your workspace at login or with the "use" sub-comma
|
|
|
111
131
|
|
|
112
132
|
|
|
113
133
|
### Setup resources in Neoload Web
|
|
114
|
-
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://
|
|
134
|
+
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://documentation.tricentis.com/nlweb/latest/en/content/reference_guide/resources_zones.htm)
|
|
115
135
|
You must at least have either a dynamic or a static zone with one controller and one load generator. At First, you could add resources to the "Default zone" since the CLI use it by default.
|
|
116
136
|
|
|
117
137
|
### Define a Test
|
|
@@ -225,6 +245,8 @@ The 'report' subcommand is intended to simplify not only common data exporting n
|
|
|
225
245
|
templating capabilities over a standard, correlated data model. In contrast to the test-results
|
|
226
246
|
subcommand, 'report' can be used to generate as well as transform test result data.
|
|
227
247
|
|
|
248
|
+
:warning: The 'report' subcommand can be **slow** (several hours) on results with a lots of transactions or monitors.
|
|
249
|
+
|
|
228
250
|
### Exporting Transaction CSV data
|
|
229
251
|
```
|
|
230
252
|
Usage: neoload report [OPTIONS] [NAME]
|
|
@@ -300,6 +322,20 @@ neoload report --json-in ~/Downloads/temp.json \
|
|
|
300
322
|
NOTE: built-in reports produce a reduced-scope JSON data model and are therefore faster
|
|
301
323
|
that exporting all test data for various templates and output specs.
|
|
302
324
|
|
|
325
|
+
### Work with big results
|
|
326
|
+
|
|
327
|
+
Big results for the CLI means several hundreds of transactions, with several LGs and last several hours.
|
|
328
|
+
|
|
329
|
+
The 'report' subcommand get a lot of data from NeoLoad Web API, it is not recommended to use with big results
|
|
330
|
+
because it could take several hours to complete and may fail.
|
|
331
|
+
|
|
332
|
+
The 'report' subcommand gets all "values" and the "timeseries points" of all statistics from NLW API for each transaction and monitor: \
|
|
333
|
+
it makes 2 API calls per transaction and 1 API call per monitor to NLW API. 10 calls are made in parallel
|
|
334
|
+
(can be configured with env variable `NL_MAX_WORKERS`). \
|
|
335
|
+
In NeoLoad Web SaaS, the rate limit of 300 calls per minute may be reached, the CLI will adapt and slow down.
|
|
336
|
+
|
|
337
|
+
To see which API calls are made, you can use the debug option: `neoload --debug report`
|
|
338
|
+
|
|
303
339
|
## View zones
|
|
304
340
|
```
|
|
305
341
|
neoload zones --human
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: neoload
|
|
3
|
-
Version: 1.3.12
|
|
4
|
-
Summary: A command-line native utility for launching and observing NeoLoad performance tests
|
|
5
|
-
Home-page: https://github.com/Neotys-Labs/neoload-cli
|
|
6
|
-
Author: Neotys
|
|
7
|
-
Author-email:
|
|
8
|
-
License: Apache 2.0
|
|
9
|
-
Description-Content-Type: text/markdown
|
|
10
|
-
License-File: LICENSE
|
|
11
|
-
|
|
12
1
|
# NeoLoad CLI [](https://github.com/Neotys-Labs/neoload-cli/actions?query=workflow%3A%22Python+package%22+branch%3A%22master%22)
|
|
13
2
|
|
|
14
3
|
## Overview
|
|
@@ -111,7 +100,7 @@ The CLI allows you to choose your workspace at login or with the "use" sub-comma
|
|
|
111
100
|
|
|
112
101
|
|
|
113
102
|
### Setup resources in Neoload Web
|
|
114
|
-
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://
|
|
103
|
+
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://documentation.tricentis.com/nlweb/latest/en/content/reference_guide/resources_zones.htm)
|
|
115
104
|
You must at least have either a dynamic or a static zone with one controller and one load generator. At First, you could add resources to the "Default zone" since the CLI use it by default.
|
|
116
105
|
|
|
117
106
|
### Define a Test
|
|
@@ -225,6 +214,8 @@ The 'report' subcommand is intended to simplify not only common data exporting n
|
|
|
225
214
|
templating capabilities over a standard, correlated data model. In contrast to the test-results
|
|
226
215
|
subcommand, 'report' can be used to generate as well as transform test result data.
|
|
227
216
|
|
|
217
|
+
:warning: The 'report' subcommand can be **slow** (several hours) on results with a lots of transactions or monitors.
|
|
218
|
+
|
|
228
219
|
### Exporting Transaction CSV data
|
|
229
220
|
```
|
|
230
221
|
Usage: neoload report [OPTIONS] [NAME]
|
|
@@ -300,6 +291,20 @@ neoload report --json-in ~/Downloads/temp.json \
|
|
|
300
291
|
NOTE: built-in reports produce a reduced-scope JSON data model and are therefore faster
|
|
301
292
|
that exporting all test data for various templates and output specs.
|
|
302
293
|
|
|
294
|
+
### Work with big results
|
|
295
|
+
|
|
296
|
+
Big results for the CLI means several hundreds of transactions, with several LGs and last several hours.
|
|
297
|
+
|
|
298
|
+
The 'report' subcommand get a lot of data from NeoLoad Web API, it is not recommended to use with big results
|
|
299
|
+
because it could take several hours to complete and may fail.
|
|
300
|
+
|
|
301
|
+
The 'report' subcommand gets all "values" and the "timeseries points" of all statistics from NLW API for each transaction and monitor: \
|
|
302
|
+
it makes 2 API calls per transaction and 1 API call per monitor to NLW API. 10 calls are made in parallel
|
|
303
|
+
(can be configured with env variable `NL_MAX_WORKERS`). \
|
|
304
|
+
In NeoLoad Web SaaS, the rate limit of 300 calls per minute may be reached, the CLI will adapt and slow down.
|
|
305
|
+
|
|
306
|
+
To see which API calls are made, you can use the debug option: `neoload --debug report`
|
|
307
|
+
|
|
303
308
|
## View zones
|
|
304
309
|
```
|
|
305
310
|
neoload zones --human
|
{neoload-1.3.12 → neoload-1.3.14.dev1}/examples/pipelines/github/neoload-github-actions-demo.yml
RENAMED
|
@@ -20,6 +20,9 @@ jobs:
|
|
|
20
20
|
name: NeoLoad CLI demo github action
|
|
21
21
|
runs-on: ubuntu-latest
|
|
22
22
|
steps:
|
|
23
|
+
- name: Checkout local code
|
|
24
|
+
uses: actions/checkout@v3
|
|
25
|
+
|
|
23
26
|
- name: "Install NeoLoad CLI"
|
|
24
27
|
run: pip3 install -U neoload
|
|
25
28
|
|
|
@@ -44,11 +47,15 @@ jobs:
|
|
|
44
47
|
--return-0
|
|
45
48
|
|
|
46
49
|
- name: "Generate Test Report"
|
|
50
|
+
id: report
|
|
51
|
+
if: ${{ always() }}
|
|
47
52
|
run: neoload test-results junitsla
|
|
48
53
|
|
|
49
54
|
- name: "Publish Test Report"
|
|
50
|
-
if:
|
|
55
|
+
if: steps.report.outcome == 'success'
|
|
51
56
|
uses: scacap/action-surefire-report@v1
|
|
52
57
|
with:
|
|
53
58
|
report_paths: junit-sla.xml
|
|
54
59
|
fail_on_test_failures: true
|
|
60
|
+
|
|
61
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import time
|
|
3
|
+
from neoload_cli_lib import logs_tools, rest_crud
|
|
4
|
+
from commands import test_results
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@click.command()
|
|
9
|
+
@click.argument('name', type=str)
|
|
10
|
+
def cli(name):
|
|
11
|
+
"""get logs url of a test result managed by NeoLoad Web"""
|
|
12
|
+
workspace = rest_crud.get_workspace()
|
|
13
|
+
if workspace is None:
|
|
14
|
+
print("You have not defined a workspace please use: neoload workspaces use 'your workspace'")
|
|
15
|
+
return
|
|
16
|
+
results_id = test_results.get_id_by_name_or_id(name)
|
|
17
|
+
displayed_lines = []
|
|
18
|
+
logs_tools.display_logs(displayed_lines, results_id)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
@@ -35,6 +35,7 @@ __operation_elements = "/elements"
|
|
|
35
35
|
__operation_monitors = "/monitors"
|
|
36
36
|
|
|
37
37
|
QUERY_CATEGORY_TRANSACTION = "category=TRANSACTION"
|
|
38
|
+
CONTROLLER_MONITORS_ROOT = ['Controller', 'Contrôleur']
|
|
38
39
|
|
|
39
40
|
meta_key = 'result id'
|
|
40
41
|
__resolver = test_results.get_resolver();
|
|
@@ -258,35 +259,25 @@ def can_raw_transactions_data():
|
|
|
258
259
|
return False if user_data.is_version_lower_than('2.6.0') else True
|
|
259
260
|
|
|
260
261
|
|
|
261
|
-
def
|
|
262
|
-
|
|
263
|
-
# look for the transaction with the smallest number of iterations, but that has raw data
|
|
262
|
+
def is_not_all_transactions(element):
|
|
263
|
+
return element.get('elementId') != 'all-transactions'
|
|
264
264
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
txns = sorted(txns, key=lambda el: el['count'])
|
|
282
|
-
for el in txns:
|
|
283
|
-
this_raw_count = len(
|
|
284
|
-
rest_crud.get(get_end_point(__id, __operation_elements) + "/" + el['id'] + "/raw?format=JSON"))
|
|
285
|
-
if this_raw_count > 0:
|
|
286
|
-
logging.debug("use_raw[1]: True")
|
|
287
|
-
return True
|
|
288
|
-
|
|
289
|
-
logging.debug("use_raw[1]: False")
|
|
265
|
+
|
|
266
|
+
def should_raw_transactions_data(__id, time_binding):
|
|
267
|
+
values = rest_crud.get(get_end_point(__id, __operation_elements) + "/values?" + QUERY_CATEGORY_TRANSACTION)
|
|
268
|
+
transaction_with_max_count = max(filter(is_not_all_transactions, values), key=lambda el: el['count'], default=None)
|
|
269
|
+
if time_binding is not None and "from_secs" in time_binding and can_raw_transactions_data() and transaction_with_max_count is not None:
|
|
270
|
+
tr_id = transaction_with_max_count.get('elementId')
|
|
271
|
+
try:
|
|
272
|
+
raw_points_length = len(
|
|
273
|
+
rest_crud.get(f"{get_end_point(__id, __operation_elements)}/{tr_id}/raw?format=JSON"))
|
|
274
|
+
except cli_exception.CliException as ex:
|
|
275
|
+
logging.error(ex.format_message())
|
|
276
|
+
raw_points_length = 0
|
|
277
|
+
gprint(f"Will {'' if raw_points_length > 0 else 'not '}use raw data because time filter enabled and transaction {tr_id} has {raw_points_length} raw data")
|
|
278
|
+
return raw_points_length > 0
|
|
279
|
+
|
|
280
|
+
logging.debug("Will not use raw data because: no time filter or NLW not compatible or no transaction has raw data")
|
|
290
281
|
return False
|
|
291
282
|
|
|
292
283
|
|
|
@@ -346,11 +337,9 @@ def get_single_report(name, components=None, time_filter=None, elements_filter=N
|
|
|
346
337
|
|
|
347
338
|
statistics_list = get_standard_statistics_list()
|
|
348
339
|
|
|
349
|
-
|
|
340
|
+
fill_single_requests(__id, elements_filter, time_binding, statistics_list, components, data)
|
|
350
341
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
fill_single_transactions(__id, elements_filter, time_binding, statistics_list, use_txn_raw, components, data)
|
|
342
|
+
fill_single_transactions(__id, elements_filter, time_binding, statistics_list, components, data)
|
|
354
343
|
|
|
355
344
|
fill_single_monitors(__id, components, data)
|
|
356
345
|
|
|
@@ -407,7 +396,7 @@ def fill_single_events(__id, components, data):
|
|
|
407
396
|
data['events'] = rest_crud.get(get_end_point(__id, __operation_events))
|
|
408
397
|
|
|
409
398
|
|
|
410
|
-
def fill_single_requests(__id, elements_filter, time_binding, statistics_list,
|
|
399
|
+
def fill_single_requests(__id, elements_filter, time_binding, statistics_list, components, data):
|
|
411
400
|
if components['all_requests']:
|
|
412
401
|
gprint("Getting all-request data...")
|
|
413
402
|
|
|
@@ -422,13 +411,13 @@ def fill_single_requests(__id, elements_filter, time_binding, statistics_list, u
|
|
|
422
411
|
json_elements_all_requests = json_elements_all_requests + json_elements_all_requests_preserve
|
|
423
412
|
|
|
424
413
|
json_elements_all_requests = get_elements_data(__id, json_elements_all_requests, time_binding, True,
|
|
425
|
-
statistics_list,
|
|
414
|
+
statistics_list, False)
|
|
426
415
|
|
|
427
416
|
data['all_requests'] = json_elements_all_requests[0] if json_elements_all_requests is not None and len(
|
|
428
417
|
json_elements_all_requests) > 0 else {},
|
|
429
418
|
|
|
430
419
|
|
|
431
|
-
def fill_single_transactions(__id, elements_filter, time_binding, statistics_list,
|
|
420
|
+
def fill_single_transactions(__id, elements_filter, time_binding, statistics_list, components, data):
|
|
432
421
|
if components['transactions']:
|
|
433
422
|
gprint("Getting transactions...")
|
|
434
423
|
|
|
@@ -437,6 +426,7 @@ def fill_single_transactions(__id, elements_filter, time_binding, statistics_lis
|
|
|
437
426
|
if not elements_filter is None:
|
|
438
427
|
json_elements_transactions = filter_elements(json_elements_transactions, elements_filter)
|
|
439
428
|
|
|
429
|
+
use_txn_raw = should_raw_transactions_data(__id, time_binding)
|
|
440
430
|
json_elements_transactions = get_elements_data(__id, json_elements_transactions, time_binding, True,
|
|
441
431
|
statistics_list, use_txn_raw)
|
|
442
432
|
|
|
@@ -469,7 +459,8 @@ def fill_single_ext_data(__id, components, data):
|
|
|
469
459
|
|
|
470
460
|
def fill_single_controller_points(__id, components, data):
|
|
471
461
|
if components['controller_points']:
|
|
472
|
-
data['controller_points'] = get_mon_datas(__id, lambda m: m['path'][0]
|
|
462
|
+
data['controller_points'] = get_mon_datas(__id, lambda m: m['path'][0] in CONTROLLER_MONITORS_ROOT,
|
|
463
|
+
data['monitors'], True)
|
|
473
464
|
|
|
474
465
|
|
|
475
466
|
# examples
|
|
@@ -898,7 +889,12 @@ def get_elements_data(result_id, base_col, time_binding, include_points, statist
|
|
|
898
889
|
procedure = lambda el: (
|
|
899
890
|
get_perf_time(), get_element_data(el, result_id, time_binding, include_points, statistics_list, use_txn_raw))
|
|
900
891
|
|
|
901
|
-
|
|
892
|
+
max_workers = MAX_ELEMENTS_WORKERS
|
|
893
|
+
try:
|
|
894
|
+
max_workers = int(os.getenv('NL_MAX_WORKERS', MAX_ELEMENTS_WORKERS))
|
|
895
|
+
except ValueError:
|
|
896
|
+
logging.warning(f'NL_MAX_WORKERS environment variable is not an integer. Use default {MAX_ELEMENTS_WORKERS}')
|
|
897
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
902
898
|
translate = {executor.submit(procedure, el): el for el in base_col}
|
|
903
899
|
for future in concurrent.futures.as_completed(translate):
|
|
904
900
|
orig = translate[future]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
__all__ = ["user_data", "rest_crud", "running_tools", "cli_exception", "displayer", "schema_validation",
|
|
2
|
-
"name_resolver", "neoLoad_project", "tools", "docker_lib"]
|
|
2
|
+
"name_resolver", "neoLoad_project", "tools", "docker_lib", "logs_tools"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from neoload_cli_lib import user_data, rest_crud, tools
|
|
2
|
+
from commands import test_results
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from neoload_cli_lib.logs_traduction_map import dicotrad
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def display_logs(displayed_lines, results_id):
|
|
8
|
+
res = rest_crud.get(test_results.get_end_point(results_id, "/logs"))
|
|
9
|
+
if res:
|
|
10
|
+
for entry in res:
|
|
11
|
+
if entry not in displayed_lines:
|
|
12
|
+
content = entry['content']
|
|
13
|
+
translated = dicotrad.get(content, content)
|
|
14
|
+
log_line_translated = f"{format_time(entry['timestamp'])} {translated}"
|
|
15
|
+
print(log_line_translated)
|
|
16
|
+
displayed_lines.append(entry)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def format_time(timestamp):
|
|
20
|
+
dt = datetime.fromtimestamp(timestamp / 1000)
|
|
21
|
+
return dt.strftime("%d.%m.%y %I:%M:%S %p")
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
dicotrad = {
|
|
2
|
+
"AUTO_RESERVE": "Auto reserve resources",
|
|
3
|
+
"AUTO_RESERVED": "Auto-reservation completed",
|
|
4
|
+
"GETTING_AVAILABLE_CONTROLLERS": "Controller preparation",
|
|
5
|
+
"GETTING_AVAILABLE_LGS": "Load generators preparation",
|
|
6
|
+
"DOWNLOADING_PROJECT": "Sending project to controller",
|
|
7
|
+
"PUBLISHING_INFRASTRUCTURE": "Sending load generators details to controller",
|
|
8
|
+
"DOWNLOADING_ASCODE_FILE": "Sending additional as-code file",
|
|
9
|
+
"STARTING_BENCH": "Starting infrastructure and test",
|
|
10
|
+
"STARTED_BENCH": "Test started",
|
|
11
|
+
"CANCELLED_BENCH": "Test cancelled",
|
|
12
|
+
"ERROR_NO_MORE_CONTROLLER_CANDIDATE": "No controller agents available in the selected zone",
|
|
13
|
+
"ERROR_NO_MORE_LG_CANDIDATE": "No load generator agents available in the selected zones",
|
|
14
|
+
"ERROR_MAX_RETRY_REACHED": "Too many attempts have been done, please try again",
|
|
15
|
+
"ERROR_UNEXPECTED_BEHAVIOR": "An unexpected error occurred",
|
|
16
|
+
"ERROR_LG_NOT_ENOUGH_SAME_VERSION": "Not enough resources available with the same version",
|
|
17
|
+
"ERROR_AUTO_RESERVATION_FAILED": "Auto-reservation failed",
|
|
18
|
+
"ERROR_ZONE_DELETED": "Test launch aborted: Controller or LG Zone(s) have been deleted.",
|
|
19
|
+
"ERROR_FETCHING_PROJECT_PASSPHRASE": "Unable to retrieve the configured password.",
|
|
20
|
+
"INITIALIZED": "Initialization",
|
|
21
|
+
"CHECKING_AUTO_RESERVATION": "Checking auto-reservation status",
|
|
22
|
+
"SELECTING_VERSION": "Selecting version",
|
|
23
|
+
"ELECTING_CONTROLLER": "Electing controller",
|
|
24
|
+
"LOCKING_CONTROLLER": "Locking controller",
|
|
25
|
+
"CHECKING_CONTROLLER_LOCK": "checking controller",
|
|
26
|
+
"ELECTING_LG": "Electing LG",
|
|
27
|
+
"CHECKING_DOWNLOADED_PROJECT": "Checking downloaded project",
|
|
28
|
+
"DOWNLOADING_INFRASTRUCTURE": "Downloading infrastructure",
|
|
29
|
+
"CHECKING_DOWNLOADED_INFRASTRUCTURE": "Checking downloaded infrastructure",
|
|
30
|
+
"CHECKING_STARTED_BENCH": "Checking started bench", "RETRIEVING_LOGS": "Retrieving logs"
|
|
31
|
+
}
|
|
@@ -6,11 +6,11 @@ from signal import signal, SIGINT
|
|
|
6
6
|
|
|
7
7
|
from commands import logs_url, test_results
|
|
8
8
|
from commands import run
|
|
9
|
-
from neoload_cli_lib import tools, rest_crud,hooks
|
|
9
|
+
from neoload_cli_lib import tools, rest_crud, hooks, logs_tools
|
|
10
10
|
|
|
11
11
|
__current_id = None
|
|
12
12
|
__count = 0
|
|
13
|
-
|
|
13
|
+
nbsecond = 0
|
|
14
14
|
__last_status = ""
|
|
15
15
|
|
|
16
16
|
def __is_current_state_running(status):
|
|
@@ -39,8 +39,9 @@ def wait(results_id, exit_code_sla, data_lock): # data_lock is needed to lock re
|
|
|
39
39
|
__current_id = results_id
|
|
40
40
|
signal(SIGINT, handler)
|
|
41
41
|
header_status(results_id)
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
displayed_lines=[]
|
|
43
|
+
while display_status(displayed_lines, results_id, data_lock):
|
|
44
|
+
time.sleep(1)
|
|
44
45
|
|
|
45
46
|
__current_id = None
|
|
46
47
|
hooks.trig("test.stop")
|
|
@@ -56,12 +57,12 @@ def header_status(results_id):
|
|
|
56
57
|
webbrowser.open_new_tab(url)
|
|
57
58
|
|
|
58
59
|
# INIT, STARTING, RUNNING, TERMINATED
|
|
59
|
-
def display_status(results_id, data_lock):
|
|
60
|
+
def display_status(displayed_lines, results_id, data_lock):
|
|
60
61
|
global __last_status
|
|
61
62
|
res = rest_crud.get(test_results.get_end_point(results_id))
|
|
62
63
|
status = res.get('status')
|
|
63
64
|
quality_status = res.get('qualityStatus')
|
|
64
|
-
|
|
65
|
+
global nbsecond
|
|
65
66
|
if __last_status != status:
|
|
66
67
|
print("Status: " + status)
|
|
67
68
|
__last_status = status
|
|
@@ -72,6 +73,12 @@ def display_status(results_id, data_lock):
|
|
|
72
73
|
__lock_result(results_id, data_lock)
|
|
73
74
|
if status == "RUNNING":
|
|
74
75
|
display_statistics(results_id, res)
|
|
76
|
+
workspace = rest_crud.get_workspace()
|
|
77
|
+
if workspace is not None:
|
|
78
|
+
logs_tools.display_logs(displayed_lines, results_id)
|
|
79
|
+
if nbsecond % 20 == 0:
|
|
80
|
+
display_statistics(results_id, res)
|
|
81
|
+
nbsecond += 1
|
|
75
82
|
if status == "TERMINATED":
|
|
76
83
|
return False
|
|
77
84
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{% with title=summary.name %}{% include 'common/header.j2' %}{% endwith %}
|
|
13
13
|
|
|
14
14
|
<script type="text/javascript">
|
|
15
|
-
window.ctrl_user_load = {{ controller_points | selectattr('name','
|
|
15
|
+
window.ctrl_user_load = {{ controller_points | selectattr('name','in', ['User Load', 'Charge Utilisateurs']) | map(attribute='points') | first | tojson }};
|
|
16
16
|
window.all_requests = {{ all_requests | selectattr('type','equalto', 'ALL_REQUESTS') | map(attribute='points') | first | tojson }};
|
|
17
17
|
</script>
|
|
18
18
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.3.14.dev1"
|
|
@@ -1,3 +1,34 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: neoload
|
|
3
|
+
Version: 1.3.14.dev1
|
|
4
|
+
Summary: A command-line native utility for launching and observing NeoLoad performance tests
|
|
5
|
+
Home-page: https://github.com/Neotys-Labs/neoload-cli
|
|
6
|
+
Author: Neotys
|
|
7
|
+
Author-email:
|
|
8
|
+
License: Apache 2.0
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: click>=7
|
|
12
|
+
Requires-Dist: pyconfig
|
|
13
|
+
Requires-Dist: appdirs
|
|
14
|
+
Requires-Dist: requests>=2.25.1
|
|
15
|
+
Requires-Dist: jsonschema
|
|
16
|
+
Requires-Dist: PyYAML>=5
|
|
17
|
+
Requires-Dist: junit_xml
|
|
18
|
+
Requires-Dist: termcolor
|
|
19
|
+
Requires-Dist: coloredlogs
|
|
20
|
+
Requires-Dist: gitignorefile
|
|
21
|
+
Requires-Dist: jinja2
|
|
22
|
+
Requires-Dist: python-dateutil
|
|
23
|
+
Requires-Dist: tqdm
|
|
24
|
+
Requires-Dist: requests_toolbelt
|
|
25
|
+
Requires-Dist: urllib3>=1.26.5
|
|
26
|
+
Requires-Dist: docker
|
|
27
|
+
Requires-Dist: pyparsing
|
|
28
|
+
Requires-Dist: simplejson
|
|
29
|
+
Requires-Dist: colorama
|
|
30
|
+
Requires-Dist: importlib-resources
|
|
31
|
+
|
|
1
32
|
# NeoLoad CLI [](https://github.com/Neotys-Labs/neoload-cli/actions?query=workflow%3A%22Python+package%22+branch%3A%22master%22)
|
|
2
33
|
|
|
3
34
|
## Overview
|
|
@@ -100,7 +131,7 @@ The CLI allows you to choose your workspace at login or with the "use" sub-comma
|
|
|
100
131
|
|
|
101
132
|
|
|
102
133
|
### Setup resources in Neoload Web
|
|
103
|
-
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://
|
|
134
|
+
Run a test requires an infrastructure that is defined in Neoload Web Zones section [(see documentation how to manage zones)](https://documentation.tricentis.com/nlweb/latest/en/content/reference_guide/resources_zones.htm)
|
|
104
135
|
You must at least have either a dynamic or a static zone with one controller and one load generator. At First, you could add resources to the "Default zone" since the CLI use it by default.
|
|
105
136
|
|
|
106
137
|
### Define a Test
|
|
@@ -214,6 +245,8 @@ The 'report' subcommand is intended to simplify not only common data exporting n
|
|
|
214
245
|
templating capabilities over a standard, correlated data model. In contrast to the test-results
|
|
215
246
|
subcommand, 'report' can be used to generate as well as transform test result data.
|
|
216
247
|
|
|
248
|
+
:warning: The 'report' subcommand can be **slow** (several hours) on results with a lots of transactions or monitors.
|
|
249
|
+
|
|
217
250
|
### Exporting Transaction CSV data
|
|
218
251
|
```
|
|
219
252
|
Usage: neoload report [OPTIONS] [NAME]
|
|
@@ -289,6 +322,20 @@ neoload report --json-in ~/Downloads/temp.json \
|
|
|
289
322
|
NOTE: built-in reports produce a reduced-scope JSON data model and are therefore faster
|
|
290
323
|
that exporting all test data for various templates and output specs.
|
|
291
324
|
|
|
325
|
+
### Work with big results
|
|
326
|
+
|
|
327
|
+
Big results for the CLI means several hundreds of transactions, with several LGs and last several hours.
|
|
328
|
+
|
|
329
|
+
The 'report' subcommand get a lot of data from NeoLoad Web API, it is not recommended to use with big results
|
|
330
|
+
because it could take several hours to complete and may fail.
|
|
331
|
+
|
|
332
|
+
The 'report' subcommand gets all "values" and the "timeseries points" of all statistics from NLW API for each transaction and monitor: \
|
|
333
|
+
it makes 2 API calls per transaction and 1 API call per monitor to NLW API. 10 calls are made in parallel
|
|
334
|
+
(can be configured with env variable `NL_MAX_WORKERS`). \
|
|
335
|
+
In NeoLoad Web SaaS, the rate limit of 300 calls per minute may be reached, the CLI will adapt and slow down.
|
|
336
|
+
|
|
337
|
+
To see which API calls are made, you can use the debug option: `neoload --debug report`
|
|
338
|
+
|
|
292
339
|
## View zones
|
|
293
340
|
```
|
|
294
341
|
neoload zones --human
|
|
@@ -47,6 +47,7 @@ neoload/commands/docker.py
|
|
|
47
47
|
neoload/commands/fastfail.py
|
|
48
48
|
neoload/commands/login.py
|
|
49
49
|
neoload/commands/logout.py
|
|
50
|
+
neoload/commands/logs.py
|
|
50
51
|
neoload/commands/logs_url.py
|
|
51
52
|
neoload/commands/project.py
|
|
52
53
|
neoload/commands/report.py
|
|
@@ -67,6 +68,8 @@ neoload/neoload_cli_lib/displayer.py
|
|
|
67
68
|
neoload/neoload_cli_lib/docker_lib.py
|
|
68
69
|
neoload/neoload_cli_lib/filtering.py
|
|
69
70
|
neoload/neoload_cli_lib/hooks.py
|
|
71
|
+
neoload/neoload_cli_lib/logs_tools.py
|
|
72
|
+
neoload/neoload_cli_lib/logs_traduction_map.py
|
|
70
73
|
neoload/neoload_cli_lib/name_resolver.py
|
|
71
74
|
neoload/neoload_cli_lib/neoLoad_project.py
|
|
72
75
|
neoload/neoload_cli_lib/paths.py
|
|
@@ -119,6 +122,7 @@ tests/commands/report/test_report_trends.py
|
|
|
119
122
|
tests/commands/report/test_trends_json_output.py
|
|
120
123
|
tests/commands/report/test_trends_templates.py
|
|
121
124
|
tests/commands/status/test_status_with_names.py
|
|
125
|
+
tests/commands/test_logs/test_logs.py
|
|
122
126
|
tests/commands/test_results/test_result_delete.py
|
|
123
127
|
tests/commands/test_results/test_result_ls.py
|
|
124
128
|
tests/commands/test_results/test_result_patch.py
|
|
@@ -14,7 +14,7 @@ class TestUpload:
|
|
|
14
14
|
@pytest.mark.datafiles('tests/neoload_projects/example_1.zip')
|
|
15
15
|
@pytest.mark.usefixtures("neoload_login") # it's like @Before on the neoload_login function
|
|
16
16
|
def test_upload(self, monkeypatch, datafiles, valid_data):
|
|
17
|
-
zip_path = datafiles.
|
|
17
|
+
zip_path = datafiles / 'example_1.zip'
|
|
18
18
|
runner = CliRunner()
|
|
19
19
|
mock_api_post_binary(monkeypatch, 'v2/tests/%s/project' % valid_data.test_settings_id, 200,
|
|
20
20
|
'{"projectId":"5e5fc0102cc4f82e5d9e18d4", "projectName":"NeoLoad-CLI-example-2_0",'
|
|
@@ -62,7 +62,7 @@ class TestUpload:
|
|
|
62
62
|
|
|
63
63
|
@pytest.mark.datafiles('tests/neoload_projects/example_1.zip')
|
|
64
64
|
def test_upload_with_save(self, monkeypatch, datafiles):
|
|
65
|
-
source_path = datafiles.
|
|
65
|
+
source_path = datafiles / 'example_1.zip'
|
|
66
66
|
|
|
67
67
|
file = tempfile.NamedTemporaryFile(delete=False, suffix='.zip')
|
|
68
68
|
basename = file.name
|