neoload 1.3.19.dev2__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.
Files changed (224) hide show
  1. {neoload-1.3.19.dev2/neoload.egg-info → neoload-1.3.19.dev3}/PKG-INFO +21 -9
  2. neoload-1.3.19.dev2/PKG-INFO → neoload-1.3.19.dev3/README.md +17 -47
  3. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/checkvu.py +34 -12
  4. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/project.py +47 -3
  5. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/report.py +3 -16
  6. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/validate.py +3 -3
  7. neoload-1.3.19.dev3/neoload/neoload_cli_lib/checkvu_runner.py +363 -0
  8. neoload-1.3.19.dev3/neoload/neoload_cli_lib/jar_signature.py +146 -0
  9. neoload-1.3.19.dev3/neoload/neoload_cli_lib/resources.py +28 -0
  10. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/schema_validation.py +76 -13
  11. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/user_data.py +48 -18
  12. neoload-1.3.19.dev3/neoload/resources/certs/__init__.py +1 -0
  13. neoload-1.3.19.dev3/neoload/resources/certs/globalsign-code-signing-root-r45.jks +0 -0
  14. {neoload-1.3.19.dev2/examples/as-code-demo → neoload-1.3.19.dev3/neoload/resources/templates}/default.yaml +3 -3
  15. neoload-1.3.19.dev3/neoload/version.py +1 -0
  16. neoload-1.3.19.dev2/README.md → neoload-1.3.19.dev3/neoload.egg-info/PKG-INFO +59 -8
  17. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload.egg-info/SOURCES.txt +8 -1
  18. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload.egg-info/requires.txt +3 -0
  19. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/setup.py +4 -1
  20. neoload-1.3.19.dev3/tests/commands/project/test_project_create.py +52 -0
  21. neoload-1.3.19.dev3/tests/commands/test_checkvu.py +448 -0
  22. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_validate.py +9 -7
  23. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/expected/junit-sla.xml +1 -1
  24. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/expected/run.log +1 -1
  25. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/expected/summary.txt +1 -1
  26. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/project.upload.test.sh +3 -3
  27. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/run.fastfail.test.sh +1 -1
  28. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/run.test.sh +1 -1
  29. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/wait.test.sh +1 -1
  30. neoload-1.3.19.dev3/tests/neoload_cli_lib/test_SchemaValidation.py +149 -0
  31. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_include_resolution.py +8 -1
  32. neoload-1.3.19.dev3/tests/neoload_cli_lib/test_jar_signature.py +193 -0
  33. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/broken_yaml.yaml +1 -1
  34. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/circular_includes/a.yaml +1 -1
  35. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/circular_includes/b.yaml +1 -1
  36. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/default.yaml +1 -1
  37. neoload-1.3.19.dev3/tests/neoload_projects/example_1.zip +0 -0
  38. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/invalid_to_schema.yaml +1 -1
  39. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/simpledemo.yml +1 -1
  40. neoload-1.3.19.dev3/tests/resources/jinja/__init__.py +0 -0
  41. neoload-1.3.19.dev2/neoload/neoload_cli_lib/checkvu_runner.py +0 -189
  42. neoload-1.3.19.dev2/neoload/version.py +0 -1
  43. neoload-1.3.19.dev2/tests/commands/test_checkvu.py +0 -207
  44. neoload-1.3.19.dev2/tests/neoload_cli_lib/test_SchemaValidation.py +0 -43
  45. neoload-1.3.19.dev2/tests/neoload_projects/example_1.zip +0 -0
  46. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.github/workflows/python-integration-tests.yml +0 -0
  47. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.github/workflows/python-package.yml +0 -0
  48. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.github/workflows/python-post-release-changelog-pr.yml +0 -0
  49. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.github/workflows/python-release.yml +0 -0
  50. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.gitignore +0 -0
  51. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/.travis.yml +0 -0
  52. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/CHANGELOG.md +0 -0
  53. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/LICENSE +0 -0
  54. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/MANIFEST.in +0 -0
  55. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/docker/Dockerfile +0 -0
  56. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/aws/.nlignore +0 -0
  57. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/aws/buildspec.yaml +0 -0
  58. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/.nlignore +0 -0
  59. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_CLI.jpg +0 -0
  60. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/Azure_DevOps_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
  61. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/README.md +0 -0
  62. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/neoload-cli-docker.yml +0 -0
  63. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/azure_devops/neoload-cli-dyninfra.yml +0 -0
  64. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/.nlignore +0 -0
  65. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/Bamboo_Pipeline_NeoLoad_SLA_jUnit.jpg +0 -0
  66. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/README.md +0 -0
  67. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/bamboo-v1.yaml +0 -0
  68. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/bamboo-specs/bamboo-v2.yaml +0 -0
  69. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/github/neoload-github-actions-demo.yml +0 -0
  70. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/gitlab/.nlignore +0 -0
  71. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/gitlab/openshift.gitlab-ci.yml +0 -0
  72. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/jenkins/Jenkinsfile_dyninfra +0 -0
  73. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/examples/pipelines/jenkins/Jenkinsfile_slafails +0 -0
  74. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/__init__.py +0 -0
  75. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/__main__.py +0 -0
  76. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/__init__.py +0 -0
  77. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/config.py +0 -0
  78. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/docker.py +0 -0
  79. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/fastfail.py +0 -0
  80. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/login.py +0 -0
  81. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/logout.py +0 -0
  82. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/logs.py +0 -0
  83. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/logs_url.py +0 -0
  84. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/run.py +0 -0
  85. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/status.py +0 -0
  86. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/stop.py +0 -0
  87. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/test_results.py +0 -0
  88. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/test_settings.py +0 -0
  89. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/wait.py +0 -0
  90. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/workspaces.py +0 -0
  91. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/commands/zones.py +0 -0
  92. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/__init__.py +0 -0
  93. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/bad_as_code_exception.py +0 -0
  94. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/cli_exception.py +0 -0
  95. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/config_global.py +0 -0
  96. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/displayer.py +0 -0
  97. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/docker_lib.py +0 -0
  98. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/filtering.py +0 -0
  99. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/hooks.py +0 -0
  100. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/logs_tools.py +0 -0
  101. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/logs_traduction_map.py +0 -0
  102. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/name_resolver.py +0 -0
  103. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/neoLoad_project.py +0 -0
  104. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/paths.py +0 -0
  105. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/rest_crud.py +0 -0
  106. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/running_tools.py +0 -0
  107. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/neoload_cli_lib/tools.py +0 -0
  108. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/__init__.py +0 -0
  109. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/__init__.py +0 -0
  110. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/builtin_console_summary.j2 +0 -0
  111. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/builtin_transactions_csv.j2 +0 -0
  112. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/common.js +0 -0
  113. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/external_data.html.j2 +0 -0
  114. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/general_details.html.j2 +0 -0
  115. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/header.j2 +0 -0
  116. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/hits_per_second.html.j2 +0 -0
  117. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/running_vus.html.j2 +0 -0
  118. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/styles.css +0 -0
  119. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/transactions.html.j2 +0 -0
  120. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/common/workload_characteristics.html.j2 +0 -0
  121. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/custom_transactions_export.j2 +0 -0
  122. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/sample-custom-report.html.j2 +0 -0
  123. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/sample-trends-report.html.j2 +0 -0
  124. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/general_details.html.j2 +0 -0
  125. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/transaction_trends.html.j2 +0 -0
  126. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/resources/jinja/trends/trends.js +0 -0
  127. {neoload-1.3.19.dev2/tests → neoload-1.3.19.dev3/neoload/resources/templates}/__init__.py +0 -0
  128. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload/version_manager.py +0 -0
  129. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload.egg-info/dependency_links.txt +0 -0
  130. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload.egg-info/entry_points.txt +0 -0
  131. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/neoload.egg-info/top_level.txt +0 -0
  132. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/notes/PSB_20200421_TODO.txt +0 -0
  133. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/notes/acceptance.txt +0 -0
  134. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/pull_request_template.md +0 -0
  135. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/pytest.ini +0 -0
  136. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/requirements.txt +0 -0
  137. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/resources/as-code.latest.schema.json +0 -0
  138. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/setup.cfg +0 -0
  139. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/sonar-project.properties +0 -0
  140. {neoload-1.3.19.dev2/tests/resources → neoload-1.3.19.dev3/tests}/__init__.py +0 -0
  141. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_cleanups.py +0 -0
  142. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_connections.py +0 -0
  143. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/docker/test_docker_hooks.py +0 -0
  144. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/fastfail/test_fastfail_slas.py +0 -0
  145. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/project/test_upload.py +0 -0
  146. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/project/test_upload_with_password.py +0 -0
  147. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/conftest.py +0 -0
  148. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_report.py +0 -0
  149. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_report_json_output.py +0 -0
  150. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_report_templates.py +0 -0
  151. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_report_transactions.py +0 -0
  152. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_report_trends.py +0 -0
  153. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_trends_json_output.py +0 -0
  154. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/report/test_trends_templates.py +0 -0
  155. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/status/test_status_with_names.py +0 -0
  156. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_config.py +0 -0
  157. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_login.py +0 -0
  158. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_logout.py +0 -0
  159. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_logs/test_logs.py +0 -0
  160. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_logs_url.py +0 -0
  161. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_delete.py +0 -0
  162. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_ls.py +0 -0
  163. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_patch.py +0 -0
  164. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_results/test_result_put.py +0 -0
  165. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_run.py +0 -0
  166. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_create.py +0 -0
  167. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_createorpatch.py +0 -0
  168. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_delete.py +0 -0
  169. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_ls.py +0 -0
  170. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_patch.py +0 -0
  171. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/test_settings/test_put.py +0 -0
  172. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/wait/test_wait.py +0 -0
  173. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/workspaces/test_workspace_ls.py +0 -0
  174. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/workspaces/test_workspace_use.py +0 -0
  175. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/commands/zones/test_zones.py +0 -0
  176. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/conftest.py +0 -0
  177. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/helpers/__init__.py +0 -0
  178. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/helpers/test_utils.py +0 -0
  179. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/expected/fastfail.log +0 -0
  180. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/runAllScripts.sh +0 -0
  181. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/cleanup.sh +0 -0
  182. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/results.delete.test.sh +0 -0
  183. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/results.patch.test.sh +0 -0
  184. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/results.put.test.sh +0 -0
  185. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/run.oneliner.test.sh +0 -0
  186. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.create.delete.test.sh +0 -0
  187. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.patch.test.sh +0 -0
  188. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/settings.put.test.sh +0 -0
  189. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/validate.test.sh +0 -0
  190. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/integration/scripts/zones.ls.test.sh +0 -0
  191. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_displayer.py +0 -0
  192. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_docker.py +0 -0
  193. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_etag_caching.py +0 -0
  194. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_filtering.py +0 -0
  195. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_rest_crud.py +0 -0
  196. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_running_tools.py +0 -0
  197. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_tools.py +0 -0
  198. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_user_data.py +0 -0
  199. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_cli_lib/test_validator_selection.py +0 -0
  200. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/.nlignore +0 -0
  201. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/empty.yaml +0 -0
  202. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/.gitlab-ci.yml +0 -0
  203. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/.nlignore +0 -0
  204. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/data/cities.csv +0 -0
  205. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/paths/geosearch_get.yaml +0 -0
  206. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/slas/prod.yaml +0 -0
  207. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_1/slas/uat.yaml +0 -0
  208. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/neoload_projects/example_2.zip +0 -0
  209. {neoload-1.3.19.dev2/tests/resources/jinja → neoload-1.3.19.dev3/tests/resources}/__init__.py +0 -0
  210. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/expected_neoload_junit_slas.xml +0 -0
  211. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/expected_summary_text_no_sla.txt +0 -0
  212. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/expected_summary_text_with_sla.txt +0 -0
  213. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_report.html +0 -0
  214. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_report_filtered.html +0 -0
  215. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_custom_transactions.csv +0 -0
  216. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_report.json +0 -0
  217. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_report_filtered.json +0 -0
  218. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_transactions.json +0 -0
  219. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_transactions_csv.csv +0 -0
  220. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_template_trends.html +0 -0
  221. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/expected_trends.json +0 -0
  222. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/raw_expected_custom_report.html +0 -0
  223. {neoload-1.3.19.dev2 → neoload-1.3.19.dev3}/tests/resources/report/raw_expected_report.json +0 -0
  224. {neoload-1.3.19.dev2 → 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.dev2
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
@@ -227,10 +230,12 @@ neoload checkvu default.yaml
227
230
  neoload checkvu -u myUser default.yaml
228
231
  ```
229
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.
230
- - `-e, --engine-jar <path-or-url>` resolves the CheckVU JAR: a local file path or a download URL. If omitted, a previously cached JAR is reused, otherwise a default URL is used to download the latest JAR.
231
- - `-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.
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.
232
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.
233
- - `--app-proxy`, `--app-proxy-username` and `--app-proxy-bypass` configure the proxy used for application traffic. The proxy password is set with `NEOLOAD_CHECK_VU_APP_PROXY_PASSWORD` environment variable instead so it never shows up in the process list or CI logs.
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.
234
239
  - `--controller-properties` and `--load-generator-properties` are advanced options to merge a `.properties` file into the JAR's embedded `controller.properties` / `agent.properties`.
235
240
 
236
241
  ## Reporting
@@ -418,9 +423,14 @@ The configuration lets you customize the CLI's behavior. For now, it is only use
418
423
 
419
424
  ### As-Code Demo Project
420
425
 
421
- [`examples/as-code-demo`](examples/as-code-demo) contains a NeoLoad As-Code YAML project that works out-of-the-box:
422
- no NeoLoad Web project, no manual scenario setup - just point NeoLoad at
423
- [`default.yaml`](examples/as-code-demo/default.yaml) and run.
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.
424
434
 
425
435
  Target: [Tricentis Demo Web Shop](https://demowebshop.tricentis.com/) (nopCommerce demo).
426
436
 
@@ -437,14 +447,16 @@ It uses two variables (`product_id`, `quantity`) and a single population (`Guest
437
447
 
438
448
  Run CheckVU against the project:
439
449
  ```
440
- neoload checkvu examples/as-code-demo/default.yaml
450
+ neoload project create DemoWebShop
451
+ neoload checkvu DemoWebShop/default.yaml
441
452
  ```
442
453
 
443
454
  Run the full test:
444
455
  ```
456
+ neoload project create DemoWebShop
445
457
  neoload login $NLW_TOKEN \
446
458
  test-settings --zone defaultzone --lgs 1 createorpatch DemoWebShopTest \
447
- project --path examples/as-code-demo/default.yaml upload DemoWebShopTest \
459
+ project --path DemoWebShop/default.yaml upload DemoWebShopTest \
448
460
  run --scenario DemoWebShop
449
461
  ```
450
462
 
@@ -1,42 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: neoload
3
- Version: 1.3.19.dev2
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
- Dynamic: author
32
- Dynamic: description
33
- Dynamic: description-content-type
34
- Dynamic: home-page
35
- Dynamic: license
36
- Dynamic: license-file
37
- Dynamic: requires-dist
38
- Dynamic: summary
39
-
40
1
  # NeoLoad CLI [![Python package](https://github.com/Neotys-Labs/neoload-cli/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/Neotys-Labs/neoload-cli/actions/workflows/python-package.yml)
41
2
 
42
3
  ## Overview
@@ -227,10 +188,12 @@ neoload checkvu default.yaml
227
188
  neoload checkvu -u myUser default.yaml
228
189
  ```
229
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.
230
- - `-e, --engine-jar <path-or-url>` resolves the CheckVU JAR: a local file path or a download URL. If omitted, a previously cached JAR is reused, otherwise a default URL is used to download the latest JAR.
231
- - `-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.
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.
232
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.
233
- - `--app-proxy`, `--app-proxy-username` and `--app-proxy-bypass` configure the proxy used for application traffic. The proxy password is set with `NEOLOAD_CHECK_VU_APP_PROXY_PASSWORD` environment variable instead so it never shows up in the process list or CI logs.
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.
234
197
  - `--controller-properties` and `--load-generator-properties` are advanced options to merge a `.properties` file into the JAR's embedded `controller.properties` / `agent.properties`.
235
198
 
236
199
  ## Reporting
@@ -418,9 +381,14 @@ The configuration lets you customize the CLI's behavior. For now, it is only use
418
381
 
419
382
  ### As-Code Demo Project
420
383
 
421
- [`examples/as-code-demo`](examples/as-code-demo) contains a NeoLoad As-Code YAML project that works out-of-the-box:
422
- no NeoLoad Web project, no manual scenario setup - just point NeoLoad at
423
- [`default.yaml`](examples/as-code-demo/default.yaml) and run.
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.
424
392
 
425
393
  Target: [Tricentis Demo Web Shop](https://demowebshop.tricentis.com/) (nopCommerce demo).
426
394
 
@@ -437,14 +405,16 @@ It uses two variables (`product_id`, `quantity`) and a single population (`Guest
437
405
 
438
406
  Run CheckVU against the project:
439
407
  ```
440
- neoload checkvu examples/as-code-demo/default.yaml
408
+ neoload project create DemoWebShop
409
+ neoload checkvu DemoWebShop/default.yaml
441
410
  ```
442
411
 
443
412
  Run the full test:
444
413
  ```
414
+ neoload project create DemoWebShop
445
415
  neoload login $NLW_TOKEN \
446
416
  test-settings --zone defaultzone --lgs 1 createorpatch DemoWebShopTest \
447
- project --path examples/as-code-demo/default.yaml upload DemoWebShopTest \
417
+ project --path DemoWebShop/default.yaml upload DemoWebShopTest \
448
418
  run --scenario DemoWebShop
449
419
  ```
450
420
 
@@ -5,27 +5,36 @@ import click
5
5
 
6
6
  from neoload_cli_lib import checkvu_runner, cli_exception
7
7
  import neoload_cli_lib.schema_validation as schema_validation
8
- from neoload_cli_lib.schema_validation import __default_schema_url
9
8
 
10
9
  __yaml_extensions = (".yaml", ".yml")
11
10
 
12
11
  @click.command()
13
- @click.option('-e', '--engine-jar',
14
- help="CheckVU engine JAR to run: a local file, for air-gapped or pinned setups, or a download URL. "
15
- "Defaults to the cached JAR, otherwise the release URL for this version.",
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
16
  metavar="PATH|URL")
17
17
  @click.option('-j', '--java', help="Path to the java executable to use. "
18
18
  "Defaults to JAVA_HOME/bin/java, then java on the PATH.", metavar="PATH")
19
19
  @click.option('-u', '--user-path', help="Run only the specified user path. If omitted, all user paths in the file "
20
20
  "are executed sequentially. An unknown name fails and lists the user paths "
21
21
  "found in the file.", metavar="NAME")
22
- @click.option('-s', '--as-code-schema', default=__default_schema_url, show_default=True,
23
- help="NeoLoad as-code schema (URL or local path) to validate PROJECT_FILE "
24
- "against. Defaults to the schema published for this release on Github.",
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.",
25
29
  metavar="PATH|URL")
26
30
  @click.option('--ssl-cert', default="",
27
31
  help="Path to SSL certificate or write False to disable certificate checking. "
28
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.")
29
38
  @click.option('--controller-properties',
30
39
  help="Advanced. Path to controller.properties file merged additively into the Controller "
31
40
  "configuration; only the keys you set are overridden, other embedded values are kept.",
@@ -42,12 +51,18 @@ __yaml_extensions = (".yaml", ".yml")
42
51
  metavar="HOST:PORT")
43
52
  @click.option('--app-proxy-username',
44
53
  help="Username for --app-proxy authentication (optional). The password is read from environment "
45
- "variable NEOLOAD_CHECK_VU_APP_PROXY_PASSWORD; there is no flag for it, so it is never "
54
+ "variable CHECKVU_CLI_APP_PROXY_PASSWORD; there is no flag for it, so it is never "
46
55
  "exposed in the process list or CI logs.",
47
56
  metavar="USERNAME")
48
57
  @click.option('--app-proxy-bypass',
49
58
  help="Comma-separated hosts that bypass --app-proxy (e.g. localhost,internal.corp).",
50
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")
51
66
  @click.option('-w', '--work-dir',
52
67
  help="Directory for engine scratch files and logs. Defaults to a temporary directory. "
53
68
  "A directory you supply is never deleted.",
@@ -57,20 +72,24 @@ __yaml_extensions = (".yaml", ".yml")
57
72
  "Equivalent to setting CHECKVU_CLI_KEEP_TEMP_WORK_DIR=1. "
58
73
  "Has no effect when --work-dir is already set, since that directory is never auto-deleted.")
59
74
  @click.argument('project_file')
60
- def cli(engine_jar, java, user_path, as_code_schema, ssl_cert,
75
+ def cli(engine_jar, java, user_path, play_think_time, as_code_schema, ssl_cert, unsafe_skip_jar_verification,
61
76
  controller_properties, load_generator_properties,
62
- app_proxy, app_proxy_username, app_proxy_bypass, work_dir, keep_temp_work_dir,
77
+ app_proxy, app_proxy_username, app_proxy_bypass, output, work_dir, keep_temp_work_dir,
63
78
  project_file):
64
79
  """ Validate the User Paths of a NeoLoad as-code Project locally.
65
80
 
66
81
  Runs each User Path once against the application and reports whether
67
82
  it completes without blocking errors. This is not a load test: no
68
83
  Population, no Scenario, no Result. Exits 0 when every User Path passes, 1
69
- otherwise, and always writes a JSON output.
84
+ otherwise. Use --output to also write checkvu-result.json and the full
85
+ request and response dump to a directory.
70
86
 
71
87
  PROJECT_FILE is the as-code Project YAML file. Its parent directory is the
72
88
  Project root; colocated assets such as CSV files must live under that
73
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
74
93
  """
75
94
  if not project_file.lower().endswith(__yaml_extensions):
76
95
  raise cli_exception.CliException("Project file must be a yaml (\".yaml\", \".yml\") file: " + project_file)
@@ -81,16 +100,19 @@ def cli(engine_jar, java, user_path, as_code_schema, ssl_cert,
81
100
  java_executable = checkvu_runner.resolve_java(java)
82
101
  checkvu_runner.check_java_version(java_executable)
83
102
 
84
- resolved_jar = checkvu_runner.resolve_jar(engine_jar, ssl_cert)
103
+ resolved_jar = checkvu_runner.resolve_jar(engine_jar, ssl_cert, java_executable,
104
+ verify_signature=not unsafe_skip_jar_verification)
85
105
 
86
106
  command = checkvu_runner.build_command(
87
107
  java_executable, resolved_jar, project_file,
88
108
  user_path=user_path,
109
+ play_think_time=play_think_time,
89
110
  controller_properties=controller_properties,
90
111
  load_generator_properties=load_generator_properties,
91
112
  app_proxy=app_proxy,
92
113
  app_proxy_username=app_proxy_username,
93
114
  app_proxy_bypass=app_proxy_bypass,
115
+ output=output,
94
116
  work_dir=work_dir,
95
117
  keep_temp_work_dir=keep_temp_work_dir,
96
118
  )
@@ -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
- """Upload and list scenario from settings"""
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():
@@ -1,11 +1,11 @@
1
1
  import click
2
2
  import neoload_cli_lib.schema_validation as schema_validation
3
- from neoload_cli_lib.schema_validation import __default_schema_url
4
3
 
5
4
  @click.command()
6
5
  @click.option('-s', '--as-code-schema', default=None,
7
6
  help="NeoLoad as-code schema (URL or local path) to validate FILE against. "
8
- "Defaults to the schema published for this release on Github.",
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
9
  metavar="PATH|URL")
10
10
  @click.option('--schema-url', 'schema_url', default=None, hidden=True,
11
11
  help="Deprecated alias for --as-code-schema, kept for backward compatibility.")
@@ -15,5 +15,5 @@ from neoload_cli_lib.schema_validation import __default_schema_url
15
15
  def cli(file, refresh, as_code_schema, schema_url, ssl_cert):
16
16
  """Verify that the yaml FILE matches the neoload as-code file format"""
17
17
  # -s/--as-code-schema (new) takes priority over --schema-url (deprecated alias)
18
- resolved_schema = as_code_schema or schema_url or __default_schema_url
18
+ resolved_schema = as_code_schema or schema_url
19
19
  print(schema_validation.validate_path(file, resolved_schema, ssl_cert))