neoload 1.3.19.dev1__tar.gz → 1.3.19.dev3__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.19.dev1 → neoload-1.3.19.dev3}/PKG-INFO +67 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/README.md +63 -0
- neoload-1.3.19.dev3/neoload/commands/__init__.py +2 -0
- neoload-1.3.19.dev3/neoload/commands/checkvu.py +120 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/project.py +47 -3
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/report.py +3 -16
- neoload-1.3.19.dev3/neoload/commands/validate.py +19 -0
- neoload-1.3.19.dev3/neoload/neoload_cli_lib/checkvu_runner.py +363 -0
- neoload-1.3.19.dev3/neoload/neoload_cli_lib/jar_signature.py +146 -0
- neoload-1.3.19.dev3/neoload/neoload_cli_lib/resources.py +28 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/schema_validation.py +93 -12
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/user_data.py +48 -18
- neoload-1.3.19.dev3/neoload/resources/certs/__init__.py +1 -0
- neoload-1.3.19.dev3/neoload/resources/certs/globalsign-code-signing-root-r45.jks +0 -0
- neoload-1.3.19.dev3/neoload/resources/templates/default.yaml +140 -0
- neoload-1.3.19.dev3/neoload/version.py +1 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/PKG-INFO +67 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/SOURCES.txt +11 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/requires.txt +3 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/setup.py +4 -1
- neoload-1.3.19.dev3/tests/commands/project/test_project_create.py +52 -0
- neoload-1.3.19.dev3/tests/commands/test_checkvu.py +448 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_validate.py +34 -7
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/conftest.py +2 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/expected/junit-sla.xml +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/expected/run.log +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/expected/summary.txt +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/project.upload.test.sh +3 -3
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/run.fastfail.test.sh +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/run.test.sh +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/wait.test.sh +1 -1
- neoload-1.3.19.dev3/tests/neoload_cli_lib/test_SchemaValidation.py +149 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_include_resolution.py +8 -1
- neoload-1.3.19.dev3/tests/neoload_cli_lib/test_jar_signature.py +193 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/broken_yaml.yaml +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/circular_includes/a.yaml +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/circular_includes/b.yaml +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/default.yaml +1 -1
- neoload-1.3.19.dev3/tests/neoload_projects/example_1.zip +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/invalid_to_schema.yaml +1 -1
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/simpledemo.yml +1 -1
- neoload-1.3.19.dev3/tests/resources/jinja/__init__.py +0 -0
- neoload-1.3.19.dev1/neoload/commands/__init__.py +0 -2
- neoload-1.3.19.dev1/neoload/commands/validate.py +0 -29
- neoload-1.3.19.dev1/neoload/version.py +0 -1
- neoload-1.3.19.dev1/tests/neoload_cli_lib/test_SchemaValidation.py +0 -43
- neoload-1.3.19.dev1/tests/neoload_projects/example_1.zip +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.github/workflows/python-integration-tests.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.github/workflows/python-package.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.github/workflows/python-post-release-changelog-pr.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.github/workflows/python-release.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.gitignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/.travis.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/CHANGELOG.md +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/LICENSE +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/MANIFEST.in +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/docker/Dockerfile +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/aws/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/aws/buildspec.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_CLI.jpg +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/README.md +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/neoload-cli-docker.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/neoload-cli-dyninfra.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/Bamboo_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/README.md +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/bamboo-v1.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/bamboo-v2.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/github/neoload-github-actions-demo.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/gitlab/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/gitlab/openshift.gitlab-ci.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/jenkins/Jenkinsfile_dyninfra +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/examples/pipelines/jenkins/Jenkinsfile_slafails +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/__main__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/config.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/docker.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/fastfail.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/login.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/logout.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/logs.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/logs_url.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/run.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/status.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/stop.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/test_results.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/test_settings.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/wait.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/workspaces.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/commands/zones.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/bad_as_code_exception.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/cli_exception.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/config_global.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/displayer.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/docker_lib.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/filtering.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/hooks.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/logs_tools.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/logs_traduction_map.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/name_resolver.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/neoLoad_project.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/paths.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/rest_crud.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/running_tools.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/tools.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/builtin_console_summary.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/builtin_transactions_csv.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/common.js +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/external_data.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/general_details.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/header.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/hits_per_second.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/running_vus.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/styles.css +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/transactions.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/workload_characteristics.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/custom_transactions_export.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/sample-custom-report.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/sample-trends-report.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/general_details.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/transaction_trends.html.j2 +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/trends.js +0 -0
- {neoload-1.3.19.dev1/tests → neoload-1.3.19.dev3/neoload/resources/templates}/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload/version_manager.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/dependency_links.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/entry_points.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/neoload.egg-info/top_level.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/notes/PSB_20200421_TODO.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/notes/acceptance.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/pull_request_template.md +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/pytest.ini +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/requirements.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/resources/as-code.latest.schema.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/setup.cfg +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/sonar-project.properties +0 -0
- {neoload-1.3.19.dev1/tests/resources → neoload-1.3.19.dev3/tests}/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_cleanups.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_connections.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_hooks.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/fastfail/test_fastfail_slas.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/project/test_upload.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/project/test_upload_with_password.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/conftest.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_report.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_report_json_output.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_report_templates.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_report_transactions.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_report_trends.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_trends_json_output.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/report/test_trends_templates.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/status/test_status_with_names.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_config.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_login.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_logout.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_logs/test_logs.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_logs_url.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_delete.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_ls.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_patch.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_put.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_run.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_create.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_createorpatch.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_delete.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_ls.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_patch.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_put.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/wait/test_wait.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/workspaces/test_workspace_ls.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/workspaces/test_workspace_use.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/commands/zones/test_zones.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/helpers/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/helpers/test_utils.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/expected/fastfail.log +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/runAllScripts.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/cleanup.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/results.delete.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/results.patch.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/results.put.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/run.oneliner.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.create.delete.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.patch.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.put.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/validate.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/integration/scripts/zones.ls.test.sh +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_displayer.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_docker.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_etag_caching.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_filtering.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_rest_crud.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_running_tools.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_tools.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_user_data.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_validator_selection.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/empty.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/.gitlab-ci.yml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/.nlignore +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/data/cities.csv +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/paths/geosearch_get.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/slas/prod.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/slas/uat.yaml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/neoload_projects/example_2.zip +0 -0
- {neoload-1.3.19.dev1/tests/resources/jinja → neoload-1.3.19.dev3/tests/resources}/__init__.py +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/expected_neoload_junit_slas.xml +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/expected_summary_text_no_sla.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/expected_summary_text_with_sla.txt +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_report.html +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_report_filtered.html +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_transactions.csv +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_report.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_report_filtered.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_transactions.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_transactions_csv.csv +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_trends.html +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/expected_trends.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/raw_expected_custom_report.html +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/resources/report/raw_expected_report.json +0 -0
- {neoload-1.3.19.dev1 → neoload-1.3.19.dev3}/tests/test_readme.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: neoload
|
|
3
|
-
Version: 1.3.19.
|
|
3
|
+
Version: 1.3.19.dev3
|
|
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
|
|
@@ -13,6 +13,7 @@ Requires-Dist: pyconfig
|
|
|
13
13
|
Requires-Dist: appdirs
|
|
14
14
|
Requires-Dist: requests>=2.25.1
|
|
15
15
|
Requires-Dist: jsonschema
|
|
16
|
+
Requires-Dist: regex
|
|
16
17
|
Requires-Dist: PyYAML>=5
|
|
17
18
|
Requires-Dist: junit_xml
|
|
18
19
|
Requires-Dist: termcolor
|
|
@@ -28,6 +29,8 @@ Requires-Dist: pyparsing
|
|
|
28
29
|
Requires-Dist: simplejson
|
|
29
30
|
Requires-Dist: colorama
|
|
30
31
|
Requires-Dist: importlib-resources
|
|
32
|
+
Requires-Dist: cryptography>=40
|
|
33
|
+
Requires-Dist: asn1crypto>=1.5
|
|
31
34
|
Dynamic: author
|
|
32
35
|
Dynamic: description
|
|
33
36
|
Dynamic: description-content-type
|
|
@@ -86,6 +89,8 @@ NOTE: On the Windows command line, replace the `\` line-continuation characters
|
|
|
86
89
|
- [Exporting Transaction CSV data](#exporting-transaction-csv-data)
|
|
87
90
|
- [View zones](#view-zones)
|
|
88
91
|
- [Create local Docker infrastructure to run a test](#create-local-docker-infrastructure-to-run-a-test)
|
|
92
|
+
- [Examples](#examples)
|
|
93
|
+
- [As-Code Demo Project](#as-code-demo-project)
|
|
89
94
|
- [Continuous Testing Examples](#continuous-testing-examples)
|
|
90
95
|
- [Support for fast-fail based on SLAs](#support-for-fast-fail-based-on-slas)
|
|
91
96
|
- [Packaging the CLI with Build Agents](#packaging-the-cli-with-build-agents)
|
|
@@ -213,6 +218,26 @@ Pressing `Ctrl+C` causes the CLI to attempt to stop the test gracefully.
|
|
|
213
218
|
neoload stop # Sends the stop signal to the test and waits until it ends.
|
|
214
219
|
```
|
|
215
220
|
|
|
221
|
+
## CheckVU an as-code project
|
|
222
|
+
This command runs a CheckVU on an as-code project: it executes a single virtual user to verify that the project runs. It is meant to support fast iteration on as-code projects (generate -> checkvu -> fix).
|
|
223
|
+
|
|
224
|
+
It delegates to a standalone headless CheckVU JAR and streams the JAR's output and exit code directly.
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
Usage: neoload checkvu [OPTIONS] PROJECT_FILE
|
|
228
|
+
Help: neoload checkvu --help
|
|
229
|
+
neoload checkvu default.yaml
|
|
230
|
+
neoload checkvu -u myUser default.yaml
|
|
231
|
+
```
|
|
232
|
+
- `PROJECT_FILE` is a path to an as-code yaml file. The CLI validates it against the as-code schema first (same as `neoload validate`), using `-s, --as-code-schema` to override the default schema.
|
|
233
|
+
- `--play-think-time` plays think times defined on pages and delays marked as think time. Disabled by default (same as the CheckVU advanced setting).
|
|
234
|
+
- `-e, --engine-jar, --jar <path-or-url>` skips the JAR resolution below and runs a local patched file (hotfix) or an explicit download URL. If omitted: reuse the single cached JAR if one exists (no network call); otherwise detect the OS, call `redirect.php` (`version=latest`), follow the 302 to `files.tricentis.com`, and cache the JAR under the filename from the final `Content-Disposition` (e.g. `neoload-checkvu-cli-2026.3.0-linux.jar`). Clear the cache directory to force a fresh download after a new CheckVU release.
|
|
235
|
+
- `-j, --java` selects the java executable; by default `JAVA_HOME/bin/java` then `java` on the PATH. Java 21+ is required and verified before running. The JAR is launched with `-XX:TieredStopAtLevel=1 -Xms256m -Xmx512m -XX:+UseSerialGC` to keep startup short, and `JAVA_TOOL_OPTIONS` is emptied for that process so these options always apply and do not reach the Load Generator it spawns. Prefer a JDK over JRE so that the CLI can check the JAR's integrity, or bypass checks using `--unsafe-skip-jar-verification`
|
|
236
|
+
- `-o, --output <path>` sets the directory that receives `checkvu-result.json` and the `checkvu-content/` request and response dump. When omitted, nothing is written to disk and only the console output is produced. Relative paths resolve from the current directory, not from `PROJECT_FILE`. The dump is not redacted, so treat it as confidential.
|
|
237
|
+
- `-w, --work-dir <path>` sets the directory used for engine files and logs. Defaults to a temporary directory deleted afterwards unless `--keep-temp-work-dir` is set; a directory you supply yourself is never deleted.
|
|
238
|
+
- `--app-proxy`, `--app-proxy-username` and `--app-proxy-bypass` configure the proxy used for application traffic. The proxy password is set with `CHECKVU_CLI_APP_PROXY_PASSWORD` environment variable instead so it never shows up in the process list or CI logs.
|
|
239
|
+
- `--controller-properties` and `--load-generator-properties` are advanced options to merge a `.properties` file into the JAR's embedded `controller.properties` / `agent.properties`.
|
|
240
|
+
|
|
216
241
|
## Reporting
|
|
217
242
|
|
|
218
243
|
The NeoLoad CLI provides basic support for viewing and exporting test results.
|
|
@@ -394,6 +419,47 @@ Help: neoload config --help
|
|
|
394
419
|
```
|
|
395
420
|
The configuration lets you customize the CLI's behavior. For now, it is only used by the `docker` command (see above).
|
|
396
421
|
|
|
422
|
+
## Examples
|
|
423
|
+
|
|
424
|
+
### As-Code Demo Project
|
|
425
|
+
|
|
426
|
+
Create a starter NeoLoad As-Code YAML project with:
|
|
427
|
+
|
|
428
|
+
```
|
|
429
|
+
neoload project create DemoWebShop
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
This scaffolds `DemoWebShop/default.yaml` from the bundled Demo Web Shop template —
|
|
433
|
+
no NeoLoad Web project, no manual scenario setup.
|
|
434
|
+
|
|
435
|
+
Target: [Tricentis Demo Web Shop](https://demowebshop.tricentis.com/) (nopCommerce demo).
|
|
436
|
+
|
|
437
|
+
The `BuyAsGuest` user path walks through a typical guest purchase:
|
|
438
|
+
|
|
439
|
+
1. Open the shop home page
|
|
440
|
+
2. Browse a product category
|
|
441
|
+
3. Add a product to the cart (quantity randomised per iteration via a variable)
|
|
442
|
+
4. View the cart
|
|
443
|
+
5. Check out as a guest
|
|
444
|
+
6. View product details
|
|
445
|
+
|
|
446
|
+
It uses two variables (`product_id`, `quantity`) and a single population (`GuestShoppers`)
|
|
447
|
+
|
|
448
|
+
Run CheckVU against the project:
|
|
449
|
+
```
|
|
450
|
+
neoload project create DemoWebShop
|
|
451
|
+
neoload checkvu DemoWebShop/default.yaml
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
Run the full test:
|
|
455
|
+
```
|
|
456
|
+
neoload project create DemoWebShop
|
|
457
|
+
neoload login $NLW_TOKEN \
|
|
458
|
+
test-settings --zone defaultzone --lgs 1 createorpatch DemoWebShopTest \
|
|
459
|
+
project --path DemoWebShop/default.yaml upload DemoWebShopTest \
|
|
460
|
+
run --scenario DemoWebShop
|
|
461
|
+
```
|
|
462
|
+
|
|
397
463
|
## Continuous Testing Examples
|
|
398
464
|
The main goal of the NeoLoad CLI is to standardize how load tests are executed across development, non-prod, and production environments.
|
|
399
465
|
The instructions above can be run from a contributor workstation, but they can also be easily translated to various continuous build and deployment platforms. Examples are provided for:
|
|
@@ -47,6 +47,8 @@ NOTE: On the Windows command line, replace the `\` line-continuation characters
|
|
|
47
47
|
- [Exporting Transaction CSV data](#exporting-transaction-csv-data)
|
|
48
48
|
- [View zones](#view-zones)
|
|
49
49
|
- [Create local Docker infrastructure to run a test](#create-local-docker-infrastructure-to-run-a-test)
|
|
50
|
+
- [Examples](#examples)
|
|
51
|
+
- [As-Code Demo Project](#as-code-demo-project)
|
|
50
52
|
- [Continuous Testing Examples](#continuous-testing-examples)
|
|
51
53
|
- [Support for fast-fail based on SLAs](#support-for-fast-fail-based-on-slas)
|
|
52
54
|
- [Packaging the CLI with Build Agents](#packaging-the-cli-with-build-agents)
|
|
@@ -174,6 +176,26 @@ Pressing `Ctrl+C` causes the CLI to attempt to stop the test gracefully.
|
|
|
174
176
|
neoload stop # Sends the stop signal to the test and waits until it ends.
|
|
175
177
|
```
|
|
176
178
|
|
|
179
|
+
## CheckVU an as-code project
|
|
180
|
+
This command runs a CheckVU on an as-code project: it executes a single virtual user to verify that the project runs. It is meant to support fast iteration on as-code projects (generate -> checkvu -> fix).
|
|
181
|
+
|
|
182
|
+
It delegates to a standalone headless CheckVU JAR and streams the JAR's output and exit code directly.
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
Usage: neoload checkvu [OPTIONS] PROJECT_FILE
|
|
186
|
+
Help: neoload checkvu --help
|
|
187
|
+
neoload checkvu default.yaml
|
|
188
|
+
neoload checkvu -u myUser default.yaml
|
|
189
|
+
```
|
|
190
|
+
- `PROJECT_FILE` is a path to an as-code yaml file. The CLI validates it against the as-code schema first (same as `neoload validate`), using `-s, --as-code-schema` to override the default schema.
|
|
191
|
+
- `--play-think-time` plays think times defined on pages and delays marked as think time. Disabled by default (same as the CheckVU advanced setting).
|
|
192
|
+
- `-e, --engine-jar, --jar <path-or-url>` skips the JAR resolution below and runs a local patched file (hotfix) or an explicit download URL. If omitted: reuse the single cached JAR if one exists (no network call); otherwise detect the OS, call `redirect.php` (`version=latest`), follow the 302 to `files.tricentis.com`, and cache the JAR under the filename from the final `Content-Disposition` (e.g. `neoload-checkvu-cli-2026.3.0-linux.jar`). Clear the cache directory to force a fresh download after a new CheckVU release.
|
|
193
|
+
- `-j, --java` selects the java executable; by default `JAVA_HOME/bin/java` then `java` on the PATH. Java 21+ is required and verified before running. The JAR is launched with `-XX:TieredStopAtLevel=1 -Xms256m -Xmx512m -XX:+UseSerialGC` to keep startup short, and `JAVA_TOOL_OPTIONS` is emptied for that process so these options always apply and do not reach the Load Generator it spawns. Prefer a JDK over JRE so that the CLI can check the JAR's integrity, or bypass checks using `--unsafe-skip-jar-verification`
|
|
194
|
+
- `-o, --output <path>` sets the directory that receives `checkvu-result.json` and the `checkvu-content/` request and response dump. When omitted, nothing is written to disk and only the console output is produced. Relative paths resolve from the current directory, not from `PROJECT_FILE`. The dump is not redacted, so treat it as confidential.
|
|
195
|
+
- `-w, --work-dir <path>` sets the directory used for engine files and logs. Defaults to a temporary directory deleted afterwards unless `--keep-temp-work-dir` is set; a directory you supply yourself is never deleted.
|
|
196
|
+
- `--app-proxy`, `--app-proxy-username` and `--app-proxy-bypass` configure the proxy used for application traffic. The proxy password is set with `CHECKVU_CLI_APP_PROXY_PASSWORD` environment variable instead so it never shows up in the process list or CI logs.
|
|
197
|
+
- `--controller-properties` and `--load-generator-properties` are advanced options to merge a `.properties` file into the JAR's embedded `controller.properties` / `agent.properties`.
|
|
198
|
+
|
|
177
199
|
## Reporting
|
|
178
200
|
|
|
179
201
|
The NeoLoad CLI provides basic support for viewing and exporting test results.
|
|
@@ -355,6 +377,47 @@ Help: neoload config --help
|
|
|
355
377
|
```
|
|
356
378
|
The configuration lets you customize the CLI's behavior. For now, it is only used by the `docker` command (see above).
|
|
357
379
|
|
|
380
|
+
## Examples
|
|
381
|
+
|
|
382
|
+
### As-Code Demo Project
|
|
383
|
+
|
|
384
|
+
Create a starter NeoLoad As-Code YAML project with:
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
neoload project create DemoWebShop
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
This scaffolds `DemoWebShop/default.yaml` from the bundled Demo Web Shop template —
|
|
391
|
+
no NeoLoad Web project, no manual scenario setup.
|
|
392
|
+
|
|
393
|
+
Target: [Tricentis Demo Web Shop](https://demowebshop.tricentis.com/) (nopCommerce demo).
|
|
394
|
+
|
|
395
|
+
The `BuyAsGuest` user path walks through a typical guest purchase:
|
|
396
|
+
|
|
397
|
+
1. Open the shop home page
|
|
398
|
+
2. Browse a product category
|
|
399
|
+
3. Add a product to the cart (quantity randomised per iteration via a variable)
|
|
400
|
+
4. View the cart
|
|
401
|
+
5. Check out as a guest
|
|
402
|
+
6. View product details
|
|
403
|
+
|
|
404
|
+
It uses two variables (`product_id`, `quantity`) and a single population (`GuestShoppers`)
|
|
405
|
+
|
|
406
|
+
Run CheckVU against the project:
|
|
407
|
+
```
|
|
408
|
+
neoload project create DemoWebShop
|
|
409
|
+
neoload checkvu DemoWebShop/default.yaml
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
Run the full test:
|
|
413
|
+
```
|
|
414
|
+
neoload project create DemoWebShop
|
|
415
|
+
neoload login $NLW_TOKEN \
|
|
416
|
+
test-settings --zone defaultzone --lgs 1 createorpatch DemoWebShopTest \
|
|
417
|
+
project --path DemoWebShop/default.yaml upload DemoWebShopTest \
|
|
418
|
+
run --scenario DemoWebShop
|
|
419
|
+
```
|
|
420
|
+
|
|
358
421
|
## Continuous Testing Examples
|
|
359
422
|
The main goal of the NeoLoad CLI is to standardize how load tests are executed across development, non-prod, and production environments.
|
|
360
423
|
The instructions above can be run from a contributor workstation, but they can also be easily translated to various continuous build and deployment platforms. Examples are provided for:
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
import click
|
|
5
|
+
|
|
6
|
+
from neoload_cli_lib import checkvu_runner, cli_exception
|
|
7
|
+
import neoload_cli_lib.schema_validation as schema_validation
|
|
8
|
+
|
|
9
|
+
__yaml_extensions = (".yaml", ".yml")
|
|
10
|
+
|
|
11
|
+
@click.command()
|
|
12
|
+
@click.option('-e', '--engine-jar', '--jar',
|
|
13
|
+
help="Skip the latest-JAR download and run this CheckVU engine: a local patched file "
|
|
14
|
+
"(hotfix / air-gapped) or a download URL. If omitted, the latest JAR for this OS "
|
|
15
|
+
"is downloaded and cached.",
|
|
16
|
+
metavar="PATH|URL")
|
|
17
|
+
@click.option('-j', '--java', help="Path to the java executable to use. "
|
|
18
|
+
"Defaults to JAVA_HOME/bin/java, then java on the PATH.", metavar="PATH")
|
|
19
|
+
@click.option('-u', '--user-path', help="Run only the specified user path. If omitted, all user paths in the file "
|
|
20
|
+
"are executed sequentially. An unknown name fails and lists the user paths "
|
|
21
|
+
"found in the file.", metavar="NAME")
|
|
22
|
+
@click.option('--play-think-time', is_flag=True, default=False,
|
|
23
|
+
help="Play think times defined on pages and delays marked as think time. "
|
|
24
|
+
"Disabled by default. Equivalent to setting CHECKVU_CLI_PLAY_THINK_TIME=1.")
|
|
25
|
+
@click.option('-s', '--as-code-schema', default=None,
|
|
26
|
+
help="NeoLoad as-code schema (URL or local path) to validate PROJECT_FILE against. "
|
|
27
|
+
"When omitted, download schemas/v<schemaVersion>/as-code.schema.json from neoload-models (v3). "
|
|
28
|
+
"If schemaVersion is absent, use schemas/v3.0/as-code.schema.json.",
|
|
29
|
+
metavar="PATH|URL")
|
|
30
|
+
@click.option('--ssl-cert', default="",
|
|
31
|
+
help="Path to SSL certificate or write False to disable certificate checking. "
|
|
32
|
+
"Used both for schema validation and the JAR download.")
|
|
33
|
+
@click.option('--unsafe-skip-jar-verification', is_flag=True, default=False,
|
|
34
|
+
help="Unsafe. Run the CheckVU JAR without checking that it is signed by Tricentis. "
|
|
35
|
+
"Intended for development, and for runtimes that ship no jarsigner "
|
|
36
|
+
"(jarsigner is in the JDK, not the JRE, and the check requires it) "
|
|
37
|
+
"when running a local JAR that has already been verified.")
|
|
38
|
+
@click.option('--controller-properties',
|
|
39
|
+
help="Advanced. Path to controller.properties file merged additively into the Controller "
|
|
40
|
+
"configuration; only the keys you set are overridden, other embedded values are kept.",
|
|
41
|
+
metavar="PATH")
|
|
42
|
+
@click.option('--load-generator-properties',
|
|
43
|
+
help="Advanced. Path to agent.properties file merged additively into the Load Generator "
|
|
44
|
+
"configuration; only the keys you set are overridden.",
|
|
45
|
+
metavar="PATH")
|
|
46
|
+
@click.option('--app-proxy',
|
|
47
|
+
help="Proxy used to reach the tested applications, as host:port (e.g. myproxy.corp:8080). "
|
|
48
|
+
"Applies to both HTTP and HTTPS application traffic (User Path validation / Load Generator "
|
|
49
|
+
"traffic). Not used for NeoLoad Web API calls. CheckVU CLI download proxy uses the standard "
|
|
50
|
+
"HTTPS_PROXY, HTTP_PROXY and NO_PROXY variables instead.",
|
|
51
|
+
metavar="HOST:PORT")
|
|
52
|
+
@click.option('--app-proxy-username',
|
|
53
|
+
help="Username for --app-proxy authentication (optional). The password is read from environment "
|
|
54
|
+
"variable CHECKVU_CLI_APP_PROXY_PASSWORD; there is no flag for it, so it is never "
|
|
55
|
+
"exposed in the process list or CI logs.",
|
|
56
|
+
metavar="USERNAME")
|
|
57
|
+
@click.option('--app-proxy-bypass',
|
|
58
|
+
help="Comma-separated hosts that bypass --app-proxy (e.g. localhost,internal.corp).",
|
|
59
|
+
metavar="HOSTS")
|
|
60
|
+
@click.option('-o', '--output',
|
|
61
|
+
help="Directory that receives checkvu-result.json and the checkvu-content/ request and response "
|
|
62
|
+
"dump. When omitted, nothing is written to disk and the console output is unchanged. "
|
|
63
|
+
"Relative paths resolve from the current directory, not from PROJECT_FILE. The dump is not "
|
|
64
|
+
"redacted: treat it as confidential.",
|
|
65
|
+
metavar="PATH")
|
|
66
|
+
@click.option('-w', '--work-dir',
|
|
67
|
+
help="Directory for engine scratch files and logs. Defaults to a temporary directory. "
|
|
68
|
+
"A directory you supply is never deleted.",
|
|
69
|
+
metavar="PATH")
|
|
70
|
+
@click.option('--keep-temp-work-dir', is_flag=True, default=False,
|
|
71
|
+
help="Keep the temporary work directory after the run instead of deleting it. "
|
|
72
|
+
"Equivalent to setting CHECKVU_CLI_KEEP_TEMP_WORK_DIR=1. "
|
|
73
|
+
"Has no effect when --work-dir is already set, since that directory is never auto-deleted.")
|
|
74
|
+
@click.argument('project_file')
|
|
75
|
+
def cli(engine_jar, java, user_path, play_think_time, as_code_schema, ssl_cert, unsafe_skip_jar_verification,
|
|
76
|
+
controller_properties, load_generator_properties,
|
|
77
|
+
app_proxy, app_proxy_username, app_proxy_bypass, output, work_dir, keep_temp_work_dir,
|
|
78
|
+
project_file):
|
|
79
|
+
""" Validate the User Paths of a NeoLoad as-code Project locally.
|
|
80
|
+
|
|
81
|
+
Runs each User Path once against the application and reports whether
|
|
82
|
+
it completes without blocking errors. This is not a load test: no
|
|
83
|
+
Population, no Scenario, no Result. Exits 0 when every User Path passes, 1
|
|
84
|
+
otherwise. Use --output to also write checkvu-result.json and the full
|
|
85
|
+
request and response dump to a directory.
|
|
86
|
+
|
|
87
|
+
PROJECT_FILE is the as-code Project YAML file. Its parent directory is the
|
|
88
|
+
Project root; colocated assets such as CSV files must live under that
|
|
89
|
+
root.
|
|
90
|
+
|
|
91
|
+
A java executable is required to run the checkVU. Prefer a JDK over JRE so
|
|
92
|
+
that the CLI can check the JAR's integrity
|
|
93
|
+
"""
|
|
94
|
+
if not project_file.lower().endswith(__yaml_extensions):
|
|
95
|
+
raise cli_exception.CliException("Project file must be a yaml (\".yaml\", \".yml\") file: " + project_file)
|
|
96
|
+
if not os.path.isfile(project_file):
|
|
97
|
+
raise cli_exception.CliException("Project file not found: " + project_file)
|
|
98
|
+
print(schema_validation.validate_path(project_file, as_code_schema, ssl_cert), flush=True)
|
|
99
|
+
|
|
100
|
+
java_executable = checkvu_runner.resolve_java(java)
|
|
101
|
+
checkvu_runner.check_java_version(java_executable)
|
|
102
|
+
|
|
103
|
+
resolved_jar = checkvu_runner.resolve_jar(engine_jar, ssl_cert, java_executable,
|
|
104
|
+
verify_signature=not unsafe_skip_jar_verification)
|
|
105
|
+
|
|
106
|
+
command = checkvu_runner.build_command(
|
|
107
|
+
java_executable, resolved_jar, project_file,
|
|
108
|
+
user_path=user_path,
|
|
109
|
+
play_think_time=play_think_time,
|
|
110
|
+
controller_properties=controller_properties,
|
|
111
|
+
load_generator_properties=load_generator_properties,
|
|
112
|
+
app_proxy=app_proxy,
|
|
113
|
+
app_proxy_username=app_proxy_username,
|
|
114
|
+
app_proxy_bypass=app_proxy_bypass,
|
|
115
|
+
output=output,
|
|
116
|
+
work_dir=work_dir,
|
|
117
|
+
keep_temp_work_dir=keep_temp_work_dir,
|
|
118
|
+
)
|
|
119
|
+
exit_code = checkvu_runner.run_checkvu(command)
|
|
120
|
+
sys.exit(exit_code)
|
|
@@ -4,18 +4,30 @@ import click
|
|
|
4
4
|
import urllib.parse as urlparse
|
|
5
5
|
from commands import test_settings
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from neoload_cli_lib import user_data, tools, rest_crud, neoLoad_project
|
|
7
|
+
from neoload_cli_lib import user_data, tools, rest_crud, neoLoad_project, cli_exception, resources
|
|
8
|
+
|
|
9
|
+
__template_namespace = 'resources.templates'
|
|
10
|
+
__template_filename = 'default.yaml'
|
|
11
|
+
__project_yaml_name = 'default.yaml'
|
|
8
12
|
|
|
9
13
|
|
|
10
14
|
@click.command()
|
|
11
|
-
@click.argument("command", required=True, type=click.Choice(['up', 'upload', 'meta']))
|
|
15
|
+
@click.argument("command", required=True, type=click.Choice(['create', 'up', 'upload', 'meta']))
|
|
12
16
|
@click.option("--path", "-p", type=click.Path(exists=True), default=os.getcwd(),
|
|
13
17
|
help="Path of project folder, zip or yml file. . is default value")
|
|
14
18
|
@click.option("--save", "-s", type=click.Path(exists=False),
|
|
15
19
|
help="Path to a (non-existent) file ending in .zip to preserve what was uploaded")
|
|
16
20
|
@click.argument("name_or_id", type=str, required=False)
|
|
17
21
|
def cli(command, name_or_id, path, save):
|
|
18
|
-
"""
|
|
22
|
+
"""
|
|
23
|
+
create # Create a local as-code project folder from the demo yaml template.
|
|
24
|
+
upload # Upload a project to NeoLoad Web test settings (alias: up) .
|
|
25
|
+
meta # Display project metadata from the current test settings .
|
|
26
|
+
"""
|
|
27
|
+
if command == "create":
|
|
28
|
+
create_local_project(name_or_id)
|
|
29
|
+
return
|
|
30
|
+
|
|
19
31
|
rest_crud.set_current_command()
|
|
20
32
|
if not name_or_id or name_or_id == "cur":
|
|
21
33
|
name_or_id = user_data.get_meta(test_settings.meta_key)
|
|
@@ -75,3 +87,35 @@ def meta_data(setting_id):
|
|
|
75
87
|
|
|
76
88
|
def get_endpoint(settings_id: str):
|
|
77
89
|
return rest_crud.base_endpoint_with_workspace() + '/tests/' + settings_id + "/project"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def create_local_project(project_name):
|
|
93
|
+
if project_name is None:
|
|
94
|
+
raise cli_exception.CliException("Missing project name. Usage: neoload project create <project-name>")
|
|
95
|
+
project_name = project_name.strip()
|
|
96
|
+
if not project_name or project_name in ('.', '..'):
|
|
97
|
+
raise cli_exception.CliException(f"Invalid project name: '{project_name}'.")
|
|
98
|
+
if os.path.sep in project_name or (os.path.altsep and os.path.altsep in project_name):
|
|
99
|
+
raise cli_exception.CliException(
|
|
100
|
+
f"Invalid project name: '{project_name}'. Use a single folder name, not a path."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
if os.path.exists(project_name):
|
|
104
|
+
raise cli_exception.CliException(
|
|
105
|
+
f"Cannot create project '{project_name}': path already exists."
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
yaml_path = os.path.join(project_name, __project_yaml_name)
|
|
109
|
+
try:
|
|
110
|
+
template = resources.get_resource_as_string(__template_namespace, __template_filename)
|
|
111
|
+
os.mkdir(project_name)
|
|
112
|
+
with open(yaml_path, 'w', encoding='utf-8') as yaml_file:
|
|
113
|
+
yaml_file.write(template)
|
|
114
|
+
except OSError as err:
|
|
115
|
+
raise cli_exception.CliException(f"Failed to create project '{project_name}': {err}") from err
|
|
116
|
+
|
|
117
|
+
print(f"Project '{project_name}' created successfully.")
|
|
118
|
+
print(f" {yaml_path}")
|
|
119
|
+
print()
|
|
120
|
+
print("Next step: verify your project with CheckVU:")
|
|
121
|
+
print(f" neoload checkvu {yaml_path}")
|
|
@@ -8,7 +8,7 @@ import statistics
|
|
|
8
8
|
import math
|
|
9
9
|
import time
|
|
10
10
|
|
|
11
|
-
from neoload_cli_lib import tools, rest_crud, user_data, displayer, cli_exception
|
|
11
|
+
from neoload_cli_lib import tools, rest_crud, user_data, displayer, cli_exception, resources
|
|
12
12
|
from dateutil.relativedelta import relativedelta
|
|
13
13
|
|
|
14
14
|
import logging
|
|
@@ -165,19 +165,6 @@ def parse_filter_spec(filter_spec):
|
|
|
165
165
|
return ret
|
|
166
166
|
|
|
167
167
|
|
|
168
|
-
def get_resource_as_string(namespace, file):
|
|
169
|
-
try:
|
|
170
|
-
import importlib.resources as pkg_resources
|
|
171
|
-
except ImportError:
|
|
172
|
-
# Try backported to PY<37 `importlib_resources`.
|
|
173
|
-
import importlib_resources as pkg_resources
|
|
174
|
-
|
|
175
|
-
logging.debug({'namespace': namespace, 'file': file})
|
|
176
|
-
if hasattr(pkg_resources, 'files'): # files is present from Python 3.9
|
|
177
|
-
return pkg_resources.files(namespace).joinpath(file).read_text()
|
|
178
|
-
return pkg_resources.read_text(namespace, file)
|
|
179
|
-
|
|
180
|
-
|
|
181
168
|
def split_path(path):
|
|
182
169
|
sep = os.path.sep
|
|
183
170
|
if sep not in path: sep = '/' # try internal posix style
|
|
@@ -1131,11 +1118,11 @@ def unique(seq, idfun=None):
|
|
|
1131
1118
|
|
|
1132
1119
|
|
|
1133
1120
|
def get_builtin_template_transaction_csv():
|
|
1134
|
-
return get_resource_as_string('resources.jinja', 'builtin_transactions_csv.j2').strip()
|
|
1121
|
+
return resources.get_resource_as_string('resources.jinja', 'builtin_transactions_csv.j2').strip()
|
|
1135
1122
|
|
|
1136
1123
|
|
|
1137
1124
|
def get_builtin_template_console_summary():
|
|
1138
|
-
return get_resource_as_string('resources.jinja', 'builtin_console_summary.j2').strip()
|
|
1125
|
+
return resources.get_resource_as_string('resources.jinja', 'builtin_console_summary.j2').strip()
|
|
1139
1126
|
|
|
1140
1127
|
|
|
1141
1128
|
def print_extended_help():
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import click
|
|
2
|
+
import neoload_cli_lib.schema_validation as schema_validation
|
|
3
|
+
|
|
4
|
+
@click.command()
|
|
5
|
+
@click.option('-s', '--as-code-schema', default=None,
|
|
6
|
+
help="NeoLoad as-code schema (URL or local path) to validate FILE against. "
|
|
7
|
+
"When omitted, download schemas/v<schemaVersion>/as-code.schema.json from neoload-models (v3). "
|
|
8
|
+
"If schemaVersion is absent, use schemas/v3.0/as-code.schema.json.",
|
|
9
|
+
metavar="PATH|URL")
|
|
10
|
+
@click.option('--schema-url', 'schema_url', default=None, hidden=True,
|
|
11
|
+
help="Deprecated alias for --as-code-schema, kept for backward compatibility.")
|
|
12
|
+
@click.option('--refresh', is_flag=True, help="THIS OPTION IS NOW USELESS", hidden=True)
|
|
13
|
+
@click.option('--ssl-cert', default="", help="Path to SSL certificate or write False to disable certificate checking")
|
|
14
|
+
@click.argument('file')
|
|
15
|
+
def cli(file, refresh, as_code_schema, schema_url, ssl_cert):
|
|
16
|
+
"""Verify that the yaml FILE matches the neoload as-code file format"""
|
|
17
|
+
# -s/--as-code-schema (new) takes priority over --schema-url (deprecated alias)
|
|
18
|
+
resolved_schema = as_code_schema or schema_url
|
|
19
|
+
print(schema_validation.validate_path(file, resolved_schema, ssl_cert))
|