neoload 1.3.12__tar.gz → 1.3.14.dev1__tar.gz

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