diff --git a/Dockerfile b/Dockerfile index 13adfc46b..848564930 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ # bzt run: docker run --shm-size=4g -v "$PWD:/dc-app-performance-toolkit" atlassian/dcapt jira.yml # interactive run: docker run -it --entrypoint="/bin/bash" -v "$PWD:/dc-app-performance-toolkit" atlassian/dcapt -FROM blazemeter/taurus:1.16.2 +FROM blazemeter/taurus:1.16.4 ENV APT_INSTALL="apt-get -y install --no-install-recommends" diff --git a/README.md b/README.md index fdfd446ac..c64022ac9 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,22 @@ This repository contains Taurus scripts for performance testing of Atlassian Dat ## Supported versions * Supported Jira versions: - * Jira [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `8.13.16`, `8.20.4` + * Jira [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `8.13.20`, `8.20.8` * Supported Jira Service Management versions: - * Jira Service Management [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `4.13.16`, `4.20.4` + * Jira Service Management [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `4.13.20`, `4.20.8` * Supported Confluence versions: - * Confluence [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `7.13.3`, `7.4.14` + * Confluence [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `7.13.5`, `7.4.16` * Supported Bitbucket Server versions: - * Bitbucket Server [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `7.6.13`, `7.17.5` + * Bitbucket Server [Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html): `7.6.14`, `7.17.6` * Supported Crowd versions: * Crowd [release notes](https://confluence.atlassian.com/crowd/crowd-release-notes-199094.html): `4.4.0` * Supported Bamboo versions: - * Bamboo [release notes](https://confluence.atlassian.com/bamboo/bamboo-release-notes-671089224.html): `8.1.1` + * Bamboo [release notes](https://confluence.atlassian.com/bamboo/bamboo-release-notes-671089224.html): `8.1.3` ## Support In case of technical questions, issues or problems with DC Apps Performance Toolkit, contact us for support in the [community Slack](http://bit.ly/dcapt_slack) **#data-center-app-performance-toolkit** channel. @@ -29,7 +29,7 @@ In case of technical questions, issues or problems with DC Apps Performance Tool #### Dependencies * Python 3.7, 3.8 or 3.9 and pip -* JDK 8 +* JDK 11 * Google Chrome web browser * Git client (only for Bitbucket DC) diff --git a/app/bamboo.yml b/app/bamboo.yml index abc8febd6..25d9261fd 100644 --- a/app/bamboo.yml +++ b/app/bamboo.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/bamboo/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test-bamboo.atlassian.com # Bamboo DC hostname without protocol and port e.g. test-bamboo.atlassian.com or localhost application_protocol: http # http or https @@ -48,7 +49,7 @@ services: - python util/post_run/cleanup_results_dir.py - module: pip-install packages: - - selenium==3.141.0 + - selenium==4.1.3 execution: - scenario: jmeter executor: jmeter @@ -122,7 +123,7 @@ modules: httpsampler.ignore_failed_embedded_resources: "true" selenium: chromedriver: - version: "97.0.4692.71" # Supports Chrome version 97. You can refer to http://chromedriver.chromium.org/downloads + version: "101.0.4951.41" # Supports Chrome version 101. You can refer to http://chromedriver.chromium.org/downloads reporting: - data-source: sample-labels module: junit-xml \ No newline at end of file diff --git a/app/bitbucket.yml b/app/bitbucket.yml index c9f6df586..449ecd084 100644 --- a/app/bitbucket.yml +++ b/app/bitbucket.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/bitbucket/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test_bitbucket_instance.atlassian.com # Bitbucket DC hostname without protocol and port e.g. test-bitbucket.atlassian.com or localhost application_protocol: http # http or https @@ -35,7 +36,7 @@ services: - python util/post_run/cleanup_results_dir.py - module: pip-install packages: - - selenium==3.141.0 + - selenium==4.1.3 execution: - scenario: ${load_executor} concurrency: ${concurrency} @@ -89,7 +90,7 @@ modules: httpsampler.ignore_failed_embedded_resources: "true" selenium: chromedriver: - version: "97.0.4692.71" # Supports Chrome version 97. You can refer to http://chromedriver.chromium.org/downloads + version: "101.0.4951.41" # Supports Chrome version 101. You can refer to http://chromedriver.chromium.org/downloads reporting: - data-source: sample-labels module: junit-xml diff --git a/app/confluence.yml b/app/confluence.yml index b5ce0f8a3..0d15484cd 100644 --- a/app/confluence.yml +++ b/app/confluence.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/confluence/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test_confluence_instance.atlassian.com # Confluence DC hostname without protocol and port e.g. test-confluence.atlassian.com or localhost application_protocol: http # http or https @@ -48,7 +49,7 @@ services: - python util/post_run/cleanup_results_dir.py - module: pip-install packages: - - selenium==3.141.0 + - selenium==4.1.3 execution: - scenario: ${load_executor} executor: ${load_executor} @@ -113,7 +114,7 @@ modules: httpsampler.ignore_failed_embedded_resources: "true" selenium: chromedriver: - version: "97.0.4692.71" # Supports Chrome version 97. You can refer to http://chromedriver.chromium.org/downloads + version: "101.0.4951.41" # Supports Chrome version 101. You can refer to http://chromedriver.chromium.org/downloads reporting: - data-source: sample-labels module: junit-xml diff --git a/app/crowd.yml b/app/crowd.yml index 92260a20c..87997b4af 100644 --- a/app/crowd.yml +++ b/app/crowd.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/crowd/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test_crowd_instance.atlassian.com # Crowd DC hostname without protocol and port e.g. test-crowd.atlassian.com or localhost application_protocol: http # http or https diff --git a/app/jira.yml b/app/jira.yml index 7fed21346..26da89bab 100644 --- a/app/jira.yml +++ b/app/jira.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/jira/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test_jira_instance.atlassian.com # Jira DC hostname without protocol and port e.g. test-jira.atlassian.com or localhost application_protocol: http # http or https @@ -50,7 +51,7 @@ services: - python util/post_run/cleanup_results_dir.py - module: pip-install packages: - - selenium==3.141.0 + - selenium==4.1.3 execution: - scenario: ${load_executor} executor: ${load_executor} @@ -117,7 +118,7 @@ modules: httpsampler.ignore_failed_embedded_resources: "true" selenium: chromedriver: - version: "97.0.4692.71" # Supports Chrome version 97. You can refer to http://chromedriver.chromium.org/downloads + version: "101.0.4951.41" # Supports Chrome version 101. You can refer to http://chromedriver.chromium.org/downloads reporting: - data-source: sample-labels module: junit-xml diff --git a/app/jmeter/jsm_agents.jmx b/app/jmeter/jsm_agents.jmx index be4134367..9c1a3d134 100644 --- a/app/jmeter/jsm_agents.jmx +++ b/app/jmeter/jsm_agents.jmx @@ -1,8 +1,8 @@ - + - + This test plan was created by the BlazeMeter converter v.3.1.23. Please contact support@blazemeter.com for further support. false true false @@ -34,6 +34,11 @@ ${__P(application_postfix, )} = + + insight + ${__P(insight, )} + = + @@ -206,6 +211,41 @@ ${__P(perc_agent_standalone_extension, 0)} = + + perc_agent_insight_main_page + ${__P(perc_agent_insight_main_page, 0)} + = + + + perc_agent_insight_create_schema + ${__P(perc_agent_insight_create_schema, 0)} + = + + + perc_agent_insight_create_object + ${__P(perc_agent_insight_create_object, 0)} + = + + + perc_agent_insight_delete_schema + ${__P(perc_agent_insight_delete_schema, 0)} + = + + + perc_agent_insight_view_queue_insight_column + ${__P(perc_agent_insight_view_queue_insight_column, 0)} + = + + + perc_agent_insight_view_issue_with_objects + ${__P(perc_agent_insight_view_issue_with_objects, 0)} + = + + + perc_agent_insight_search_object_by_iql + ${__P(perc_agent_insight_search_object_by_iql, 0)} + = + @@ -1004,6 +1044,17 @@ JMeterUtils.setProperty("c_AtlToken" + user_counter, atl_token) true + + datasets/jsm/insight_issues.csv + UTF-8 + , + insight_issue_key,insight_issue_id,insight_issue_name + true + false + true + true + + datasets/jsm/requests.csv UTF-8 @@ -9991,12 +10042,11 @@ if ( sleep_time > 0 ) { - - 1 - false - 1 - ${perc_agent_standalone_extension} - + + + false + true + 1 @@ -10453,6 +10503,3565 @@ def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - sta log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_agent_insight_main_page} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + ${__groovy("${insight}" == "True")} + false + Check if Insight enabled + true + + + + false + true + + + + + + + false + inAdminMode + false + = + true + + + false + _ + 1648197601161 + = + true + + + + + + + + ${application.postfix}/rest/api/1.0/menus/rlabs_insight_topmenu_link + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + X-AUSERNAME + admin + + + + + + + + + + + + + + ${application.postfix}/secure/ManageObjectSchema.jspa + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","atl.general","jira.global","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip"],"c":["jira.webresources:mentions-feature"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.jira.plugins.jira-quicksearch-plugin:5"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.plugin.jslibs:underscore-1.8.3"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648197623432 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/list + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"jira.navigation.header.undefined.item.click","properties":{},"timeDelta":-3839},{"name":"atst.healthcheck.sensors.page-protocols","properties":{"resourceProtocols":"http/1.1","navigationProtocol":"http/1.1","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.83 Safari/537.36"},"timeDelta":-502},{"name":"quicksearch.enabled","properties":{},"timeDelta":-455},{"name":"insight.manage.object.schema.view.event","properties":{},"timeDelta":-130}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_agents").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_agent_insight_create_schema} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + ${__groovy("${insight}" == "True")} + false + Check if Insight enabled + true + + + + false + true + + + + + + + false + _ + 1648197623438 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/create/default + GET + true + false + true + false + + + + + + + + false + true + + + + true + + + + false + {"status":"Ok","name":"${__RandomString(5,abcdefg)}","objectSchemaKey":"${__RandomString(5,abcdefg)}","type":"itasset"} + = + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschemaimport/template + POST + false + true + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + schema_id + $.id + 1 + all + NOT FOUND + true + + + + + + false + true + + + + + + + false + id + ${schema_id} + = + true + + + + + + + + ${application.postfix}/secure/ObjectSchema.jspa + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","atl.general","jira.global","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:jstree","com.atlassian.auiplugin:split_aui.component.restful-table","com.riadalabs.jira.plugins.insight:codemirror","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip"],"c":["jira.webresources:mentions-feature"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:jstree","com.atlassian.auiplugin:split_aui.component.restful-table","com.riadalabs.jira.plugins.insight:codemirror","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","com.atlassian.auiplugin:split_aui.splitchunk.vendors--9c8c8c1546","com.atlassian.auiplugin:split_aui.splitchunk.vendors--06bc6ae5d7","com.atlassian.auiplugin:split_aui.splitchunk.vendors--37ccb8d673","com.riadalabs.jira.plugins.insight:rlabs-object-multi-picker","com.riadalabs.jira.plugins.insight:rlabs-insight-general","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + objectschemaid + ${schema_id} + = + true + + + false + _ + 1648553559435 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/global/config/object + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.jira.plugins.jira-quicksearch-plugin:5"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:jstree","com.atlassian.auiplugin:split_aui.component.restful-table","com.riadalabs.jira.plugins.insight:codemirror","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","com.atlassian.auiplugin:split_aui.splitchunk.vendors--9c8c8c1546","com.atlassian.auiplugin:split_aui.splitchunk.vendors--06bc6ae5d7","com.atlassian.auiplugin:split_aui.splitchunk.vendors--37ccb8d673","com.riadalabs.jira.plugins.insight:rlabs-object-multi-picker","com.riadalabs.jira.plugins.insight:rlabs-insight-general","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.plugin.jslibs:underscore-1.8.3"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648553559436 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/${schema_id} + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"atst.healthcheck.sensors.page-protocols","properties":{"resourceProtocols":"http/1.1","navigationProtocol":"http/1.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"},"timeDelta":-499},{"name":"quicksearch.enabled","properties":{},"timeDelta":-259}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + + false + objectTypeId + 0 + = + true + + + false + _ + 1648553559438 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/${schema_id}/jstree + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + + + + false + object_type_id + rlabs_jstree_(.+?)\" + $1$ + NOT FOUND + 1 + + + + + + + + false + _ + 1648553559437 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/progress/category/insight-reindex/inprogress + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648553559439 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objecttype/${object_type_id}/details + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + {"objectTypeId":"${object_type_id}","filters":[],"attributesToDisplay":{"attributesToDisplayIds":[]},"page":1,"asc":1,"resultsPerPage":25,"includeAttributes":false,"objectSchemaId":"${schema_id}"} + = + + + + + + + + rest/insight/1.0/object/navlist + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648553559440 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/importsource/ot/${object_type_id}/imports + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + + + + false + includeChildren + false + = + true + + + false + _ + 1648553559441 + = + true + + + + + + + + rest/insight/1.0/objecttype/${object_type_id}/attributes + GET + true + false + true + false + + + + + + + + + Accept + */* + + + X-Requested-With + XMLHttpRequest + + + + + + + true + + + + false + [{"name":"insight.object.schema.detail.view.event","properties":{},"timeDelta":-5001}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + + false + excludeAbstract + true + = + true + + + false + _ + 1648553559442 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/${schema_id}/objecttypes + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json; charset=utf-8 + + + + + + + + + + false + _ + 1648553559443 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/global/config/objectschema/${schema_id}/property + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json; charset=utf-8 + + + + + + + + + + false + onlyValueEditable + true + = + true + + + false + _ + 1648553559444 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objecttype/${object_type_id}/attributes + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json; charset=utf-8 + + + + + + false + attribute_id + id\":(.+?)\," + $1$ + NOT FOUND + 1 + + + + + true + + + + false + {"objectTypeId": ${object_type_id} ,"attributes": [{"objectTypeAttributeId": ${attribute_id},"objectAttributeValues": [{"value": "Hello"}]}]} + = + + + + + + + + ${application.postfix}/rest/insight/1.0/object/create + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + {"objectTypeId":"${object_type_id}","filters":[],"attributesToDisplay":{"attributesToDisplayIds":[]},"page":1,"asc":1,"resultsPerPage":25,"includeAttributes":false,"objectSchemaId":"${schema_id}"} + = + + + + + + + + ${application.postfix}/rest/insight/1.0/object/navlist + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648553559445 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objecttype/${object_type_id}/details + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + + + + false + includeChildren + false + = + true + + + false + _ + 1648553559446 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objecttype/${object_type_id}/attributes + GET + true + false + true + false + + + + + + + + + Accept + */* + + + X-Requested-With + XMLHttpRequest + + + + + + + + false + true + + + + + + + + + + + ${application.postfix}/secure/ManageObjectSchema.jspa + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","atl.general","jira.global","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip"],"c":["jira.webresources:mentions-feature"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648201234009 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/global/config + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.jira.plugins.jira-quicksearch-plugin:5"],"xc":["_super","atl.general","jira.global","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:calendar-lib","com.atlassian.auiplugin:split_aui.component.dialog2","com.atlassian.auiplugin:split_aui.component.form.select2","com.atlassian.auiplugin:split_aui.component.form.single-select","com.atlassian.auiplugin:split_aui.component.progressbar","com.atlassian.auiplugin:split_aui.pattern.multi-step-progress","com.atlassian.auiplugin:split_aui.component.expander","com.riadalabs.jira.plugins.insight:colorpicker","com.riadalabs.jira.plugins.insight:ckeditor","com.riadalabs.jira.plugins.insight:rlabs-libs","com.riadalabs.jira.plugins.insight:rlabs-commons","com.riadalabs.jira.plugins.insight:rlabs-objectschema-manage","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar","com.atlassian.auiplugin:split_aui.splitchunk.4331a05956","com.riadalabs.jira.plugins.insight:mentional","com.riadalabs.jira.plugins.insight:rlabs-modes","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.plugin.jslibs:underscore-1.8.3"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + 1648201234011 + = + true + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/list + GET + true + false + true + false + + + + + + + + + Accept + application/json + + + X-Insight-Gadget + false + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"atst.healthcheck.sensors.page-protocols","properties":{"resourceProtocols":"http/1.1","navigationProtocol":"http/1.1","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.83 Safari/537.36"},"timeDelta":-499},{"name":"quicksearch.enabled","properties":{},"timeDelta":-450},{"name":"insight.manage.object.schema.view.event","properties":{},"timeDelta":-129}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + true + + + + false + [{"name":"jira.navigation.header.undefined.item.click","properties":{},"timeDelta":-1426}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + + + + + + ${application.postfix}/rest/insight/1.0/objectschema/${schema_id} + DELETE + true + false + true + false + + + 1000 + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + X-Atlassian-Token + no-check + + + Content-Type + application/json; charset=utf-8 + + + + + + + We are saving around 9s for this action for do not wait till it finished + + Assertion.response_data + true + 16 + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_agents").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_agent_insight_view_queue_insight_column} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + ${__groovy("${insight}" == "True")} + false + Check if Insight enabled + true + + + + false + true + + + + + + + + + + + ${application.postfix}/projects/${s_prj_key}/queues/custom/${s_prj_all_open_queue_id} + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["jira.webresources:mentions-feature"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","com.atlassian.plugins.atlassian-chaperone:hotspot-tour","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip"],"c":["jira.rich.editor.api","jira.rich.editor","jira.project.sidebar","jira.project.sidebar.service_desk","com.atlassian.servicedesk.frontend-webpack-plugin:47"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init","atl.global","jira.global.look-and-feel","browser-metrics-plugin.contrib","sd.project.sidebar.content"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","com.atlassian.plugins.atlassian-chaperone:hotspot-tour","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["sd.incident.management.counter"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init","atl.global","jira.global.look-and-feel","browser-metrics-plugin.contrib","sd.project.sidebar.content","jira.rich.editor.api","jira.rich.editor","com.atlassian.servicedesk.frontend-webpack-plugin:47"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","com.atlassian.plugins.atlassian-chaperone:hotspot-tour","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.jira.plugins.jira-editor-plugin:tinymce","com.atlassian.plugin.jslibs:underscore-1.8.3"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"id":"com.atlassian.servicedesk.project-ui:sd-project-sidebar-queues"} + = + + + + + + + + ${application.postfix}/rest/projects/1.0/project/${s_prj_key}/lastVisited + PUT + true + false + true + false + + + + + + + + + Accept + */* + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + ${__time(,)} + = + true + + + + + + + + ${application.postfix}/rest/projects/1.0/subnav/sd-queues-nav + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"projectKey":"${s_prj_key}"} + = + + + + + + + + ${application.postfix}/rest/servicedesk/1/${s_prj_key}/webfragments/sections/sd-queues-nav,servicedesk.agent.queues,servicedesk.agent.queues.ungrouped + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + m_random_queue_id + $..items[?(@.params.count != '0' && @.label != 'All open')].key + 1 + None + + + + + + + + + + + + ${application.postfix}/rest/projects/1.0/subnav/sd-queues-nav/pin + PUT + true + false + true + false + + + + + + + + + Accept + */* + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["jira.view.issue","jira.view.issue.deferred"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init","atl.global","jira.global.look-and-feel","browser-metrics-plugin.contrib","sd.project.sidebar.content","jira.rich.editor.api","jira.rich.editor","com.atlassian.servicedesk.frontend-webpack-plugin:47"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","com.atlassian.plugins.atlassian-chaperone:hotspot-tour","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.jira.plugins.jira-editor-plugin:tinymce","com.atlassian.plugin.jslibs:underscore-1.8.3","com.atlassian.servicedesk.frontend-webpack-plugin:split_vendors~linked-incidents-panel~sd.confluence.cloud.config~sd.incident.management.counter~sd.itsm.ops~25d1be88","com.atlassian.servicedesk.frontend-webpack-plugin:split_linked-incidents-panel~sd.confluence.cloud.config~sd.incident.management.counter~sd.itsm.opsgenie.co~a9eeae7c","com.atlassian.servicedesk.frontend-webpack-plugin:split_linked-incidents-panel~sd.incident.management.counter~sd.itsm.opsgenie.config","com.atlassian.servicedesk.frontend-webpack-plugin:split_sd.incident.management.counter"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.servicedesk.frontend-webpack-plugin:46"],"xc":["_super","jira.project.sidebar","sd.project.view","jira.view.issue","atl.general","jira.global","com.atlassian.jira.projects.sidebar.init","atl.global","jira.global.look-and-feel","browser-metrics-plugin.contrib","sd.project.sidebar.content","jira.rich.editor.api","jira.rich.editor","com.atlassian.servicedesk.frontend-webpack-plugin:47"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","com.atlassian.plugins.atlassian-chaperone:hotspot-tour","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.jira.plugins.jira-editor-plugin:tinymce","com.atlassian.plugin.jslibs:underscore-1.8.3","com.atlassian.servicedesk.frontend-webpack-plugin:split_vendors~linked-incidents-panel~sd.confluence.cloud.config~sd.incident.management.counter~sd.itsm.ops~25d1be88","com.atlassian.servicedesk.frontend-webpack-plugin:split_linked-incidents-panel~sd.confluence.cloud.config~sd.incident.management.counter~sd.itsm.opsgenie.co~a9eeae7c","com.atlassian.servicedesk.frontend-webpack-plugin:split_linked-incidents-panel~sd.incident.management.counter~sd.itsm.opsgenie.config","com.atlassian.servicedesk.frontend-webpack-plugin:split_sd.incident.management.counter"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + ${__time(,)} + = + true + + + + + + + + ${application.postfix}/rest/servicedesk/1/servicedesk/${s_prj_key}/queues/page + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + Insight + + There is NO Insight column in this project + Assertion.response_data + false + 2 + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_agents").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_agent_insight_view_issue_with_objects} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + ${__groovy("${insight}" == "True")} + false + Check if Insight enabled + true + + + + false + true + + + + + + + + + + + ${application.postfix}/browse/${insight_issue_key} + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + rowForcustomfield + + There is no insight custom field present + Assertion.response_data + false + 2 + + + + + true + + + + false + {"r":[],"c":["jira.webresources:mentions-feature"],"xc":["_super","project.issue.navigator","jira.view.issue","jira.global","atl.general","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","project.issue.navigator","jira.view.issue","jira.global","atl.general","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_agents").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_agent_insight_search_object_by_iql} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + ${__groovy("${insight}" == "True")} + false + Check if Insight enabled + true + + + + false + true + + + + + + + + + + + ${application.postfix}/secure/insight/search + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["jira.webresources:mentions-feature"],"xc":["_super","insight-core-object-navigator-app","jira.global","atl.general","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers"]} + = + + + + + + http + + rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["_super","insight-core-object-navigator-app","jira.global","atl.general","jira.general"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + + + + + ${application.postfix}/rest/insight-am/1/user/configuration + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + true + + + + false + {"r":["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip"],"c":[],"xc":["_super","insight-core-object-navigator-app","jira.global","atl.general","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + + + + + ${application.postfix}/rest/insight-am/1/configuration/schemas + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + + + + false + schema + 1 + = + true + + + false + limit + 2000 + = + true + + + + + + + + ${application.postfix}/rest/insight-am/1/search/attributes + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + + + + false + schema + 1 + = + true + + + + + + + + ${application.postfix}/rest/insight-am/1/objecttypes + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + + + + false + schema + 1 + = + true + + + + + + + + ${application.postfix}/rest/insight-am/1/filters + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + true + + + + false + [{"name":"jira.navigation.header.undefined.item.click","properties":{},"timeDelta":-12065}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + + + + + + ${application.postfix}/rest/insight-am/1/configuration/schemas/recents + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.jira.plugins.jira-quicksearch-plugin:5"],"xc":["_super","insight-core-object-navigator-app","jira.global","atl.general","jira.general","browser-metrics-plugin.contrib","atl.global","jira.global.look-and-feel"],"xr":["com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","jira.webresources:autocomplete","jira.webresources:groupbrowser","jira.webresources:group-pickers","com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","jira.webresources:group-label-lozenge","jira.webresources:jira-project-issuetype-fields","jira.webresources:jira-fields","jira.webresources:calendar-en","jira.webresources:calendar-localisation-moment","jira.webresources:bigpipe-js","jira.webresources:bigpipe-init","com.atlassian.jira.jira-header-plugin:newsletter-signup-tip","com.atlassian.plugin.jslibs:underscore-1.8.3"]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"quicksearch.enabled","properties":{},"timeDelta":-4911}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + + + + false + schema + 1 + = + true + + + true + iql + Name NOT LIKE 100 + = + true + + + false + cursorpos + 17 + = + true + + + + + + + + ${application.postfix}/rest/insight-am/1/iql/autocomplete + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + + + + + true + + + + false + {"iql":"Name NOT LIKE 100"} + = + + + + + + + + ${application.postfix}/rest/insight-am/1/iql/validate + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + Content-Type + application/json + + + + + + + + + + false + schema + 1 + = + true + + + false + offset + 0 + = + true + + + true + criteria + Name NOT LIKE 100 + = + true + + + false + limit + 50 + = + true + + + true + attributes + Key,Object Type,Label + = + true + + + false + criteriaType + IQL + = + true + + + + + + + + ${application.postfix}/rest/insight-am/1/search + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/plain, */* + + + X-Add-To-Recent-Filter + null + + + + + + + attributes + + There is no objects found + Assertion.response_data + false + 2 + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_agents").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + "concurrency," + "total_actions_per_hour: " + vars.get("total_actions_per_hour_agents") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + if ( sleep_time > 0 ) { return sleep_time } else { diff --git a/app/jmeter/jsm_customers.jmx b/app/jmeter/jsm_customers.jmx index f9485f5f7..09bba37cd 100644 --- a/app/jmeter/jsm_customers.jmx +++ b/app/jmeter/jsm_customers.jmx @@ -1,8 +1,8 @@ - + - + This test plan was created by the BlazeMeter converter v.3.1.23. Please contact support@blazemeter.com for further support. false true false @@ -34,6 +34,11 @@ ${__P(application_postfix, )} = + + insight + ${__P(insight, )} + = + @@ -237,6 +242,11 @@ import org.apache.commons.io.FileUtils; ${__P(perc_customer_standalone_extension, 0)} = + + perc_customer_insight_view_request + ${__P(perc_customer_insight_view_request, 0)} + = + @@ -2747,6 +2757,558 @@ def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - sta log.info("concurrency: " + concurrency + ", total_actions_per_hour: " + vars.get("total_actions_per_hour_customers") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) +if ( sleep_time > 0 ) { + return sleep_time +} else { + return 0 +} + + groovy + + + + + + 1 + false + 1 + ${perc_customer_insight_view_request} + + + + 1 + 0 + 0 + + + + true + + + vars.put("loop_start_time",String.valueOf(System.currentTimeMillis())); + + groovy + + + + + Check if Insight enabled + ${__groovy("${insight}" == "True")} + false + true + + + + false + true + + + + + + + + + + + ${application.postfix}/servicedesk/customer/portal/${s_service_desk_id} + GET + true + false + true + false + + + + + + + + + Upgrade-Insecure-Requests + 1 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 + + + + + + 0.0 + 0 + Recorded time was 0 milliseconds + + + + + true + + + + false + {"r":[],"c":["browser-metrics-plugin.contrib"],"xc":["jira.webresources:almond","customerportal","com.atlassian.analytics.analytics-client:js-events","async-chunk-cv-landing-page"],"xr":[]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"servicedesk.page.view.customerview.session","properties":{"count":1,"path":"cv.shared.portal","sdVersion":"4.20.4"},"timeDelta":-579},{"name":"servicedesk.page.view.portal.global.title.announcement.view.none","properties":{"sdVersion":"4.20.4"},"timeDelta":-537},{"name":"servicedesk.page.view.customerview","properties":{"sdVersion":"4.20.4","projectId":10085},"timeDelta":-521}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.servicedesk.frontend-webpack-plugin:16"],"xc":["jira.webresources:almond","customerportal","com.atlassian.analytics.analytics-client:js-events","async-chunk-cv-landing-page","browser-metrics-plugin.contrib"],"xr":[]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + requestTypeId + ${rt_id} + = + true + + + + + + + + ${application.postfix}/rest/insight_servicedesk/1.0/servicedesk/portalconfig + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json; charset=utf-8 + + + + + + false + custom_field_id + customFieldId":(.+?)\," + $1$ + NOT FOUND + 1 + + + + + true + + + + false + {"models":["user","organisations","sharedPortal","helpCenterBranding","portal","reqDetails","portalWebFragments"],"options":{"portalId":"${request_portal_id}","portal":{"id":"${request_portal_id}"},"reqDetails":{"key":"${request_key}"},"portalWebFragments":{"portalPage":"VIEW_REQUEST"}}} + = + + + + + + + + ${application.postfix}/rest/servicedesk/1/customer/models + POST + true + false + true + false + + + + + + + + + Accept + */* + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + + false + _ + 1649061328898 + = + true + + + + + + + + ${application.postfix}/rest/insight_servicedesk/1.0/servicedesk/${custom_field_id}/${rt_id}/defaultValue + GET + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json; charset=utf-8 + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.servicedesk.frontend-webpack-plugin:298"],"xc":["jira.webresources:almond","customerportal","com.atlassian.analytics.analytics-client:js-events","async-chunk-cv-landing-page","browser-metrics-plugin.contrib","com.atlassian.servicedesk.frontend-webpack-plugin:16"],"xr":[]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.servicedesk.frontend-webpack-plugin:196"],"xc":["jira.webresources:almond","customerportal","com.atlassian.analytics.analytics-client:js-events","async-chunk-cv-landing-page","browser-metrics-plugin.contrib","com.atlassian.servicedesk.frontend-webpack-plugin:16","com.atlassian.servicedesk.frontend-webpack-plugin:298"],"xr":[]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + true + + + + false + [{"name":"browser.metrics.navigation","properties":{"fcp":375.10000002384186,"ttfb":171.30000001192093,"pageVisibility":"visible","key":"servicedesk.cv.portal.landing","isInitial":"true","threshold":"1000","userDeviceProcessors":8,"apdex":"0.5","firstPaint":"375","journeyId":"c579e7d3-7735-4d78-995f-3a692a2392df","navigationType":"0","readyForUser":"1394","redirectCount":"0","resourceLoadedEnd":"","resourceLoadedStart":"","unloadEventStart":"184","unloadEventEnd":"184","fetchStart":"9","domainLookupStart":"9","domainLookupEnd":"9","connectStart":"9","connectEnd":"9","requestStart":"15","responseStart":"171","responseEnd":"219","domLoading":"191","domInteractive":"321","domContentLoadedEventStart":"321","domContentLoadedEventEnd":"322","domComplete":"1709","loadEventStart":"1709","loadEventEnd":"1711","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36","effectiveType":"4g","downlink":10,"rtt":50,"applicationHash":"42b33f804c795808933ab726ed11383e751e0bd1","elementTimings":"[]","resourceTiming":"{\"â˜Â \":[\"2,5f,e2,9y,5t,5f,,5f,5f,5f\",\"2,5f,a5,a4,62,5f,,5f,5f,5f\",\"3,8o,ie,e9,a5,8o,,8o,8o,8o\",\"3,8o,y2,dv,9t,9t,,8w,8w,8w\"]}","mark.@grammarly-extension:checkScriptInitStart":"[546]","mark.@grammarly-extension:checkScriptInitEnd":"[552]","userTimingRaw":"{\"marks\":{\"@grammarly-extension:checkScriptInitStart\":[546],\"@grammarly-extension:checkScriptInitEnd\":[552]},\"measures\":{}}","experiments":"[]","connectionEffectiveType":"4g","connectionDownlink":10,"connectionRTT":50},"timeDelta":-5155},{"name":"servicedesk.customerview.smartportal.single.portal.first.action.browse.requesttype","properties":{"portalCardsViewFlagOn":true,"sdVersion":"4.20.4","projectId":10085},"timeDelta":-2507},{"name":"servicedesk.customerview.smartportal.single.portal.browse.request.type.clicked","properties":{"sdVersion":"4.20.4","projectId":10085},"timeDelta":-2507},{"name":"servicedesk.customerview.richeditor.rendered","properties":{"isWysiwygEditorEnabled":true,"sdVersion":"4.20.4","projectId":10085},"timeDelta":-1606},{"name":"servicedesk.page.view.customerview.createRequest","properties":{"sdVersion":"4.20.4","projectId":10085},"timeDelta":-1599},{"name":"browser.metrics.navigation","properties":{"pageVisibility":"visible","key":"servicedesk.cv.request.create","isInitial":"false","threshold":"1000","userDeviceProcessors":8,"apdex":"1","journeyId":"c579e7d3-7735-4d78-995f-3a692a2392df","readyForUser":"902","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36","effectiveType":"4g","downlink":10,"rtt":50,"applicationHash":"42b33f804c795808933ab726ed11383e751e0bd1","elementTimings":"[]","resourceTiming":"{\"â˜Â \":[\"5,1,4i,4h,h,1,,1,1,1\",\"-1,d,4l,4k,m,d,,d,d,d\",\"5,3l,85,83,43,3l,,3l,3l,3l\",\"2,4k,cv,8o,4n,4k,,4k,4k,4k\",\"3,4l,hm,8r,4n,4l,,4l,4l,4l\",\"5,ii,nn,nm,il,ii,,ii,ii,ii\"]}","userTimingRaw":"{\"marks\":{},\"measures\":{}}","experiments":"[]","connectionEffectiveType":"4g","connectionDownlink":10,"connectionRTT":50},"timeDelta":-1335}] + = + + + + + + + + ${application.postfix}/rest/analytics/1.0/publish/bulk + POST + true + false + true + false + + + + + + + + + Content-Type + application/json + + + Accept + */* + + + + + + + true + + + + false + {"r":[],"c":["com.atlassian.servicedesk.frontend-webpack-plugin:219"],"xc":["jira.webresources:almond","customerportal","com.atlassian.analytics.analytics-client:js-events","async-chunk-cv-landing-page","browser-metrics-plugin.contrib","com.atlassian.servicedesk.frontend-webpack-plugin:16","com.atlassian.servicedesk.frontend-webpack-plugin:298","com.atlassian.servicedesk.frontend-webpack-plugin:196"],"xr":[]} + = + + + + + + + + ${application.postfix}/rest/webResources/1.0/resources + POST + true + false + true + false + + + + + + + + + Accept + application/json, text/javascript, */*; q=0.01 + + + X-Requested-With + XMLHttpRequest + + + Content-Type + application/json + + + + + + + + + 1 + 0 + 0 + + + + true + + + // concurrency +def concurrency = ctx.getThreadGroup().getNumThreads() + +// Delays between each action in milli-seconds +def delay_between_transactions = (1000 * 3600) / (vars.get("total_actions_per_hour_customers").toDouble() / concurrency.toDouble()) + +//Sets the pacing length based on the last requests response time. x is the time in ms +def start_time = Long.valueOf(vars.get("loop_start_time")) +def sleep_time = (delay_between_transactions - (System.currentTimeMillis() - start_time)) as int + +log.info("concurrency: " + concurrency + ", total_actions_per_hour: " + vars.get("total_actions_per_hour_customers") + ", delay_between_transactions: " + delay_between_transactions + ", thread_sleep: " + sleep_time) + if ( sleep_time > 0 ) { return sleep_time } else { diff --git a/app/jsm.yml b/app/jsm.yml index a17ff1264..a5dfeedeb 100644 --- a/app/jsm.yml +++ b/app/jsm.yml @@ -3,6 +3,7 @@ settings: artifacts-dir: results/jsm/%Y-%m-%d_%H-%M-%S aggregator: consolidator verbose: false + check-updates: false # disable bzt check for updates env: application_hostname: test_jsm_instance.atlassian.com # Jira Service Desk DC hostname without protocol and port e.g. test-jsm.atlassian.com or localhost application_protocol: http # http or https @@ -18,6 +19,7 @@ settings: ramp-up: 3m # time to spin all concurrent users total_actions_per_hour_agents: 5000 total_actions_per_hour_customers: 15000 + insight: False # Set True to enable Insight specific tests WEBDRIVER_VISIBLE: False JMETER_VERSION: 5.4.2 LANGUAGE: en_US.utf8 @@ -34,6 +36,11 @@ settings: agent_view_report_created_vs_resolved_medium: 2 agent_view_customers: 6 agent_standalone_extension: 0 + agent_insight_main_page: 10 + agent_insight_create_schema: 5 + agent_insight_view_queue_insight_column: 4 + agent_insight_view_issue_with_objects: 8 + agent_insight_search_object_by_iql: 2 customer_view_portal: 11 customer_view_requests: 25 @@ -42,6 +49,7 @@ settings: customer_share_request_with_customer: 5 customer_share_request_with_org: 4 customer_create_request: 16 + customer_insight_view_request: 6 customer_standalone_extension: 0 custom_dataset_query: "" # Write JQL query to add JQL output to the app/datasets/jsm/custom-issues.csv, e.g. "summary ~ 'AppRequests*'" @@ -59,7 +67,7 @@ services: - python util/post_run/cleanup_results_dir.py - module: pip-install packages: - - selenium==3.141.0 + - selenium==4.1.3 execution: - scenario: ${load_executor}_agents executor: ${load_executor} @@ -91,6 +99,7 @@ scenarios: jmeter_agents: script: jmeter/jsm_agents.jmx properties: + insight: ${insight} application_hostname: ${application_hostname} application_protocol: ${application_protocol} application_port: ${application_port} @@ -107,10 +116,16 @@ scenarios: perc_agent_view_report_created_vs_resolved_small: ${agent_view_report_created_vs_resolved_small} perc_agent_view_report_created_vs_resolved_medium: ${agent_view_report_created_vs_resolved_medium} perc_agent_view_customers: ${agent_view_customers} + perc_agent_insight_main_page: ${agent_insight_main_page} + perc_agent_insight_create_schema: ${agent_insight_create_schema} + perc_agent_insight_view_queue_insight_column: ${agent_insight_view_queue_insight_column} + perc_agent_insight_view_issue_with_objects: ${agent_insight_view_issue_with_objects} + perc_agent_insight_search_object_by_iql: ${agent_insight_search_object_by_iql} perc_agent_standalone_extension: ${agent_standalone_extension} jmeter_customers: script: jmeter/jsm_customers.jmx properties: + insight: ${insight} application_hostname: ${application_hostname} application_protocol: ${application_protocol} application_port: ${application_port} @@ -124,6 +139,7 @@ scenarios: perc_customer_share_request_with_customer: ${customer_share_request_with_customer} perc_customer_share_request_with_org: ${customer_share_request_with_org} perc_customer_create_request: ${customer_create_request} + perc_customer_insight_view_request: ${customer_insight_view_request} perc_customer_standalone_extension: ${customer_standalone_extension} modules: consolidator: @@ -154,7 +170,7 @@ modules: httpsampler.ignore_failed_embedded_resources: "true" selenium: chromedriver: - version: "97.0.4692.71" # Supports Chrome version 97. You can refer to http://chromedriver.chromium.org/downloads + version: "101.0.4951.41" # Supports Chrome version 101. You can refer to http://chromedriver.chromium.org/downloads reporting: - data-source: sample-labels module: junit-xml \ No newline at end of file diff --git a/app/reports_generation/bamboo_profile.yml b/app/reports_generation/bamboo_profile.yml index 178864b38..405bef746 100644 --- a/app/reports_generation/bamboo_profile.yml +++ b/app/reports_generation/bamboo_profile.yml @@ -2,7 +2,7 @@ column_name: "90% Line" runs: # fullPath should contain a full path to the directory with run results. - # E.g. /home/$USER/dc-app-performance-toolkit/bamboo/results/2021-11-00_17-41-08 + # E.g. /home/$USER/dc-app-performance-toolkit/app/results/bamboo/2021-11-00_17-41-08 - runName: "without app" runType: "baseline" fullPath: "" diff --git a/app/reports_generation/performance_profile.yml b/app/reports_generation/performance_profile.yml index 15ca06d1f..319e3206f 100644 --- a/app/reports_generation/performance_profile.yml +++ b/app/reports_generation/performance_profile.yml @@ -1,7 +1,7 @@ # Defines which column from test runs is used for aggregated report. Default is "90% Line" column_name: "90% Line" runs: - # fullPath should contain a full path to the directory with run results. E.g. /home/$USER/dc-app-performance-toolkit/jira/results/2019-08-06_17-41-08 + # fullPath should contain a full path to the directory with run results. E.g. /home/$USER/dc-app-performance-toolkit/app/results/jira/2019-08-06_17-41-08 - runName: "without app" runType: "baseline" fullPath: "" diff --git a/app/reports_generation/scale_profile.yml b/app/reports_generation/scale_profile.yml index b1f1fbaa8..616793e57 100644 --- a/app/reports_generation/scale_profile.yml +++ b/app/reports_generation/scale_profile.yml @@ -1,7 +1,7 @@ # Defines which column from test runs is used for aggregated report. Default is "90% Line" column_name: "90% Line" runs: - # fullPath should contain a full path to the directory with run results. E.g. /home/$USER/dc-app-performance-toolkit/jira/results/2019-08-06_18-41-08 + # fullPath should contain a full path to the directory with run results. E.g. /home/$USER/dc-app-performance-toolkit/app/results/jira/2019-08-06_18-41-08 - runName: "1 Node" runType: "baseline" fullPath: "" diff --git a/app/selenium_ui/bamboo/modules.py b/app/selenium_ui/bamboo/modules.py index ef21ab4bf..a07a8d0be 100644 --- a/app/selenium_ui/bamboo/modules.py +++ b/app/selenium_ui/bamboo/modules.py @@ -27,7 +27,6 @@ def sub_measure(): login_page.go_to() sub_measure() - login_page.set_credentials(username=datasets['username'], password=datasets['password']) login_page.click_login_button() @@ -128,8 +127,10 @@ def measure(): def log_out(webdriver, datasets): + logout = Logout(webdriver) + @print_timing("selenium_log_out") def measure(): - Logout(webdriver) - + logout.go_to() + logout.wait_for_page_loaded() measure() diff --git a/app/selenium_ui/bamboo/pages/pages.py b/app/selenium_ui/bamboo/pages/pages.py index 9126e4155..d28d38503 100644 --- a/app/selenium_ui/bamboo/pages/pages.py +++ b/app/selenium_ui/bamboo/pages/pages.py @@ -2,15 +2,15 @@ from selenium_ui.bamboo.pages.selectors import UrlManager, LoginPageLocators, AllProjectsLocators, AllBuildsLocators, \ PlanConfigurationLocators, BuildActivityLocators, PlanSummaryLocators, PlanHistoryLocators, BuildSummaryLocators, \ - BuildLogsLocators, JobConfigLocators + BuildLogsLocators, JobConfigLocators, LogoutLocators class Login(BasePage): page_url = LoginPageLocators.login_page_url def click_login_button(self): - self.wait_until_visible(LoginPageLocators.login_button).click() - self.wait_until_invisible(LoginPageLocators.login_button) + self.wait_until_visible(LoginPageLocators.login_submit_button).click() + self.wait_until_invisible(LoginPageLocators.login_submit_button) def set_credentials(self, username, password): self.get_element(LoginPageLocators.login_username_field).send_keys(username) @@ -102,4 +102,7 @@ def click_job_config_button(self): class Logout(BasePage): - UrlManager().logout_url() + page_url = LogoutLocators.logout_url + + def wait_for_page_loaded(self): + self.wait_until_visible(LogoutLocators.login_button_link) diff --git a/app/selenium_ui/bamboo/pages/selectors.py b/app/selenium_ui/bamboo/pages/selectors.py index dc46e9395..8902a724e 100644 --- a/app/selenium_ui/bamboo/pages/selectors.py +++ b/app/selenium_ui/bamboo/pages/selectors.py @@ -6,7 +6,7 @@ class UrlManager: def __init__(self, build_plan_id=None): self.host = BAMBOO_SETTINGS.server_url - self.login_params = '/userlogin!doDefault.action?os_destination=%2FallPlans.action' + self.login_params = '/userlogin!doDefault.action' self.logout_params = '/userLogout.action' self.all_projects_params = '/allProjects.action' self.plan_summary_params = f'/browse/{build_plan_id}' @@ -34,9 +34,9 @@ def logout_url(self): class LoginPageLocators: login_page_url = UrlManager().login_url() - login_button = (By.ID, "loginForm_save") login_username_field = (By.ID, "loginForm_os_username") login_password_field = (By.ID, "loginForm_os_password") + login_submit_button = (By.ID, "loginForm_save") class AllProjectsLocators: @@ -89,4 +89,5 @@ class JobConfigLocators: class LogoutLocators: - logout = (By.XPATH, "//a[@href='/userLogout.action']") + logout_url = UrlManager().logout_url() + login_button_link = (By.ID, "login") diff --git a/app/selenium_ui/base_page.py b/app/selenium_ui/base_page.py index 51f232eb5..b55e7c9ba 100644 --- a/app/selenium_ui/base_page.py +++ b/app/selenium_ui/base_page.py @@ -57,57 +57,63 @@ def element_exists(self, selector): return True if self.driver.find_elements(by, locator) else False def wait_until_invisible(self, selector, timeout=timeout): - return self.__wait_until(expected_condition=ec.invisibility_of_element_located(selector), time_out=timeout) + return self.__wait_until(expected_condition=ec.invisibility_of_element_located(selector), locator=selector, + time_out=timeout) def wait_until_visible(self, selector, timeout=timeout): - return self.__wait_until(expected_condition=ec.visibility_of_element_located(selector), time_out=timeout) + return self.__wait_until(expected_condition=ec.visibility_of_element_located(selector), locator=selector, + time_out=timeout) def wait_until_available_to_switch(self, selector): return self.__wait_until(expected_condition=ec.frame_to_be_available_and_switch_to_it(selector), + locator=selector, time_out=self.timeout) def wait_until_present(self, selector, timeout=timeout): - return self.__wait_until(expected_condition=ec.presence_of_element_located(selector), time_out=timeout) + return self.__wait_until(expected_condition=ec.presence_of_element_located(selector), locator=selector, + time_out=timeout) def wait_until_clickable(self, selector, timeout=timeout): - return self.__wait_until(expected_condition=ec.element_to_be_clickable(selector), time_out=timeout) + return self.__wait_until(expected_condition=ec.element_to_be_clickable(selector), locator=selector, + time_out=timeout) def wait_until_any_element_visible(self, selector, timeout=timeout): return self.__wait_until(expected_condition=ec.visibility_of_any_elements_located(selector), + locator=selector, time_out=timeout) def wait_until_any_ec_presented(self, selectors, timeout=timeout): any_ec = AnyEc() any_ec.ecs = tuple(ec.presence_of_element_located(selector) for selector in selectors) - return self.__wait_until(expected_condition=any_ec, time_out=timeout) + return self.__wait_until(expected_condition=any_ec, locator=selectors, time_out=timeout) def wait_until_any_ec_text_presented_in_el(self, selector_text_list, timeout=timeout): any_ec = AnyEc() any_ec.ecs = tuple(ec.text_to_be_present_in_element(locator=selector_text[0], text_=selector_text[1]) for selector_text in selector_text_list) - return self.__wait_until(expected_condition=any_ec, time_out=timeout) + return self.__wait_until(expected_condition=any_ec, locator=selector_text_list, time_out=timeout) - def __wait_until(self, expected_condition, time_out=timeout): + def __wait_until(self, expected_condition, locator, time_out=timeout): message = f"Error in wait_until: " ec_type = type(expected_condition) if ec_type == AnyEc: conditions_text = "" for ecs in expected_condition.ecs: - conditions_text = conditions_text + " " + f"Condition: {str(ecs)} Locator: {ecs.locator}\n" + conditions_text = conditions_text + " " + f"Condition: {str(ecs)} Locator: {locator}\n" message += f"Timed out after {time_out} sec waiting for one of the conditions: \n{conditions_text}" elif ec_type == ec.invisibility_of_element_located: message += (f"Timed out after {time_out} sec waiting for {str(expected_condition)}. \n" - f"Locator: {expected_condition.target}") + f"Locator: {locator}") elif ec_type == ec.frame_to_be_available_and_switch_to_it: message += (f"Timed out after {time_out} sec waiting for {str(expected_condition)}. \n" - f"Locator: {expected_condition.frame_locator}") + f"Locator: {locator}") else: message += (f"Timed out after {time_out} sec waiting for {str(expected_condition)}. \n" - f"Locator: {expected_condition.locator}") + f"Locator: {locator}") return WebDriverWait(self.driver, time_out).until(expected_condition, message=message) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index 254e729d4..d38ac5856 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -19,8 +19,8 @@ JIRA_DATASET_PROJECTS, JIRA_DATASET_SCRUM_BOARDS, JIRA_DATASET_USERS, JIRA_DATASET_CUSTOM_ISSUES, BITBUCKET_USERS, \ BITBUCKET_PROJECTS, BITBUCKET_REPOS, BITBUCKET_PRS, CONFLUENCE_BLOGS, CONFLUENCE_PAGES, CONFLUENCE_CUSTOM_PAGES, \ CONFLUENCE_USERS, ENV_TAURUS_ARTIFACT_DIR, JSM_DATASET_REQUESTS, JSM_DATASET_CUSTOMERS, JSM_DATASET_AGENTS, \ - JSM_DATASET_SERVICE_DESKS_L, JSM_DATASET_SERVICE_DESKS_M, JSM_DATASET_SERVICE_DESKS_S, JSM_DATASET_CUSTOM_ISSUES, \ - BAMBOO_USERS, BAMBOO_BUILD_PLANS + JSM_DATASET_SERVICE_DESKS_L, JSM_DATASET_SERVICE_DESKS_M, JSM_DATASET_SERVICE_DESKS_S, JSM_DATASET_CUSTOM_ISSUES,\ + JSM_DATASET_INSIGHT_SCHEMAS, JSM_DATASET_INSIGHT_ISSUES, BAMBOO_USERS, BAMBOO_BUILD_PLANS SCREEN_WIDTH = 1920 SCREEN_HEIGHT = 1080 @@ -61,6 +61,8 @@ def jsm_dataset(self): self.dataset["service_desks_small"] = self.__read_input_file(JSM_DATASET_SERVICE_DESKS_S) self.dataset["service_desks_medium"] = self.__read_input_file(JSM_DATASET_SERVICE_DESKS_M) self.dataset["custom_issues"] = self.__read_input_file(JSM_DATASET_CUSTOM_ISSUES) + self.dataset["insight_schemas"] = self.__read_input_file(JSM_DATASET_INSIGHT_SCHEMAS) + self.dataset["insight_issues"] = self.__read_input_file(JSM_DATASET_INSIGHT_ISSUES) return self.dataset def confluence_dataset(self): diff --git a/app/selenium_ui/jira/modules.py b/app/selenium_ui/jira/modules.py index f5fcded4c..df0ee49d0 100644 --- a/app/selenium_ui/jira/modules.py +++ b/app/selenium_ui/jira/modules.py @@ -55,6 +55,7 @@ def measure(): @print_timing("selenium_login:open_login_page") def sub_measure(): login_page.go_to() + sub_measure() @print_timing("selenium_login:login_and_view_dashboard") @@ -67,7 +68,9 @@ def sub_measure(): login_page.wait_for_page_loaded() webdriver.node_id = login_page.get_node_id() print(f"node_id:{webdriver.node_id}") + sub_measure() + measure() PopupManager(webdriver).dismiss_default_popup() @@ -79,6 +82,7 @@ def view_issue(webdriver, datasets): def measure(): issue_page.go_to() issue_page.wait_for_page_loaded() + measure() @@ -89,6 +93,7 @@ def view_project_summary(webdriver, datasets): def measure(): project_page.go_to() project_page.wait_for_page_loaded() + measure() @@ -97,10 +102,10 @@ def create_issue(webdriver, dataset): @print_timing("selenium_create_issue") def measure(): - @print_timing("selenium_create_issue:open_quick_create") def sub_measure(): issue_modal.open_create_issue_modal() + sub_measure() @print_timing("selenium_create_issue:fill_and_submit_issue_form") @@ -114,8 +119,11 @@ def sub_measure(): @print_timing("selenium_create_issue:fill_and_submit_issue_form:submit_issue_form") def sub_sub_measure(): issue_modal.submit_issue() + sub_sub_measure() + sub_measure() + measure() PopupManager(webdriver).dismiss_default_popup() @@ -127,6 +135,7 @@ def search_jql(webdriver, datasets): def measure(): search_page.go_to() search_page.wait_for_page_loaded() + measure() @@ -135,10 +144,10 @@ def edit_issue(webdriver, datasets): @print_timing("selenium_edit_issue") def measure(): - @print_timing("selenium_edit_issue:open_edit_issue_form") def sub_measure(): issue_page.go_to_edit_issue() # open editor + sub_measure() issue_page.fill_summary_edit() # edit summary @@ -148,7 +157,9 @@ def sub_measure(): def sub_measure(): issue_page.edit_issue_submit() # submit edit issue issue_page.wait_for_issue_title() + sub_measure() + measure() @@ -157,10 +168,10 @@ def save_comment(webdriver, datasets): @print_timing("selenium_save_comment") def measure(): - @print_timing("selenium_save_comment:open_comment_form") def sub_measure(): issue_page.go_to_edit_comment() # Open edit comment page + sub_measure() issue_page.fill_comment_edit(rte_status) # Fill comment text field @@ -168,7 +179,9 @@ def sub_measure(): @print_timing("selenium_save_comment:submit_form") def sub_measure(): issue_page.edit_comment_submit() # Submit comment + sub_measure() + measure() @@ -178,6 +191,7 @@ def measure(): projects_list_page = ProjectsList(webdriver, projects_list_pages=datasets['project_pages_count']) projects_list_page.go_to() projects_list_page.wait_for_page_loaded() + measure() @@ -187,6 +201,7 @@ def measure(): boards_list_page = BoardsList(webdriver) boards_list_page.go_to() boards_list_page.wait_for_page_loaded() + measure() PopupManager(webdriver).dismiss_default_popup() @@ -198,6 +213,7 @@ def view_backlog_for_scrum_board(webdriver, datasets): def measure(): scrum_board_page.go_to_backlog() scrum_board_page.wait_for_scrum_board_backlog() + measure() @@ -208,6 +224,7 @@ def view_scrum_board(webdriver, datasets): def measure(): scrum_board_page.go_to() scrum_board_page.wait_for_page_loaded() + measure() @@ -218,6 +235,7 @@ def view_kanban_board(webdriver, datasets): def measure(): kanban_board_page.go_to() kanban_board_page.wait_for_page_loaded() + measure() @@ -228,6 +246,7 @@ def view_dashboard(webdriver, datasets): def measure(): dashboard_page.go_to() dashboard_page.wait_dashboard_presented() + measure() @@ -239,4 +258,5 @@ def measure(): logout_page.go_to() logout_page.click_logout() logout_page.wait_for_page_loaded() + measure() diff --git a/app/selenium_ui/jira/pages/selectors.py b/app/selenium_ui/jira/pages/selectors.py index 5bd924f15..f6462e38d 100644 --- a/app/selenium_ui/jira/pages/selectors.py +++ b/app/selenium_ui/jira/pages/selectors.py @@ -65,7 +65,6 @@ def logout_url(self): class LoginPageLocators: - login_url = UrlManager().login_url() login_params = UrlManager().login_params @@ -81,21 +80,18 @@ class LoginPageLocators: class LogoutLocators: - logout_url = UrlManager().logout_url() logout_submit_button = (By.ID, "confirm-logout-submit") login_button_link = (By.CLASS_NAME, "login-link") class DashboardLocators: - dashboard_url = UrlManager().dashboard_url() dashboard_params = UrlManager().dashboard_params dashboard_window = (By.CLASS_NAME, "page-type-dashboard") class IssueLocators: - issue_title = (By.ID, "summary-val") create_issue_button = (By.ID, "create_link") @@ -125,7 +121,6 @@ class IssueLocators: class ProjectLocators: - project_summary_property_column = (By.CLASS_NAME, 'project-meta-column') # projects list locators @@ -134,7 +129,6 @@ class ProjectLocators: class SearchLocators: - search_issue_table = (By.ID, "issuetable") search_issue_content = (By.ID, "issue-content") search_no_issue_found = (By.CLASS_NAME, "no-results-message") diff --git a/app/selenium_ui/jira_ui.py b/app/selenium_ui/jira_ui.py index 9bf2949df..3478d2c0d 100644 --- a/app/selenium_ui/jira_ui.py +++ b/app/selenium_ui/jira_ui.py @@ -55,11 +55,14 @@ def test_1_selenium_view_project_summary(jira_webdriver, jira_datasets, jira_scr modules.view_project_summary(jira_webdriver, jira_datasets) + """ Add custom actions anywhere between login and log out action. Move this to a different line as needed. Write your custom selenium scripts in `app/extension/jira/extension_ui.py`. Refer to `app/selenium_ui/jira/modules.py` for examples. """ + + # def test_1_selenium_custom_action(jira_webdriver, jira_datasets, jira_screen_shots): # extension_ui.app_specific_action(jira_webdriver, jira_datasets) diff --git a/app/selenium_ui/jsm/modules_agents.py b/app/selenium_ui/jsm/modules_agents.py index 38a6eb9f2..1275d6ba4 100644 --- a/app/selenium_ui/jsm/modules_agents.py +++ b/app/selenium_ui/jsm/modules_agents.py @@ -2,7 +2,8 @@ from selenium_ui.conftest import print_timing from selenium_ui.jsm.pages.agent_pages import Login, PopupManager, Logout, BrowseProjects, BrowseCustomers, \ - ViewCustomerRequest, ViewQueue, Report + ViewCustomerRequest, ViewQueue, Report, InsightLogin, InsightNewSchema, InsightNewObject, InsightDeleteSchema, \ + InsightViewQueue, ViewIssueWithObject, InsightSearchByIql from util.api.jira_clients import JiraRestClient from util.conf import JSM_SETTINGS @@ -16,6 +17,8 @@ SERVICE_DESKS_SMALL = "service_desks_small" SERVICE_DESKS_MEDIUM = "service_desks_medium" CUSTOM_ISSUES = "custom_issues" +INSIGHT_ISSUES = "insight_issues" +INSIGHT_SCHEMAS = "insight_schemas" def setup_run_data(datasets): @@ -63,6 +66,12 @@ def setup_run_data(datasets): datasets['custom_issue_key'] = custom_issue[0] datasets['custom_issue_id'] = custom_issue[1] + if JSM_SETTINGS.insight: + schema_id = random.choice(datasets[INSIGHT_SCHEMAS]) + datasets['schema_id'] = schema_id[0] + insight_issues = random.choice(datasets[INSIGHT_ISSUES]) + datasets['issue_key'] = insight_issues[0] + def login(webdriver, datasets): setup_run_data(datasets) @@ -236,6 +245,95 @@ def view_queues_small(webdriver, datasets): PopupManager(webdriver).dismiss_default_popup() +def insight_main_page(webdriver, datasets): + view_insight_main_page = InsightLogin(webdriver) + + @print_timing("selenium_agent_insight_view_main_page") + def measure(): + view_insight_main_page.go_to() + view_insight_main_page.submit_login(username=datasets['agent_username'], password=datasets['agent_password']) + + measure() + PopupManager(webdriver).dismiss_default_popup() + + +def insight_create_new_schema(webdriver, datasets): + insight_create_schema_page = InsightNewSchema(webdriver) + + @print_timing('selenium_agent_insight_create_new_schema') + def measure(): + insight_create_schema_page.go_to() + insight_create_schema_page.wait_for_page_loaded() + PopupManager(webdriver).dismiss_default_popup() + datasets['schema_name'] = insight_create_schema_page.create_new_schema() + + measure() + + +def insight_create_new_object(webdriver, datasets): + insight_new_object_page = InsightNewObject(webdriver) + + @print_timing('selenium_agent_insight_create_new_object') + def measure(): + insight_new_object_page.wait_for_page_loaded() + insight_new_object_page.go_to_new_schema(datasets['schema_name']) + insight_new_object_page.insight_create_new_objects() + + measure() + PopupManager(webdriver).dismiss_default_popup() + + +def insight_delete_new_schema(webdriver, datasets): + insight_delete_schema_page = InsightDeleteSchema(webdriver) + + @print_timing('selenium_agent_insight_delete_new_schema') + def measure(): + insight_delete_schema_page.go_to() + insight_delete_schema_page.wait_for_page_loaded() + PopupManager(webdriver).dismiss_default_popup() + insight_delete_schema_page.delete_new_schema(datasets['schema_name']) + + measure() + + +def insight_view_queue_insight_column(webdriver, datasets): + insight_random_queue_page = InsightViewQueue(webdriver, project_key=datasets['random_project_key']) + + @print_timing('selenium_agent_insight_view_queue_with_insight_column') + def measure(): + insight_random_queue_page.go_to() + insight_random_queue_page.wait_for_page_loaded() + insight_random_queue_page.view_random_queue_with_insight() + + measure() + PopupManager(webdriver).dismiss_default_popup() + + +def insight_search_object_by_iql(webdriver, datasets): + search_object_by_iql_page = InsightSearchByIql(webdriver, schema_id=datasets['schema_id']) + + @print_timing('selenium_agent_insight_search_object_by_iql') + def measure(): + search_object_by_iql_page.go_to() + search_object_by_iql_page.wait_for_page_loaded() + PopupManager(webdriver).dismiss_default_popup() + search_object_by_iql_page.search_object_by_iql() + + measure() + + +def view_issue_with_insight_objects(webdriver, datasets): + view_issue_with_objects_page = ViewIssueWithObject(webdriver, insight_issues=datasets["issue_key"]) + + @print_timing('selenium_agent_insight_view_issue_with_objects') + def measure(): + view_issue_with_objects_page.go_to() + view_issue_with_objects_page.wait_for_page_loaded() + view_issue_with_objects_page.view_issue_with_insight_custom_field() + + measure() + + def logout(webdriver, datasets): logout_page = Logout(webdriver) PopupManager(webdriver).dismiss_default_popup() diff --git a/app/selenium_ui/jsm/modules_customers.py b/app/selenium_ui/jsm/modules_customers.py index 44e36e084..3efea7a8d 100644 --- a/app/selenium_ui/jsm/modules_customers.py +++ b/app/selenium_ui/jsm/modules_customers.py @@ -1,6 +1,6 @@ from selenium_ui.conftest import print_timing from selenium_ui.jsm.pages.customer_pages import Login, TopPanel, CustomerPortals, CustomerPortal, CustomerRequest, \ - Requests + Requests, ViewRequestWithInsight import random REQUESTS = "requests" @@ -167,6 +167,18 @@ def sub_measure(): measure() +def view_request_with_insight(webdriver, datasets): + view_request_with_insight_field = ViewRequestWithInsight(webdriver, portal_id=datasets['customer_service_desk_id']) + + @print_timing("selenium_customer_insight_view_request_with_insight_field") + def measure(): + view_request_with_insight_field.go_to() + view_request_with_insight_field.choose_request_type() + view_request_with_insight_field.check_insight_field() + + measure() + + def log_out(webdriver, datasets): top_panel = TopPanel(webdriver) diff --git a/app/selenium_ui/jsm/pages/agent_pages.py b/app/selenium_ui/jsm/pages/agent_pages.py index 78609f8d8..11a02af47 100644 --- a/app/selenium_ui/jsm/pages/agent_pages.py +++ b/app/selenium_ui/jsm/pages/agent_pages.py @@ -4,13 +4,16 @@ from selenium.webdriver.common.keys import Keys from selenium_ui.jsm.pages.agent_selectors import LoginPageLocators, PopupLocators, DashboardLocators, LogoutLocators, \ BrowseProjectsLocators, BrowseCustomersLocators, ViewCustomerRequestLocators, UrlManager, ViewReportsLocators, \ - ViewQueueLocators + ViewQueueLocators, InsightViewQueueLocators, InsightViewIssue, InsightDeleteSchemaLocators, \ + InsightNewSchemaLocators, InsightNewObjectLocators, InsightSearchObjectIql class PopupManager(BasePage): def dismiss_default_popup(self): - return self.dismiss_popup(PopupLocators.default_popup, PopupLocators.popup_1, PopupLocators.popup_2) + return self.dismiss_popup(PopupLocators.default_popup, PopupLocators.popup_1, PopupLocators.popup_2, + PopupLocators.popup_3, PopupLocators.popup_4, + PopupLocators.popup_5) class Login(BasePage): @@ -195,3 +198,144 @@ def get_random_queue(self): and queue.text.partition('\n')[2] != '0']) random_queue.click() self.wait_until_present(ViewQueueLocators.queues_status, timeout=self.timeout) + + +class InsightLogin(BasePage): + + def __init__(self, driver): + BasePage.__init__(self, driver) + url_manager = UrlManager() + self.page_url = url_manager.view_insight_all_schemas() + + def submit_login(self, username, password): + self.get_element(LoginPageLocators.login_field).send_keys(username) + self.get_element(LoginPageLocators.password_field).send_keys(password) + self.get_element(LoginPageLocators.login_submit_button).click() + + +class InsightNewSchema(BasePage): + + def __init__(self, driver): + BasePage.__init__(self, driver) + url_manager = UrlManager() + self.page_url = url_manager.view_insight_all_schemas() + + def wait_for_page_loaded(self): + # `self.driver.find_elements` - used to catch pop_up window, which appears randomly for each user + self.wait_until_any_ec_presented((InsightNewSchemaLocators.submit_dialog_window, + InsightNewSchemaLocators.create_object_schemas)) + if self.driver.find_elements(by=InsightNewSchemaLocators.submit_dialog_window[0], + value=InsightNewSchemaLocators.submit_dialog_window[1]): + self.wait_until_clickable(InsightNewSchemaLocators.submit_dialog_window).click() + self.wait_until_visible(InsightNewSchemaLocators.create_object_schemas) + + def create_new_schema(self): + new_schema_name = self.generate_random_string(4).strip() + self.wait_until_clickable(InsightNewSchemaLocators.create_object_schemas).click() + self.wait_until_visible(InsightNewSchemaLocators.new_object_schema) + self.wait_until_clickable(InsightNewSchemaLocators.new_object_schema).click() + self.wait_until_clickable(InsightNewSchemaLocators.object_schemas_next_button).click() + self.get_element(InsightNewSchemaLocators.object_schemas_name_field).send_keys(new_schema_name) + self.get_element(InsightNewSchemaLocators.object_schemas_key_field).send_keys(new_schema_name) + self.wait_until_clickable(InsightNewSchemaLocators.object_schemas_create_button).click() + self.wait_until_invisible(InsightNewSchemaLocators.object_schemas_name_field) + self.wait_until_visible(InsightNewSchemaLocators.create_object_schemas) + + return new_schema_name + + +class InsightNewObject(BasePage): + + def wait_for_page_loaded(self): + self.wait_until_visible(InsightNewSchemaLocators.create_object_schemas) + + def go_to_new_schema(self, schema_name): + self.get_element(InsightNewSchemaLocators.get_new_object_schema_name_locator(schema_name)) + self.wait_until_visible(InsightNewSchemaLocators.get_new_object_schema_name_locator(schema_name)) + self.wait_until_clickable(InsightNewSchemaLocators.get_new_object_schema_name_locator(schema_name)).click() + self.wait_until_visible(InsightNewObjectLocators.create_object_button) + + def insight_create_new_objects(self): + self.wait_until_any_ec_presented((InsightNewSchemaLocators.submit_dialog_window, + InsightNewObjectLocators.create_object_button)) + if self.driver.find_elements(by=InsightNewSchemaLocators.submit_dialog_window[0], + value=InsightNewSchemaLocators.submit_dialog_window[1]): + self.wait_until_clickable(InsightNewSchemaLocators.submit_dialog_window).click() + self.wait_until_clickable(InsightNewObjectLocators.create_object_button).click() + self.wait_until_visible(InsightNewObjectLocators.object_name_field) + self.get_element(InsightNewObjectLocators.object_name_field).send_keys(self.generate_random_string(10)) + self.wait_until_visible(InsightNewObjectLocators.create_button) + self.wait_until_clickable(InsightNewObjectLocators.create_button).click() + self.wait_until_invisible(InsightNewObjectLocators.pop_up_after_create_object) + + +class InsightDeleteSchema(BasePage): + + def __init__(self, driver): + BasePage.__init__(self, driver) + url_manager = UrlManager() + self.page_url = url_manager.view_insight_all_schemas() + + def wait_for_page_loaded(self): + self.wait_until_visible(InsightDeleteSchemaLocators.schema_list) + + def delete_new_schema(self, schema_name): + new_schema_id = self.wait_until_visible( + InsightNewSchemaLocators.get_new_object_schema_name_locator(schema_name)).get_attribute('href').split('=')[ + 1] + self.wait_until_visible(InsightNewSchemaLocators.create_object_schemas) + self.wait_until_visible(InsightDeleteSchemaLocators.new_object_schema_id_locator(new_schema_id)) + self.wait_until_clickable(InsightDeleteSchemaLocators.new_object_schema_id_locator(new_schema_id)).click() + self.wait_until_visible(InsightDeleteSchemaLocators.new_object_schema_delete_button_locator(schema_name)) + self.wait_until_clickable(InsightDeleteSchemaLocators. + new_object_schema_delete_button_locator(schema_name)).click() + self.wait_until_visible(InsightDeleteSchemaLocators.delete_window_selector) + self.wait_until_clickable(InsightDeleteSchemaLocators.submit_delete_button).click() + self.wait_until_clickable(InsightDeleteSchemaLocators.submit_delete_button).click() + self.wait_until_invisible(InsightDeleteSchemaLocators.submit_delete_button) + + +class InsightViewQueue(BasePage): + + def __init__(self, driver, project_key=None): + BasePage.__init__(self, driver) + url_manager = UrlManager(project_key=project_key) + self.page_url = url_manager.view_insight_queue() + + def wait_for_page_loaded(self): + self.wait_until_visible(InsightViewQueueLocators.view_queue_page) + + def view_random_queue_with_insight(self): + self.wait_until_visible(InsightViewQueueLocators.view_queue_insight_column) + + +class InsightSearchByIql(BasePage): + + def __init__(self, driver, schema_id=None): + BasePage.__init__(self, driver) + url_manager = UrlManager(schema_id=schema_id) + self.page_url = url_manager.insight_search_by_iql() + + def wait_for_page_loaded(self): + self.wait_until_visible(InsightSearchObjectIql.search_object_text_field) + + def search_object_by_iql(self): + iql_attribute_search = f'Name >= {self.generate_random_string(2)}' + self.wait_until_visible(InsightSearchObjectIql.search_object_text_field) + self.get_element(InsightSearchObjectIql.search_object_text_field).send_keys(iql_attribute_search) + self.wait_until_clickable(InsightSearchObjectIql.search_iql_button).click() + self.wait_until_visible(InsightSearchObjectIql.search_iql_success) + + +class ViewIssueWithObject(BasePage): + + def __init__(self, driver, insight_issues=None): + BasePage.__init__(self, driver) + url_manager = UrlManager(insight_issues=insight_issues) + self.page_url = url_manager.view_issue_with_object() + + def wait_for_page_loaded(self): + self.wait_until_visible(InsightViewIssue.issue_title) + + def view_issue_with_insight_custom_field(self): + self.wait_until_visible(InsightViewIssue.custom_field_insight) diff --git a/app/selenium_ui/jsm/pages/agent_selectors.py b/app/selenium_ui/jsm/pages/agent_selectors.py index dc928a538..e2b622252 100644 --- a/app/selenium_ui/jsm/pages/agent_selectors.py +++ b/app/selenium_ui/jsm/pages/agent_selectors.py @@ -6,11 +6,15 @@ class PopupLocators: default_popup = '.aui-message .icon-close' popup_1 = 'form.tip-footer>.helptip-close' popup_2 = '.aui-inline-dialog-contents .cancel' + popup_3 = '.aui-close-button' + popup_4 = '.aui-button aui-button-link' + popup_5 = '.buttons-container > div > a' class UrlManager: - def __init__(self, project_key=None, request_key=None, queue_id=None, custom_report_id=None): + def __init__(self, project_key=None, request_key=None, queue_id=None, custom_report_id=None, + insight_issues=None, schema_id=None): self.host = JSM_SETTINGS.server_url self.login_params = '/login.jsp' self.logout_params = '/logoutconfirm.jsp' @@ -22,6 +26,10 @@ def __init__(self, project_key=None, request_key=None, queue_id=None, custom_rep self.queue_all_open = f'{self.view_queue}/{queue_id}' self.workload_report_params = f'/projects/{project_key}/reports/workload' self.custom_report_params = f'/projects/{project_key}/reports/custom/{custom_report_id}' + self.view_insight_queue_params = f'{self.view_queue}/1102' + self.view_issue_with_insight_object_params = f'/browse/{insight_issues}' + self.view_insight_all_schemas_params = '/secure/ManageObjectSchema.jspa' + self.insight_search_by_iql_params = f'/secure/insight/search?schema={schema_id}' def login_url(self): return f'{self.host}{self.login_params}' @@ -50,9 +58,20 @@ def custom_report_url(self): def view_queue_all_open(self): return f'{self.host}{self.queue_all_open}' + def view_insight_queue(self): + return f'{self.host}{self.view_insight_queue_params}' + + def view_issue_with_object(self): + return f'{self.host}{self.view_issue_with_insight_object_params}' + + def view_insight_all_schemas(self): + return f'{self.host}{self.view_insight_all_schemas_params}' + + def insight_search_by_iql(self): + return f'{self.host}{self.insight_search_by_iql_params}' -class LoginPageLocators: +class LoginPageLocators: login_url = UrlManager().login_url() # First time login setup page @@ -67,32 +86,27 @@ class LoginPageLocators: class DashboardLocators: - dashboard_url = UrlManager().dashboard_url() dashboard_params = UrlManager().dashboard_params dashboard_window = (By.CLASS_NAME, "page-type-dashboard") class LogoutLocators: - logout_url = UrlManager().logout_url() logout_submit_button = (By.ID, "confirm-logout-submit") login_button_link = (By.CLASS_NAME, "login-link") class BrowseProjectsLocators: - brows_projects_url = UrlManager().browse_all_projects_url() page_title = (By.XPATH, "//h1[contains(text(),'Browse projects')]") class BrowseCustomersLocators: - page_title = (By.XPATH, "//h2[contains(text(),'Customers')]") class ViewCustomerRequestLocators: - bread_crumbs = (By.CSS_SELECTOR, ".aui-nav.aui-nav-breadcrumbs") comment_collapsed_textarea = (By.ID, "sd-comment-collapsed-textarea") @@ -103,7 +117,6 @@ class ViewCustomerRequestLocators: class ViewReportsLocators: - # locators to click workload = (By.XPATH, "//span[contains(text(),'Workload')]") time_to_resolution = (By.XPATH, "//span[contains(text(),'Time to resolution')]") @@ -116,7 +129,57 @@ class ViewReportsLocators: class ViewQueueLocators: - queues = (By.CSS_SELECTOR, "#pinnednav-opts-sd-queues-nav li") queues_status = (By.XPATH, "//span[contains(text(),'Status')]") queue_is_empty = (By.CSS_SELECTOR, '.sd-queue-empty') + + +class InsightNewSchemaLocators: + submit_dialog_window = (By.CSS_SELECTOR, '#dialog-submit-button') + create_object_schemas = (By.XPATH, "//a[contains(text(),'Create Object Schema')]") + new_object_schema = (By.XPATH, "//div[contains(text(),'Create Sample IT Asset Schema')]") + object_schemas_next_button = (By.XPATH, "//button[contains(text(),'Next')]") + object_schemas_name_field = (By.CSS_SELECTOR, "#rlabs-insight-create-name") + object_schemas_key_field = (By.CSS_SELECTOR, "#rlabs-insight-create-key") + object_schemas_create_button = (By.XPATH, "//button[contains(text(),'Create')]") + + @staticmethod + def get_new_object_schema_name_locator(name): + return (By.XPATH, f"//a[contains(text(),'{name}')]") + + +class InsightDeleteSchemaLocators: + delete_window_selector = (By.CSS_SELECTOR, "#rlabs-insight-dialog > div") + submit_delete_button = (By.CSS_SELECTOR, "#rlabs-insight-dialog > div > div.dialog-button-panel > button") + schema_list = (By.ID, "rlabs-manage-main") + + @staticmethod + def new_object_schema_id_locator(schema_id): + return (By.CSS_SELECTOR, f"a[aria-owns='rlabs-actions-{schema_id}") + + @staticmethod + def new_object_schema_delete_button_locator(name): + return (By.ID, f"object-schema-delete-{name}") + + +class InsightNewObjectLocators: + create_object_button = (By.ID, "rlabs-create-object") + object_name_field = (By.CSS_SELECTOR, "input[id^=rlabs-insight-attribute-]") + create_button = (By.XPATH, "//body/div[@id='rlabs-insight-dialog']/div[1]/div[2]/button[1]") + pop_up_after_create_object = (By.XPATH, "//body/div[@id='aui-flag-container']/div[1]/div[1]") + + +class InsightViewQueueLocators: + view_queue_page = (By.XPATH, "//section[@id='sd-page-panel']") + view_queue_insight_column = (By.XPATH, "//span[contains(text(),'Insight')]") + + +class InsightSearchObjectIql: + search_object_text_field = (By.CSS_SELECTOR, "textarea[name='iql']") + search_iql_button = (By.CLASS_NAME, "rIcon-search") + search_iql_success = (By.XPATH, "//thead/tr[1]") + + +class InsightViewIssue: + issue_title = (By.ID, "summary-val") + custom_field_insight = (By.CSS_SELECTOR, '[title="Insight"]') diff --git a/app/selenium_ui/jsm/pages/customer_pages.py b/app/selenium_ui/jsm/pages/customer_pages.py index ad8743cca..c93ecf88c 100644 --- a/app/selenium_ui/jsm/pages/customer_pages.py +++ b/app/selenium_ui/jsm/pages/customer_pages.py @@ -6,7 +6,7 @@ from selenium_ui.base_page import BasePage from selenium_ui.jsm.pages.customer_selectors import UrlManager, LoginPageLocators, TopPanelSelectors, \ - CustomerPortalsSelectors, CustomerPortalSelectors, RequestSelectors, RequestsSelectors + CustomerPortalsSelectors, CustomerPortalSelectors, RequestSelectors, RequestsSelectors, InsightSelectors class Login(BasePage): @@ -162,3 +162,21 @@ def __init__(self, driver, all_requests=False): self.page_url = url_manager.all_requests_url() if all_requests else url_manager.my_requests_url() page_loaded_selector = RequestsSelectors.requests_label + + +class ViewRequestWithInsight(BasePage): + + def __init__(self, driver, portal_id): + BasePage.__init__(self, driver) + url_manager = UrlManager(portal_id=portal_id) + self.page_url = url_manager.portal_url() + + def choose_request_type(self): + self.wait_until_visible(RequestSelectors.list_of_requests_types) + request_types = self.get_elements(CustomerPortalSelectors.request_type) + request_type = request_types[1] + request_type.click() + self.wait_until_visible(CustomerPortalSelectors.create_request_button) + + def check_insight_field(self): + self.wait_until_visible(InsightSelectors.insight_field_icon) diff --git a/app/selenium_ui/jsm/pages/customer_selectors.py b/app/selenium_ui/jsm/pages/customer_selectors.py index 621dc4569..d09273023 100644 --- a/app/selenium_ui/jsm/pages/customer_selectors.py +++ b/app/selenium_ui/jsm/pages/customer_selectors.py @@ -42,14 +42,12 @@ class LoginPageLocators: class TopPanelSelectors: - profile_icon = (By.XPATH, '//a[@href="#dropdown2-header"]') profile_button = (By.CSS_SELECTOR, 'a.js-profile') logout_button = (By.CSS_SELECTOR, 'a.js-logout') class CustomerPortalsSelectors: - welcome_logged_in_page = (By.CSS_SELECTOR, "div.cv-help-center-container") browse_portals_button = (By.CSS_SELECTOR, "button.cv-smart-portal-browse-portals") full_portals_list = OrderedDict({"4.13.0": (By.CSS_SELECTOR, "ul.cv-smart-portal-all-portals-list"), @@ -89,6 +87,11 @@ class RequestSelectors: '#select2-drop>ul.select2-results>li>div>span.user-picker-display-name') share_request_modal_button = (By.XPATH, "//button[contains(text(),'Share')]") + list_of_requests_types = (By.ID, "cv-request-content") + + +class InsightSelectors: + insight_field_icon = (By.CLASS_NAME, "js-rlabs-sd-customfield-object-picker") class RequestsSelectors: diff --git a/app/selenium_ui/jsm_ui_agents.py b/app/selenium_ui/jsm_ui_agents.py index a693a83e2..5810873b2 100644 --- a/app/selenium_ui/jsm_ui_agents.py +++ b/app/selenium_ui/jsm_ui_agents.py @@ -1,6 +1,7 @@ from selenium_ui.jsm import modules_agents import pytest from extension.jsm import extension_ui_agents # noqa F401 +from util.conf import JSM_SETTINGS def is_dataset_small(jsm_datasets): @@ -66,6 +67,52 @@ def test_1_selenium_agent_view_queues_small(jsm_webdriver, jsm_datasets, jsm_scr # def test_1_selenium_agent_custom_action(jsm_webdriver, jsm_datasets, jsm_screen_shots): # extension_ui_agents.app_specific_action(jsm_webdriver, jsm_datasets) +""" +To enable specific tests for Insight below, set 'True' next to `insight` variable (False by default) in `app/jsm.yml` +""" + + +def test_1_selenium_agent_insight_main_page(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_main_page(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_create_new_schema(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_create_new_schema(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_create_new_object(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_create_new_object(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_delete_new_schema(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_delete_new_schema(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_view_queue_with_insight_column(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_view_queue_insight_column(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_search_object_by_iql(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.insight_search_object_by_iql(jsm_webdriver, jsm_datasets) + + +def test_1_selenium_agent_insight_view_issue_with_objects(jsm_webdriver, jsm_datasets, jira_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_agents.view_issue_with_insight_objects(jsm_webdriver, jsm_datasets) + # this action should be the last one def test_2_selenium_agent_z_logout(jsm_webdriver, jsm_datasets, jsm_screen_shots): diff --git a/app/selenium_ui/jsm_ui_customers.py b/app/selenium_ui/jsm_ui_customers.py index 3a48f0407..4e806e496 100644 --- a/app/selenium_ui/jsm_ui_customers.py +++ b/app/selenium_ui/jsm_ui_customers.py @@ -1,5 +1,7 @@ from selenium_ui.jsm import modules_customers from extension.jsm import extension_ui_customers # noqa F401 +from util.conf import JSM_SETTINGS +import pytest # this action should be the first one @@ -36,8 +38,20 @@ def test_1_selenium_customer_add_comment(jsm_webdriver, jsm_datasets, jsm_screen Write your custom selenium scripts in `app/extension/jsm/extension_ui_customers.py`. Refer to `app/selenium_ui/jsm/modules_customers.py` for examples. """ -# def test_1_selenium_customer_custom_action(jsm_webdriver, jsm_datasets, jsm_screen_shots): -# extension_ui_customers.app_specific_action(jsm_webdriver, jsm_datasets) + + +# # def test_1_selenium_customer_custom_action(jsm_webdriver, jsm_datasets, jsm_screen_shots): +# # extension_ui_customers.app_specific_action(jsm_webdriver, jsm_datasets) + +""" +To enable specific test for Insight below, set 'True' next to `insight` variable (False by default) in `app/jsm.yml` +""" + + +def test_0_selenium_customer_insight_view_request(jsm_webdriver, jsm_datasets, jsm_screen_shots): + if not JSM_SETTINGS.insight: + pytest.skip() + modules_customers.view_request_with_insight(jsm_webdriver, jsm_datasets) # this action should be the last one diff --git a/app/util/analytics/analytics.py b/app/util/analytics/analytics.py index c0b161daf..3f93efbf2 100644 --- a/app/util/analytics/analytics.py +++ b/app/util/analytics/analytics.py @@ -1,23 +1,27 @@ import sys -import requests import uuid from datetime import datetime, timezone +import requests +import urllib3 + +from util.analytics.analytics_utils import get_os, convert_to_sec, get_timestamp, get_date, is_all_tests_successful, \ + uniq_user_id, generate_report_summary, get_first_elem, generate_test_actions_by_type, get_crowd_sync_test_results from util.analytics.application_info import ApplicationSelector, BaseApplication, JIRA, CONFLUENCE, BITBUCKET, JSM, \ - CROWD, BAMBOO -from util.analytics.log_reader import BztFileReader, ResultsFileReader, LocustFileReader + CROWD, BAMBOO, INSIGHT from util.analytics.bamboo_post_run_collector import BambooPostRunCollector +from util.analytics.log_reader import BztFileReader, ResultsFileReader, LocustFileReader from util.conf import TOOLKIT_VERSION -from util.analytics.analytics_utils import get_os, convert_to_sec, get_timestamp, get_date, is_all_tests_successful, \ - uniq_user_id, generate_report_summary, get_first_elem, generate_test_actions_by_type, get_crowd_sync_test_results +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) MIN_DEFAULTS = {JIRA: {'test_duration': 2700, 'concurrency': 200}, CONFLUENCE: {'test_duration': 2700, 'concurrency': 200}, BITBUCKET: {'test_duration': 3000, 'concurrency': 20, 'git_operations_per_hour': 14400}, JSM: {'test_duration': 2700, 'customer_concurrency': 150, 'agent_concurrency': 50}, CROWD: {'test_duration': 2700, 'concurrency': 1000}, - BAMBOO: {'test_duration': 2700, 'concurrency': 200, 'parallel_plans_count': 40} + BAMBOO: {'test_duration': 2700, 'concurrency': 200, 'parallel_plans_count': 40}, + INSIGHT: {'test_duration': 2700, 'customer_concurrency': 150, 'agent_concurrency': 50} } CROWD_RPS = {'server': 50, 1: 50, 2: 100, 4: 200} # Crowd requests per second for 1,2,4 nodes. @@ -49,10 +53,15 @@ def __init__(self, application: BaseApplication): self.application_version = application.version self.nodes_count = application.nodes_count self.dataset_information = application.dataset_information - # JSM app type has additional concurrency fields: concurrency_agents, concurrency_customers + # JSM(INSIGHT) app type has additional concurrency fields: concurrency_agents, concurrency_customers + if self.app_type == INSIGHT: + self.concurrency_agents = self.conf.agents_concurrency + self.concurrency_customers = self.conf.customers_concurrency + self.insight = self.conf.insight if self.app_type == JSM: self.concurrency_agents = self.conf.agents_concurrency self.concurrency_customers = self.conf.customers_concurrency + self.insight = self.conf.insight if self.app_type == CROWD: self.crowd_sync_test = get_crowd_sync_test_results(bzt_log) self.ramp_up = application.config.ramp_up @@ -107,6 +116,10 @@ def is_compliant(self): compliant = (self.actual_duration >= MIN_DEFAULTS[self.app_type]['test_duration'] and self.concurrency_customers >= MIN_DEFAULTS[self.app_type]['customer_concurrency'] and self.concurrency_agents >= MIN_DEFAULTS[self.app_type]['agent_concurrency']) + elif self.app_type == INSIGHT: + compliant = (self.actual_duration >= MIN_DEFAULTS[self.app_type]['test_duration'] and + self.concurrency_customers >= MIN_DEFAULTS[self.app_type]['customer_concurrency'] and + self.concurrency_agents >= MIN_DEFAULTS[self.app_type]['agent_concurrency']) elif self.app_type == CROWD: rps_compliant = CROWD_RPS[self.nodes_count] total_actions_compliant = rps_compliant * 3600 @@ -136,6 +149,14 @@ def is_compliant(self): err_msg.append(f"The concurrency_agents = {self.concurrency_agents} is less than " f"required value {MIN_DEFAULTS[JSM]['agent_concurrency']}.") + elif self.app_type == INSIGHT: + if self.concurrency_customers < MIN_DEFAULTS[INSIGHT]['customer_concurrency']: + err_msg.append(f"The concurrency_customers = {self.concurrency_customers} is less than " + f"required value {MIN_DEFAULTS[INSIGHT]['customer_concurrency']}.") + if self.concurrency_agents < MIN_DEFAULTS[JSM]['agent_concurrency']: + err_msg.append(f"The concurrency_agents = {self.concurrency_agents} is less than " + f"required value {MIN_DEFAULTS[INSIGHT]['agent_concurrency']}.") + elif self.app_type == BAMBOO: if self.actual_duration < MIN_DEFAULTS[self.app_type]['test_duration']: err_msg.append(f"The actual test duration {self.actual_duration} is less than " diff --git a/app/util/analytics/analytics_utils.py b/app/util/analytics/analytics_utils.py index e6998ca6e..1ee9d40e9 100644 --- a/app/util/analytics/analytics_utils.py +++ b/app/util/analytics/analytics_utils.py @@ -7,7 +7,7 @@ from datetime import datetime, timezone from util.common_util import get_current_version, get_latest_version -from util.analytics.application_info import BITBUCKET, BAMBOO, CROWD +from util.analytics.application_info import BITBUCKET, BAMBOO, CROWD, INSIGHT, JSM latest_version = get_latest_version() current_version = get_current_version() @@ -95,6 +95,14 @@ def generate_report_summary(collector): summary_report.append(f'Success|{success}') summary_report.append(f'Has app-specific actions|{bool(collector.app_specific_rates)}') + if collector.app_type == JSM: + insight = collector.insight + summary_report.append(f'Insight|{insight}') + + if collector.app_type == INSIGHT: + insight = collector.insight + summary_report.append(f'Insight|{insight}') + if collector.app_type == BAMBOO: summary_report.append(f'Number of plans with unexpected status|' f'{collector.post_run_collector.unexpected_status_plan_count}') diff --git a/app/util/analytics/application_info.py b/app/util/analytics/application_info.py index 941449497..1cd6ca06a 100644 --- a/app/util/analytics/application_info.py +++ b/app/util/analytics/application_info.py @@ -14,6 +14,7 @@ JSM = 'jsm' CROWD = 'crowd' BAMBOO = 'bamboo' +INSIGHT = 'insight' DEFAULT_ACTIONS = 'util/default_test_actions.json' @@ -180,15 +181,19 @@ def dataset_information(self): return f"{self.__build_plans_count()} build plans" +class Insight(Jsm): + type = INSIGHT + + class ApplicationSelector: APP_TYPE_MSG = ('ERROR: Please run util/analytics.py with application type as argument. ' - f'E.g. python util/analytics.py {JIRA}/{CONFLUENCE}/{BITBUCKET}/{JSM}/{BAMBOO}') + f'E.g. python util/analytics.py {JIRA}/{CONFLUENCE}/{BITBUCKET}/{JSM}/{BAMBOO}/{INSIGHT}') def __init__(self, app_name): self.application_type = self.__get_application_type(app_name) def __get_application_type(self, app_name): - if app_name.lower() not in [JIRA, CONFLUENCE, BITBUCKET, JSM, CROWD, BAMBOO]: + if app_name.lower() not in [JIRA, CONFLUENCE, BITBUCKET, JSM, CROWD, BAMBOO, INSIGHT]: raise SystemExit(self.APP_TYPE_MSG) return app_name.lower() @@ -201,7 +206,10 @@ def application(self): if self.application_type == BITBUCKET: return Bitbucket(api_client=BitbucketRestClient, config_yml=BITBUCKET_SETTINGS) if self.application_type == JSM: - return Jsm(api_client=JiraRestClient, config_yml=JSM_SETTINGS) + if JSM_SETTINGS.insight: + return Insight(api_client=JiraRestClient, config_yml=JSM_SETTINGS) + else: + return Jsm(api_client=JiraRestClient, config_yml=JSM_SETTINGS) if self.application_type == CROWD: return Crowd(api_client=CrowdRestClient, config_yml=CROWD_SETTINGS) if self.application_type == BAMBOO: diff --git a/app/util/api/confluence_clients.py b/app/util/api/confluence_clients.py index aec3a3f9b..61e66a4b2 100644 --- a/app/util/api/confluence_clients.py +++ b/app/util/api/confluence_clients.py @@ -124,6 +124,7 @@ def search(self, cql, cqlcontext=None, expand=None, start=0, limit=500): return search_results_list + @retry() def is_remote_api_enabled(self): api_url = f'{self.host}/rpc/xmlrpc' response = self.get(api_url, error_msg='Confluence Remote API (XML-RPC & SOAP) is disabled. ' diff --git a/app/util/api/jsm_clients.py b/app/util/api/jsm_clients.py index 304d28b3f..106a57f93 100644 --- a/app/util/api/jsm_clients.py +++ b/app/util/api/jsm_clients.py @@ -363,3 +363,11 @@ def get_all_users_in_organization(self, org_id: int, max_count: int = None): if max_count: return results[:max_count] return results + + def get_all_schemas(self): + objectschemas = [] + api_url = self.host + "/rest/insight/1.0/objectschema/list?" + r = self.get(api_url, + f"Could not get objectSchemas id").json() + objectschemas.extend(r['objectschemas']) + return objectschemas diff --git a/app/util/bamboo/bamboo_dataset_generator/pom.xml b/app/util/bamboo/bamboo_dataset_generator/pom.xml index b5bb31688..5242c2fcd 100644 --- a/app/util/bamboo/bamboo_dataset_generator/pom.xml +++ b/app/util/bamboo/bamboo_dataset_generator/pom.xml @@ -5,7 +5,7 @@ com.atlassian.bamboo bamboo-specs-parent - 8.1.1 + 8.1.3 diff --git a/app/util/bamboo/dcapt_bamboo.tfvars b/app/util/bamboo/dcapt_bamboo.tfvars index 7b058f85d..a47656aa5 100644 --- a/app/util/bamboo/dcapt_bamboo.tfvars +++ b/app/util/bamboo/dcapt_bamboo.tfvars @@ -55,8 +55,8 @@ db_allocated_storage = 100 db_iops = 1000 # Helm chart version of Bamboo and Bamboo agent instances -bamboo_helm_chart_version = "1.0.0" -bamboo_agent_helm_chart_version = "1.0.0" +bamboo_helm_chart_version = "1.3.0" +bamboo_agent_helm_chart_version = "1.3.0" # Bamboo instance resource configuration bamboo_cpu = "4" diff --git a/app/util/bitbucket/populate_db.sh b/app/util/bitbucket/populate_db.sh index f510bf1be..d3ae67ec8 100644 --- a/app/util/bitbucket/populate_db.sh +++ b/app/util/bitbucket/populate_db.sh @@ -39,7 +39,7 @@ BITBUCKET_DB_PASS="Password1!" BITBUCKET_AUTO_DECLINE_VERSION="7.7.0" # BITBUCKET version variables -SUPPORTED_BITBUCKET_VERSIONS=(7.6.13 7.17.5) +SUPPORTED_BITBUCKET_VERSIONS=(7.6.14 7.17.6) BITBUCKET_VERSION=$(sudo su bitbucket -c "cat ${BITBUCKET_VERSION_FILE}") if [[ -z "$BITBUCKET_VERSION" ]]; then echo The $BITBUCKET_VERSION_FILE file does not exists or emtpy. Please check if BITBUCKET_VERSION_FILE variable \ @@ -134,7 +134,7 @@ else fi echo "Current PostgreSQL version is $(psql -V)" -echo "Step2: Get DB Host and check DB connection" +echo "Step2: Get DB Host, check DB connection and permissions" DB_HOST=$(sudo su -c "cat ${DB_CONFIG} | grep 'jdbc:postgresql' | cut -d'/' -f3 | cut -d':' -f1") if [[ -z ${DB_HOST} ]]; then echo "DataBase URL was not found in ${DB_CONFIG}" @@ -142,6 +142,15 @@ if [[ -z ${DB_HOST} ]]; then fi echo "DB_HOST=${DB_HOST}" +echo "Check database permissions for user ${BITBUCKET_DB_USER}" +PGPASSWORD=${BITBUCKET_DB_PASS} createdb -U ${BITBUCKET_DB_USER} -h ${DB_HOST} -T template0 -E "UNICODE" -l "C" TEST +if [[ $? -ne 0 ]]; then + echo "User ${BITBUCKET_DB_USER} doesn't have permission to create database." + exit 1 +else + PGPASSWORD=${BITBUCKET_DB_PASS} dropdb -U ${BITBUCKET_DB_USER} -h ${DB_HOST} TEST +fi + PGPASSWORD=${BITBUCKET_DB_PASS} pg_isready -U ${BITBUCKET_DB_USER} -h ${DB_HOST} if [[ $? -ne 0 ]]; then echo "Connection to DB failed. Please check correctness of following variables:" diff --git a/app/util/bitbucket/upload_attachments.sh b/app/util/bitbucket/upload_attachments.sh index 5733e50f0..75441ed5a 100644 --- a/app/util/bitbucket/upload_attachments.sh +++ b/app/util/bitbucket/upload_attachments.sh @@ -22,7 +22,7 @@ esac; shift; done ################### Variables section ################### # Bitbucket version variables BITBUCKET_VERSION_FILE="/media/atl/bitbucket/shared/bitbucket.version" -SUPPORTED_BITBUCKET_VERSIONS=(7.6.13 7.17.5) +SUPPORTED_BITBUCKET_VERSIONS=(7.6.14 7.17.6) BITBUCKET_VERSION=$(sudo su bitbucket -c "cat ${BITBUCKET_VERSION_FILE}") if [[ -z "$BITBUCKET_VERSION" ]]; then echo The $BITBUCKET_VERSION_FILE file does not exists or emtpy. Please check if BITBUCKET_VERSION_FILE variable \ diff --git a/app/util/conf.py b/app/util/conf.py index 990715cb6..e6d64acd0 100644 --- a/app/util/conf.py +++ b/app/util/conf.py @@ -2,8 +2,8 @@ from util.project_paths import JIRA_YML, CONFLUENCE_YML, BITBUCKET_YML, JSM_YML, CROWD_YML, BAMBOO_YML -TOOLKIT_VERSION = '6.1.0' -UNSUPPORTED_VERSION = '4.1.0' +TOOLKIT_VERSION = '6.2.0' +UNSUPPORTED_VERSION = '4.2.0' def read_yml_file(file): @@ -82,6 +82,7 @@ def __init__(self, config_yml): self.concurrency = self.agents_concurrency + self.customers_concurrency self.custom_dataset_query = self.get_property('custom_dataset_query') or "" self.verbose = self.settings['verbose'] + self.insight = self.get_property('insight') class CrowdSettings(BaseAppSettings): diff --git a/app/util/confluence/index-wait-till-finished.sh b/app/util/confluence/index-wait-till-finished.sh index 36c281e8e..fac3ddb9c 100644 --- a/app/util/confluence/index-wait-till-finished.sh +++ b/app/util/confluence/index-wait-till-finished.sh @@ -18,7 +18,9 @@ echo "Confluence Version: ${CONFLUENCE_VERSION}" if [ "$(sudo su confluence -c "ls -l ""$SEARCH_LOG"" 2>/dev/null | wc -l")" -gt 0 ] then echo "Log files were found:" - sudo su confluence -c "ls $SEARCH_LOG" + # get all logs files as string without newline chars and sorted by last edit time oldest to newest + LOG_FILE_NAMES=$(sudo su confluence -c "ls -tr $SEARCH_LOG | tr '\n' ' '") + echo "$LOG_FILE_NAMES" else echo "ERROR: There are no log files found like $SEARCH_LOG" echo "Make sure your Confluence version is 7.7.x or higher." @@ -31,7 +33,7 @@ SLEEP_TIME=60 ATTEMPTS=$((TIMEOUT / SLEEP_TIME)) while [ ${COUNTER} -lt ${ATTEMPTS} ];do - grep_result=$(sudo su -c "grep -h -o \"$PROGRESS\" $SEARCH_LOG" 2>/dev/null | tail -1) + grep_result=$(sudo su -c "grep -h -o \"$PROGRESS\" $LOG_FILE_NAMES" 2>/dev/null | tail -1) echo "Status:" echo "$grep_result" if [ -z "$grep_result" ];then diff --git a/app/util/confluence/populate_db.sh b/app/util/confluence/populate_db.sh index a8e938868..f54b8e8a3 100644 --- a/app/util/confluence/populate_db.sh +++ b/app/util/confluence/populate_db.sh @@ -20,7 +20,7 @@ CONFLUENCE_DB_PASS="Password1!" SELECT_CONFLUENCE_SETTING_SQL="select BANDANAVALUE from BANDANA where BANDANACONTEXT = '_GLOBAL' and BANDANAKEY = 'atlassian.confluence.settings';" # Confluence version variables -SUPPORTED_CONFLUENCE_VERSIONS=(7.4.14 7.13.3) +SUPPORTED_CONFLUENCE_VERSIONS=(7.4.16 7.13.5) if [[ ! $(systemctl status confluence) ]]; then echo "The Confluence service was not found on this host." \ @@ -118,7 +118,7 @@ else fi echo "Current PostgreSQL version is $(psql -V)" -echo "Step2: Get DB Host and check DB connection" +echo "Step2: Get DB Host, check DB connection and user permissions" DB_HOST=$(sudo su -c "cat ${DB_CONFIG} | grep 'jdbc:postgresql' | cut -d'/' -f3 | cut -d':' -f1") if [[ -z ${DB_HOST} ]]; then echo "DataBase URL was not found in ${DB_CONFIG}" @@ -137,6 +137,15 @@ if [[ $? -ne 0 ]]; then exit 1 fi +echo "Check database permissions for user ${CONFLUENCE_DB_USER}" +PGPASSWORD=${CONFLUENCE_DB_PASS} createdb -U ${CONFLUENCE_DB_USER} -h ${DB_HOST} -T template0 -E "UNICODE" -l "C" TEST +if [[ $? -ne 0 ]]; then + echo "User ${CONFLUENCE_DB_USER} doesn't have permission to create database." + exit 1 +else + PGPASSWORD=${CONFLUENCE_DB_PASS} dropdb -U ${CONFLUENCE_DB_USER} -h ${DB_HOST} TEST +fi + echo "Step3: Write confluence baseUrl to file" CONFLUENCE_BASE_URL_FILE="base_url" if [[ -s ${CONFLUENCE_BASE_URL_FILE} ]];then diff --git a/app/util/confluence/upload_attachments.sh b/app/util/confluence/upload_attachments.sh index eb9da8b2a..7fadda884 100644 --- a/app/util/confluence/upload_attachments.sh +++ b/app/util/confluence/upload_attachments.sh @@ -4,7 +4,7 @@ ################### Variables section ################### # Confluence version variables CONFLUENCE_VERSION_FILE="/media/atl/confluence/shared-home/confluence.version" -SUPPORTED_CONFLUENCE_VERSIONS=(7.4.14 7.13.3) +SUPPORTED_CONFLUENCE_VERSIONS=(7.4.16 7.13.5) CONFLUENCE_VERSION=$(sudo su confluence -c "cat ${CONFLUENCE_VERSION_FILE}") if [[ -z "$CONFLUENCE_VERSION" ]]; then echo The $CONFLUENCE_VERSION_FILE file does not exists or emtpy. Please check if CONFLUENCE_VERSION_FILE variable \ diff --git a/app/util/crowd/populate_db.sh b/app/util/crowd/populate_db.sh index 0e438e136..119adc905 100644 --- a/app/util/crowd/populate_db.sh +++ b/app/util/crowd/populate_db.sh @@ -84,7 +84,7 @@ else fi echo "Current PostgreSQL version is $(psql -V)" -echo "Step2: Get DB Host and check DB connection" +echo "Step2: Get DB Host, check DB connection and user permissions" DB_HOST=$(sudo su -c "cat ${DB_CONFIG} | grep 'jdbc:postgresql' | cut -d'/' -f3 | cut -d':' -f1") if [[ -z ${DB_HOST} ]]; then echo "DataBase URL was not found in ${DB_CONFIG}" @@ -92,6 +92,15 @@ if [[ -z ${DB_HOST} ]]; then fi echo "DB_HOST=${DB_HOST}" +echo "Check database permissions for user ${CROWD_DB_USER}" +PGPASSWORD=${CROWD_DB_PASS} createdb -U ${CROWD_DB_USER} -h ${DB_HOST} -T template0 -E "UNICODE" -l "C" TEST +if [[ $? -ne 0 ]]; then + echo "User ${CROWD_DB_USER} doesn't have permission to create database." + exit 1 +else + PGPASSWORD=${CROWD_DB_PASS} dropdb -U ${CROWD_DB_USER} -h ${DB_HOST} TEST +fi + echo "Check DB connection" PGPASSWORD=${CROWD_DB_PASS} pg_isready -U ${CROWD_DB_USER} -h ${DB_HOST} if [[ $? -ne 0 ]]; then @@ -192,4 +201,4 @@ echo "DCAPT util script execution is finished successfully." echo # move to a new line echo "Important: new admin user credentials are admin/admin" -echo "Wait a couple of minutes until Crowd is started." \ No newline at end of file +echo "Wait a couple of minutes until Crowd is started." diff --git a/app/util/data_preparation/jsm_prepare_data.py b/app/util/data_preparation/jsm_prepare_data.py index 66de25a42..01bf2b502 100644 --- a/app/util/data_preparation/jsm_prepare_data.py +++ b/app/util/data_preparation/jsm_prepare_data.py @@ -12,7 +12,7 @@ from util.conf import JSM_SETTINGS from util.project_paths import JSM_DATASET_AGENTS, JSM_DATASET_CUSTOMERS, JSM_DATASET_REQUESTS, \ JSM_DATASET_SERVICE_DESKS_L, JSM_DATASET_SERVICE_DESKS_M, JSM_DATASET_SERVICE_DESKS_S, JSM_DATASET_REQUEST_TYPES, \ - JSM_DATASET_CUSTOM_ISSUES + JSM_DATASET_CUSTOM_ISSUES, JSM_DATASET_INSIGHT_ISSUES, JSM_DATASET_INSIGHT_SCHEMAS MAX_WORKERS = None @@ -31,6 +31,8 @@ SERVICE_DESKS_SMALL = "service_desks_small" REQUEST_TYPES = "request_types" CUSTOM_ISSUES = "custom_issues" +INSIGHT_ISSUES = "insight_issues" +INSIGHT_SCHEMAS = "insight_schemas" # Issues to retrieve per project in percentage. E.g. retrieve 35% of issues from first project, 20% from second, etc. # Retrieving 5% of all issues from projects 10-last project. PROJECTS_ISSUES_PERC = {1: 35, 2: 20, 3: 15, 4: 5, 5: 5, 6: 5, 7: 2, 8: 2, 9: 2, 10: 2} @@ -362,6 +364,14 @@ def __get_request_types(jsm_api, service_desks): return [','.join(i) for i in request_types_list] +@print_timing("Preparing Insight Schemas") +def __get_insight_schemas(jsm_api): + insight_schemas = jsm_api.get_all_schemas() + if not insight_schemas: + raise Exception('ERROR: Jira Service Management instance does not have any Insight schemas') + return insight_schemas + + @print_timing("Preparing custom issues") def __get_custom_issues(jira_api, jsm_api, custom_jql): issues = [] @@ -377,11 +387,19 @@ def __get_custom_issues(jira_api, jsm_api, custom_jql): return issues +@print_timing("Preparing Insight issues") +def __get_insight_issues(jira_api): + jql = "Insight is NOT EMPTY" + issues = jira_api.issues_search(jql=jql, max_results=500) + if not issues: + raise Exception('ERROR: Jira Service Management instance does not have any Insight issues') + return issues + + @print_timing("Getting all service desks") def __get_all_service_desks_and_validate(jsm_client): service_desks = jsm_client.get_all_service_desks() if not service_desks: - raise Exception('ERROR: There were no Jira Service Desks found') if len(service_desks) < 2: raise Exception('ERROR: At least 2 service desks are needed') @@ -422,6 +440,11 @@ def __create_data_set(jira_client, jsm_client): jsm_client, jira_client, service_desks) dataset[REQUEST_TYPES] = __get_request_types(jsm_client, service_desks) dataset[CUSTOM_ISSUES] = __get_custom_issues(jira_client, jsm_client, JSM_SETTINGS.custom_dataset_query) + dataset[INSIGHT_ISSUES] = list() + dataset[INSIGHT_SCHEMAS] = list() + if JSM_SETTINGS.insight: + dataset[INSIGHT_ISSUES] = __get_insight_issues(jira_client) + dataset[INSIGHT_SCHEMAS] = __get_insight_schemas(jsm_client) return dataset @@ -439,6 +462,14 @@ def __write_test_data_to_files(datasets): issues = [f"{issue['key']},{issue['id']},{issue['key'].split('-')[0]},{issue['service_desk_id']}" for issue in datasets[CUSTOM_ISSUES]] __write_to_file(JSM_DATASET_CUSTOM_ISSUES, issues) + insight_issues = [f"{insight_issue['key']},{insight_issue['id']},{insight_issue['key'].split('-')[0]}" + for insight_issue + in datasets[INSIGHT_ISSUES]] + __write_to_file(JSM_DATASET_INSIGHT_ISSUES, insight_issues) + schemas_id = [f"{schema_id['id']}" + for schema_id + in datasets[INSIGHT_SCHEMAS]] + __write_to_file(JSM_DATASET_INSIGHT_SCHEMAS, schemas_id) @print_timing('JSM full prepare data', sep='=') diff --git a/app/util/default_test_actions.json b/app/util/default_test_actions.json index 600491a66..52d05b263 100644 --- a/app/util/default_test_actions.json +++ b/app/util/default_test_actions.json @@ -188,6 +188,14 @@ "selenium_agent_view_queues_small_project:random_choice_queue", "selenium_agent_view_queues_small_project", "selenium_customer_add_comment", + "selenium_agent_insight_create_new_object", + "selenium_customer_insight_view_request_with_insight_field", + "selenium_agent_insight_view_queue_with_insight_column", + "selenium_agent_insight_delete_new_schema", + "selenium_agent_insight_search_object_by_iql", + "selenium_agent_insight_view_main_page", + "selenium_agent_insight_view_issue_with_objects", + "selenium_agent_insight_create_new_schema", "selenium_agent_logout", "selenium_customer_log_out" ], @@ -221,7 +229,16 @@ "jmeter_customer_share_request_with_customer:remove_customer", "jmeter_customer_share_request_with_org:search_org", "jmeter_customer_share_request_with_org:add_org", - "jmeter_customer_share_request_with_org:remove_org" + "jmeter_customer_share_request_with_org:remove_org", + "jmeter_customer_insight_view_request_with_insight_field", + "jmeter_agent_insight_search_object_by_iql", + "jmeter_agent_insight_create_schema:create_schema", + "jmeter_agent_insight_view_queue_insight_column", + "jmeter_agent_insight_view_issue_with_objects", + "jmeter_agent_insight_delete_schema", + "jmeter_agent_insight_create_schema:open_field", + "jmeter_agent_insight_create_object", + "jmeter_agent_insight_main_page" ], "locust": [ "locust_agent_login_and_view_dashboard", @@ -255,6 +272,94 @@ "locust_customer_share_request_with_org:add_org", "locust_customer_share_request_with_org:remove_org" ] + }, + "insight": { + "selenium": [ + "selenium_customer_login:open_login_page", + "selenium_agent_login:open_login_page", + "selenium_customer_login:login_and_view_portal", + "selenium_customer_login", + "selenium_customer_create_request:browse_all_portals", + "selenium_agent_login:login_and_view_dashboard", + "selenium_agent_login", + "selenium_agent_browse_projects", + "selenium_customer_create_request:view_portal", + "selenium_customer_create_request:choose_request_type", + "selenium_agent_view_customers", + "selenium_customer_create_request:create_and_submit_request", + "selenium_customer_create_request", + "selenium_agent_view_request", + "selenium_customer_view_request", + "selenium_agent_view_report_workload_medium", + "selenium_customer_view_requests", + "selenium_agent_view_report_created_vs_resolved_medium", + "selenium_customer_view_all_requests", + "selenium_agent_view_report_workload_small", + "selenium_agent_view_report_created_vs_resolved_small", + "selenium_agent_add_comment:add comment", + "selenium_agent_add_comment", + "selenium_customer_share_request_with_customer:search_for_customer_to_share_with", + "selenium_agent_view_queues_large_project_:all_open_queue", + "selenium_agent_view_queues_large_project:random_choice_queue", + "selenium_agent_view_queues_large_project", + "selenium_customer_share_request:share_request_with_customer", + "selenium_customer_share_request_with_customer", + "selenium_agent_view_queues_small_project_:all_open_queue", + "selenium_agent_view_queues_small_project:random_choice_queue", + "selenium_agent_view_queues_small_project", + "selenium_customer_add_comment", + "selenium_agent_insight_create_new_object", + "selenium_customer_insight_view_request_with_insight_field", + "selenium_agent_insight_view_queue_with_insight_column", + "selenium_agent_insight_delete_new_schema", + "selenium_agent_insight_search_object_by_iql", + "selenium_agent_insight_view_main_page", + "selenium_agent_insight_view_issue_with_objects", + "selenium_agent_insight_create_new_schema", + "selenium_agent_logout", + "selenium_customer_log_out"], + "jmeter": [ + "jmeter_agent_login_and_view_dashboard", + "jmeter_agent_view_request", + "jmeter_agent_add_comment:open_request_comment", + "jmeter_agent_add_comment:save_request_comment", + "jmeter_agent_browse_projects", + "jmeter_agent_view_queues_small:all_open_queue", + "jmeter_agent_view_queues_small:random_queue", + "jmeter_agent_view_queues_medium:all_open_queue", + "jmeter_agent_view_queues_medium:random_queue", + "jmeter_agent_view_report_workload_small", + "jmeter_agent_view_report_created_vs_resolved_small", + "jmeter_agent_view_report_created_vs_resolved_medium", + "jmeter_agent_view_report_workload_medium", + "jmeter_agent_view_customers", + "jmeter_customer_login_and_view_portals", + "jmeter_customer_view_requests:my_requests", + "jmeter_customer_view_requests:all_requests", + "jmeter_customer_view_requests:with_filter_requests", + "jmeter_customer_add_comment", + "jmeter_customer_view_request", + "jmeter_customer_create_request:open_create_request_view", + "jmeter_customer_create_request:create_request", + "jmeter_customer_create_request:view_request_after_creation", + "jmeter_customer_view_portal", + "jmeter_customer_share_request_with_customer:search_customer", + "jmeter_customer_share_request_with_customer:add_customer", + "jmeter_customer_share_request_with_customer:remove_customer", + "jmeter_customer_share_request_with_org:search_org", + "jmeter_customer_share_request_with_org:add_org", + "jmeter_customer_share_request_with_org:remove_org", + "jmeter_customer_insight_view_request_with_insight_field", + "jmeter_agent_insight_search_object_by_iql", + "jmeter_agent_insight_create_schema:create_schema", + "jmeter_agent_insight_view_queue_insight_column", + "jmeter_agent_insight_view_issue_with_objects", + "jmeter_agent_insight_delete_schema", + "jmeter_agent_insight_create_schema:open_field", + "jmeter_agent_insight_create_object", + "jmeter_agent_insight_main_page" + ], + "locust": [] }, "crowd": { "jmeter": [ diff --git a/app/util/jira/populate_db.sh b/app/util/jira/populate_db.sh index dee3c8098..5f08d2745 100644 --- a/app/util/jira/populate_db.sh +++ b/app/util/jira/populate_db.sh @@ -47,8 +47,8 @@ JIRA_DB_PASS="Password1!" # Jira/JSM supported versions -SUPPORTED_JIRA_VERSIONS=(8.13.16 8.20.4) -SUPPORTED_JSM_VERSIONS=(4.13.16 4.20.4) +SUPPORTED_JIRA_VERSIONS=(8.13.20 8.20.8) +SUPPORTED_JSM_VERSIONS=(4.13.20 4.20.8) SUPPORTED_VERSIONS=("${SUPPORTED_JIRA_VERSIONS[@]}") @@ -165,7 +165,7 @@ else fi echo "Current PostgreSQL version is $(psql -V)" -echo "Step2: Get DB Host and check DB connection" +echo "Step2: Get DB Host, check DB connection and user permissions" DB_HOST=$(sudo su -c "cat ${DB_CONFIG} | grep 'jdbc:postgresql' | cut -d'/' -f3 | cut -d':' -f1") if [[ -z ${DB_HOST} ]]; then echo "DataBase URL was not found in ${DB_CONFIG}" @@ -184,6 +184,15 @@ if [[ $? -ne 0 ]]; then exit 1 fi +echo "Check database permissions for user ${JIRA_DB_USER}" +PGPASSWORD=${JIRA_DB_PASS} createdb -U ${JIRA_DB_USER} -h ${DB_HOST} -T template0 -E "UNICODE" -l "C" TEST +if [[ $? -ne 0 ]]; then + echo "User ${JIRA_DB_USER} doesn't have permission to create database." + exit 1 +else + PGPASSWORD=${JIRA_DB_PASS} dropdb -U ${JIRA_DB_USER} -h ${DB_HOST} TEST +fi + echo "Step3: Write jira.baseurl property to file" JIRA_BASE_URL_FILE="base_url" if [[ -s ${JIRA_BASE_URL_FILE} ]]; then @@ -352,4 +361,4 @@ echo "DCAPT util script execution is finished successfully." echo # move to a new line echo "Important: new admin user credentials are admin/admin" -echo "Wait a couple of minutes until Jira is started." \ No newline at end of file +echo "Wait a couple of minutes until Jira is started." diff --git a/app/util/jira/upload_attachments.sh b/app/util/jira/upload_attachments.sh index 05a3c20f3..801d93059 100644 --- a/app/util/jira/upload_attachments.sh +++ b/app/util/jira/upload_attachments.sh @@ -30,8 +30,8 @@ JIRA_VERSION_FILE="/media/atl/jira/shared/jira-software.version" # Jira/JSM supported versions -SUPPORTED_JIRA_VERSIONS=(8.13.16 8.20.4) -SUPPORTED_JSM_VERSIONS=(4.13.16 4.20.4) +SUPPORTED_JIRA_VERSIONS=(8.13.20 8.20.8) +SUPPORTED_JSM_VERSIONS=(4.13.20 4.20.8) SUPPORTED_VERSIONS=("${SUPPORTED_JIRA_VERSIONS[@]}") diff --git a/app/util/jtl_convertor/jtls-to-csv.py b/app/util/jtl_convertor/jtls-to-csv.py index 92405825f..17d6299ff 100644 --- a/app/util/jtl_convertor/jtls-to-csv.py +++ b/app/util/jtl_convertor/jtls-to-csv.py @@ -117,7 +117,7 @@ def __validate_file_names(file_names: List[str]): file_names_set.add(file_name_without_extension) -def __pathname_pattern_expansion(args: List[str]) -> list[str]: +def __pathname_pattern_expansion(args: List[str]) -> List[str]: file_names: List[str] = [] for arg in args: file_names.extend([os.path.basename(x) for x in glob(str(ENV_TAURUS_ARTIFACT_DIR / arg))]) diff --git a/app/util/project_paths.py b/app/util/project_paths.py index 831ef4774..f977c238e 100644 --- a/app/util/project_paths.py +++ b/app/util/project_paths.py @@ -113,6 +113,8 @@ def __get_default_test_actions(): JSM_DATASET_SERVICE_DESKS_S = __get_jsm_dataset('service_desks_small.csv') JSM_DATASET_REQUEST_TYPES = __get_jsm_dataset('request_types.csv') JSM_DATASET_CUSTOM_ISSUES = __get_jsm_dataset('custom-issues.csv') +JSM_DATASET_INSIGHT_ISSUES = __get_jsm_dataset('insight_issues.csv') +JSM_DATASET_INSIGHT_SCHEMAS = __get_jsm_dataset('insight_schemas.csv') CONFLUENCE_YML = __get_confluence_yml() CONFLUENCE_DATASETS = __get_confluence_datasets() diff --git a/docs/dc-apps-performance-toolkit-user-guide-bamboo.md b/docs/dc-apps-performance-toolkit-user-guide-bamboo.md index a17e907d8..073fb52c2 100644 --- a/docs/dc-apps-performance-toolkit-user-guide-bamboo.md +++ b/docs/dc-apps-performance-toolkit-user-guide-bamboo.md @@ -4,7 +4,7 @@ platform: platform product: marketplace category: devguide subcategory: build -date: "2022-02-01" +date: "2022-05-10" --- # Data Center App Performance Toolkit User Guide For Bamboo @@ -40,7 +40,10 @@ specifically for performance testing during the DC app review process. and [`kubectl`](https://kubernetes.io/docs/tasks/tools/#kubectl) as per [Environment setup guide](https://atlassian-labs.github.io/data-center-terraform/userguide/PREREQUISITES/#environment-setup). 3. Set up [AWS security credentials](https://atlassian-labs.github.io/data-center-terraform/userguide/INSTALLATION/#1-set-up-aws-security-credentials). -4. [Clone the project repo](https://atlassian-labs.github.io/data-center-terraform/userguide/INSTALLATION/#2-clone-the-project-repository). +4. Clone the project repo: + ```bash + git clone -b 1.0.2 https://github.com/atlassian-labs/data-center-terraform.git && cd data-center-terraform + ``` 5. Copy [`dcapt_bamboo.tfvars`](https://raw.githubusercontent.com/atlassian/dc-app-performance-toolkit/master/app/util/bamboo/dcapt_bamboo.tfvars) file to the `data-center-terraform` folder. 6. Set `environment_name`, `region` and `license` variable values in `dcapt_bamboo.tfvars` file. 7. Start the installation (~40min): diff --git a/docs/dc-apps-performance-toolkit-user-guide-bitbucket.md b/docs/dc-apps-performance-toolkit-user-guide-bitbucket.md index e4607be0d..8f57a3202 100644 --- a/docs/dc-apps-performance-toolkit-user-guide-bitbucket.md +++ b/docs/dc-apps-performance-toolkit-user-guide-bitbucket.md @@ -4,7 +4,7 @@ platform: platform product: marketplace category: devguide subcategory: build -date: "2022-02-01" +date: "2022-05-06" --- # Data Center App Performance Toolkit User Guide For Bitbucket @@ -66,10 +66,10 @@ All important parameters are listed and described in this section. For all other **Bitbucket setup** -| Parameter | Recommended value | -| --------- | ----------------- | -| Bitbucket Product | Software | -| Version | The Data Center App Performance Toolkit officially supports `7.6.13`, `7.17.5` ([Long Term Support releases](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Bitbucket Product | Software | +| Version | The Data Center App Performance Toolkit officially supports `7.6.14`, `7.17.6` ([Long Term Support releases](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** @@ -315,9 +315,9 @@ All important parameters are listed and described in this section. For all other **Bitbucket setup** -| Parameter | Recommended Value | -| --------- | ----------------- | -| Version | The Data Center App Performance Toolkit officially supports `7.6.13`, `7.17.5` ([Long Term Support releases](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended Value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Version | The Data Center App Performance Toolkit officially supports `7.6.14`, `7.17.6` ([Long Term Support releases](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** diff --git a/docs/dc-apps-performance-toolkit-user-guide-confluence.md b/docs/dc-apps-performance-toolkit-user-guide-confluence.md index e3c5a4e57..975d0a606 100644 --- a/docs/dc-apps-performance-toolkit-user-guide-confluence.md +++ b/docs/dc-apps-performance-toolkit-user-guide-confluence.md @@ -4,7 +4,7 @@ platform: platform product: marketplace category: devguide subcategory: build -date: "2022-02-01" +date: "2022-05-06" --- # Data Center App Performance Toolkit User Guide For Confluence @@ -63,10 +63,10 @@ All important parameters are listed and described in this section. For all other **Confluence setup** -| Parameter | Recommended value | -| --------- | ----------------- | -| Collaborative editing mode | synchrony-local | -| Confluence Version | The Data Center App Performance Toolkit officially supports `7.13.3` and `7.4.14` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended value | +| --------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Collaborative editing mode | synchrony-local | +| Confluence Version | The Data Center App Performance Toolkit officially supports `7.13.5` and `7.4.16` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** @@ -381,10 +381,10 @@ All important parameters are listed and described in this section. For all other **Confluence setup** -| Parameter | Recommended value | -| --------- | ----------------- | -| Collaborative editing mode | synchrony-local | -| Confluence Version | The Data Center App Performance Toolkit officially supports `7.13.3` and `7.4.14` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended value | +| --------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Collaborative editing mode | synchrony-local | +| Confluence Version | The Data Center App Performance Toolkit officially supports `7.13.5` and `7.4.16` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** diff --git a/docs/dc-apps-performance-toolkit-user-guide-jira.md b/docs/dc-apps-performance-toolkit-user-guide-jira.md index 675532b4a..2f1a999a4 100644 --- a/docs/dc-apps-performance-toolkit-user-guide-jira.md +++ b/docs/dc-apps-performance-toolkit-user-guide-jira.md @@ -4,7 +4,7 @@ platform: platform product: marketplace category: devguide subcategory: build -date: "2022-02-01" +date: "2022-05-06" --- # Data Center App Performance Toolkit User Guide For Jira @@ -63,10 +63,10 @@ All important parameters are listed and described in this section. For all other **Jira setup** -| Parameter | Recommended value | -| --------- | ----------------- | -| Jira Product | Software | -| Version | The Data Center App Performance Toolkit officially supports `8.13.16`, `8.20.4` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Jira Product | Software | +| Version | The Data Center App Performance Toolkit officially supports `8.13.20`, `8.20.8` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** @@ -384,10 +384,10 @@ All important parameters are listed and described in this section. For all other **Jira setup** -| Parameter | Recommended Value | -| --------- | ----------------- | -| Jira Product | Software | -| Version | The Data Center App Performance Toolkit officially supports `8.13.16`, `8.20.4` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended Value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Jira Product | Software | +| Version | The Data Center App Performance Toolkit officially supports `8.13.20`, `8.20.8` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** diff --git a/docs/dc-apps-performance-toolkit-user-guide-jsm.md b/docs/dc-apps-performance-toolkit-user-guide-jsm.md index b54af7a9a..3a9f57e05 100644 --- a/docs/dc-apps-performance-toolkit-user-guide-jsm.md +++ b/docs/dc-apps-performance-toolkit-user-guide-jsm.md @@ -4,11 +4,16 @@ platform: platform product: marketplace category: devguide subcategory: build -date: "2022-02-01" +date: "2022-05-06" --- # Data Center App Performance Toolkit User Guide For Jira Service Management -This document walks you through the process of testing your app on Jira Service Management using the Data Center App Performance Toolkit. These instructions focus on producing the required [performance and scale benchmarks for your Data Center app](/platform/marketplace/dc-apps-performance-and-scale-testing/). +This document walks you through the process of testing your app on Jira Service Management using the Data Center App Performance Toolkit. These instructions focus on producing the required [performance and scale benchmarks for your Data Center app](/platform/marketplace/dc-apps-performance-and-scale-testing/): + +If your application relays or extends the functionality of **Insight** ([What is Insight?](https://confluence.atlassian.com/servicemanagementserver/what-is-insight-1044784313.html)): + +Please, make sure you have enabled Insight-specific tests in the `jsm.yml` file, by setting `True` value next to the `insight` variable. + In this document, we cover the use of the Data Center App Performance Toolkit on two types of environments: @@ -63,10 +68,10 @@ All important parameters are listed and described in this section. For all other **Jira setup** -| Parameter | Recommended value | -| --------- | ----------------- | -| Jira Product | ServiceManagement | -| Version | The Data Center App Performance Toolkit officially supports `4.13.16`, `4.20.4` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Jira Product | ServiceManagement | +| Version | The Data Center App Performance Toolkit officially supports `4.13.20`, `4.20.8` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** @@ -221,7 +226,7 @@ We recommend that you only use this method if you are having problems with the [ ``` bash JSM_VERSION=$(sudo su jira -c "cat /media/atl/jira/shared/jira-servicedesk.version") - sudo su jira -c "wget https://centaurus-datasets.s3.amazonaws.com/jira/${JSM_VERSION}/small/xml_backup.zip -O /media/atl/jira/shared/import/xml_backup.zip" + sudo su jira -c "wget https://centaurus-datasets.s3.amazonaws.com/jsm/${JSM_VERSION}/small/xml_backup.zip -O /media/atl/jira/shared/import/xml_backup.zip" ``` 1. Log in as a user with the **Jira System Administrators** [global permission](https://confluence.atlassian.com/adminjiraserver/managing-global-permissions-938847142.html). 1. Go to **![cog icon](/platform/marketplace/images/cog.png) > System > Restore System.** from the menu. @@ -280,9 +285,9 @@ Make sure **English (United States)** language is selected as a default language {{% /warning %}} 1. Clone [Data Center App Performance Toolkit](https://github.com/atlassian/dc-app-performance-toolkit) locally. -1. Follow the [README.md](https://github.com/atlassian/dc-app-performance-toolkit/blob/master/README.md) instructions to set up toolkit locally. -1. Navigate to `dc-app-performance-toolkit/app` folder. -1. Open the `jsm.yml` file and fill in the following variables: +2. Follow the [README.md](https://github.com/atlassian/dc-app-performance-toolkit/blob/master/README.md) instructions to set up toolkit locally. +3. Navigate to `dc-app-performance-toolkit/app` folder. +4. Open the `jsm.yml` file and fill in the following variables: - `application_hostname`: your_dc_jsm_instance_hostname without protocol. - `application_protocol`: http or https. - `application_port`: for HTTP - 80, for HTTPS - 443, 8080, 2990 or your instance-specific port. @@ -298,14 +303,18 @@ Make sure **English (United States)** language is selected as a default language - `total_actions_per_hour_agents`: `500` - number of total JMeter/Locust actions per hour for agents scenario. - `total_actions_per_hour_customers`: `1500` - number of total JMeter/Locust actions per hour customers scenario. - `WEBDRIVER_VISIBLE`: visibility of Chrome browser during selenium execution (False is by default). + - `insight`: True or False. Default value is False. Set True to enable Insight specific tests. -1. Run bzt. + +5. In case your application relays or extends the functionality of **Insight**. Make sure to set `True` value next to `insight` variable. + +6. Run bzt. ``` bash bzt jsm.yml ``` -1. Review the resulting table in the console log. All JMeter/Locust and Selenium actions should have 95+% success rate. +7. Review the resulting table in the console log. All JMeter/Locust and Selenium actions should have 95+% success rate. In case some actions does not have 95+% success rate refer to the following logs in `dc-app-performance-toolkit/app/results/jsm/YY-MM-DD-hh-mm-ss` folder: - `results_summary.log`: detailed run summary @@ -353,7 +362,6 @@ Next time when you run toolkit, custom dataset issues will be stored to the `dc- #### Example of app-specific Selenium action development with custom dataset You develop an app that adds some additional fields to specific types of Jira Service Management requests. In this case, you should develop Selenium app-specific action: - 1. Create app-specific service desk requests with *AppRequest* anchor in summary: *AppRequest1*, *AppRequest2*, etc. 1. Go to the search page of your Jira Service Management Data Center - `JSM_URL/issues/?jql=` and check if JQL is correct: `summary ~ 'AppRequest*'`. 1. Edit `dc-app-performance-toolkit/app/jsm.yml` configuration file and set `custom_dataset_query: summary ~ 'AppRequest*'`. @@ -363,7 +371,7 @@ So, our test has to open app-specific requests in agent view and measure time to 1. Extend example of app-specific action for customer in `dc-app-performance-toolkit/app/extension/jsm/extension_ui_customers.py`. [Code example.](https://github.com/atlassian/dc-app-performance-toolkit/blob/master/app/extension/jsm/extension_ui_customers.py) So, our test has to open app-specific requests in portal view and measure time to load of this app-specific request. -1. If you need to run `app_speicifc_action` as specific user uncomment `app_specific_user_login` function in [code example](https://github.com/atlassian/dc-app-performance-toolkit/blob/master/app/extension/jsm/extension_ui_agents.py). Note, that in this case `test_1_selenium_custom_action` should follow just before `test_2_selenium_agent_z_logout` or `test_2_selenium_customer_z_log_out` action. +1. If you need to run `app_specific_action` as specific user uncomment `app_specific_user_login` function in [code example](https://github.com/atlassian/dc-app-performance-toolkit/blob/master/app/extension/jsm/extension_ui_agents.py). Note, that in this case `test_1_selenium_custom_action` should follow just before `test_2_selenium_agent_z_logout` or `test_2_selenium_customer_z_log_out` action. 1. In `dc-app-performance-toolkit/app/selenium_ui/jsm_ui_agents.py`, review and uncomment the following block of code to make newly created app-specific actions executed: ``` python # def test_1_selenium_agent_custom_action(jsm_webdriver, jsm_datasets, jsm_screen_shots): @@ -540,10 +548,10 @@ All important parameters are listed and described in this section. For all other **Jira setup** -| Parameter | Recommended Value | -| --------- | ----------------- | -| Jira Product | ServiceManagement | -| Version | The Data Center App Performance Toolkit officially supports `4.13.16`, `4.20.4` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | +| Parameter | Recommended Value | +| --------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Jira Product | ServiceManagement | +| Version | The Data Center App Performance Toolkit officially supports `4.13.20`, `4.20.8` ([Long Term Support release](https://confluence.atlassian.com/enterprise/atlassian-enterprise-releases-948227420.html)) | **Cluster nodes** @@ -636,6 +644,9 @@ Data dimensions and values for an enterprise-scale dataset are listed and descri | Screens | ~3000 | | Users | ~21 000 | | Workflows | ~700 | +| Insight Schemas | ~ 6 | +| Insight Object types | ~ 50 | +| Insight Schema objects | ~ 1 000 000 | {{% note %}} All the datasets use the standard `admin`/`admin` credentials. @@ -729,7 +740,7 @@ We recommend that you only use this method if you are having problems with the [ ``` bash JSM_VERSION=$(sudo su jira -c "cat /media/atl/jira/shared/jira-servicedesk.version") - sudo su jira -c "wget https://centaurus-datasets.s3.amazonaws.com/jira/${JSM_VERSION}/large/xml_backup.zip -O /media/atl/jira/shared/import/xml_backup.zip" + sudo su jira -c "wget https://centaurus-datasets.s3.amazonaws.com/jsm/${JSM_VERSION}/large/xml_backup.zip -O /media/atl/jira/shared/import/xml_backup.zip" ``` 1. Log in as a user with the **Jira System Administrators** [global permission](https://confluence.atlassian.com/adminjiraserver/managing-global-permissions-938847142.html). 1. Go to **![cog icon](/platform/marketplace/images/cog.png) > System > Restore System.** from the menu. @@ -803,7 +814,8 @@ It's recommended to change default password from UI account page for security re For generating performance results suitable for Marketplace approval process use dedicated execution environment. This is a separate AWS EC2 instance to run the toolkit from. Running the toolkit from a dedicated instance but not from a local machine eliminates network fluctuations and guarantees stable CPU and memory performance. 1. Go to GitHub and create a fork of [dc-app-performance-toolkit](https://github.com/atlassian/dc-app-performance-toolkit). -1. Clone the fork locally, then edit the `jsm.yml` configuration file. Set enterprise-scale Jira Service Management Data Center parameters: +2. Clone the fork locally, then edit the `jsm.yml` configuration file. Set enterprise-scale Jira Service Management Data Center parameters +3. In case your application relays or extends the functionality of **Insight**. Make sure to set `True` next to the `insight` variable. {{% warning %}} Do not push to the fork real `application_hostname`, `admin_login` and `admin_password` values for security reasons. @@ -823,8 +835,10 @@ Instead, set those values directly in `.yml` file on execution environment insta concurrency_customers: 150 # number of concurrent virtual customers for jmeter or locust scenario test_duration: 45m ramp-up: 3m # time to spin all concurrent users - total_actions_per_hour_agents: 5000 # number of total JMeter/Locust actions per hour + total_actions_per_hour_agents: 5000 # number of total JMeter/Locust actions per hour total_actions_per_hour_customers: 15000 # number of total JMeter/Locust actions per hour + insight: False # Set True to enable Insight specific tests + ``` 1. Push your changes to the forked repository. diff --git a/requirements.txt b/requirements.txt index e141af029..1fc426459 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,12 @@ -matplotlib==3.5.1 -pandas==1.4.0 -numpy==1.22.1 -scipy==1.7.3 -pytest==6.2.5 -locust==2.6.1 -selenium==3.141.0 -filelock==3.4.2 +matplotlib==3.5.2 +kiwisolver==1.4.2 +pandas==1.4.2 +numpy==1.22.3 +scipy==1.8.0 +pytest==7.1.2 +locust==2.8.6 +selenium==4.1.3 +filelock==3.6.0 packaging==21.3 -prettytable==3.0.0 -bzt==1.16.2 +prettytable==3.2.0 +bzt==1.16.4