From 48da701ea042baa7723d25b9409eabce8a12d70d Mon Sep 17 00:00:00 2001 From: Angelo Rodriguez Date: Thu, 23 Apr 2020 16:36:37 -0400 Subject: [PATCH 1/4] [INTG-199] Bamboo - CI/CD UX Redesign --- pom.xml | 8 + .../com/overops/plugins/bamboo/TaskType.java | 75 ++++-- .../configuration/TaskConfiguration.java | 4 + .../plugins/bamboo/model/QueryOverOps.java | 38 --- .../plugins/bamboo/ui/ViewOverOpsReport.java | 12 +- .../resources/templates/editTaskConfig.ftl | 4 +- .../resources/templates/viewOverOpsReport.ftl | 244 +----------------- 7 files changed, 78 insertions(+), 307 deletions(-) diff --git a/pom.xml b/pom.xml index 180538f..7e82d62 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 1.8 2.33.0 + 2.32.0 @@ -100,6 +101,13 @@ ${takipi.version} + + com.takipi + report-service + ${report.version} + + + com.atlassian.plugins diff --git a/src/main/java/com/overops/plugins/bamboo/TaskType.java b/src/main/java/com/overops/plugins/bamboo/TaskType.java index 60de0ed..5aabdfe 100644 --- a/src/main/java/com/overops/plugins/bamboo/TaskType.java +++ b/src/main/java/com/overops/plugins/bamboo/TaskType.java @@ -5,7 +5,10 @@ import java.util.HashMap; import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import com.atlassian.bamboo.build.logger.BuildLogger; +import com.atlassian.bamboo.configuration.ConfigurationMap; import com.atlassian.bamboo.process.ProcessService; import com.atlassian.bamboo.task.TaskContext; import com.atlassian.bamboo.task.TaskException; @@ -16,14 +19,16 @@ import com.atlassian.sal.api.pluginsettings.PluginSettings; import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory; import com.overops.plugins.bamboo.configuration.Const; -import com.overops.plugins.bamboo.model.OverOpsReportModel; -import com.overops.plugins.bamboo.model.QueryOverOps; -import com.overops.plugins.bamboo.service.OverOpsService; -import com.overops.plugins.bamboo.service.impl.OverOpsServiceImpl; -import com.overops.plugins.bamboo.service.impl.ReportBuilder; -import com.overops.plugins.bamboo.utils.ReportUtils; + import com.fasterxml.jackson.databind.ObjectMapper; +import com.overops.plugins.bamboo.configuration.Const; +import com.overops.report.service.QualityReportParams; +import com.overops.report.service.ReportService; +import com.overops.report.service.ReportService.Requestor; +import com.overops.report.service.model.QualityReport; +import com.overops.report.service.model.QualityReport.ReportStatus; + import org.jetbrains.annotations.NotNull; @Scanned @@ -32,11 +37,11 @@ public class TaskType implements com.atlassian.bamboo.task.TaskType { @ComponentImport private PluginSettingsFactory pluginSettingsFactory; - private OverOpsService overOpsService; + private ReportService overOpsService; private ObjectMapper objectMapper; public TaskType(PluginSettingsFactory pluginSettingsFactory) { - this.overOpsService = new OverOpsServiceImpl(); + this.overOpsService = new ReportService(); this.objectMapper = new ObjectMapper(); this.pluginSettingsFactory = pluginSettingsFactory; } @@ -49,28 +54,28 @@ public TaskResult execute(@NotNull TaskContext context) throws TaskException { logger.addBuildLogEntry("Generating OverOps Quality Report"); - // get global plugin settings - PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings(); - - Map globalSettings = new HashMap<>(3); - globalSettings.put(Const.GLOBAL_API_URL, (String) pluginSettings.get(Const.GLOBAL_API_URL)); - globalSettings.put(Const.GLOBAL_API_TOKEN, (String) pluginSettings.get(Const.GLOBAL_API_TOKEN)); - globalSettings.put(Const.GLOBAL_ENV_ID, (String) pluginSettings.get(Const.GLOBAL_ENV_ID)); + PluginSettings globalSettings = pluginSettingsFactory.createGlobalSettings(); - QueryOverOps query = QueryOverOps.mapToObject(context.getConfigurationMap(), globalSettings); + String endPoint = (String)globalSettings.get(Const.GLOBAL_API_URL); + String apiKey = (String)globalSettings.get(Const.GLOBAL_API_TOKEN); + + QualityReportParams query = getQualityReportParams(context.getConfigurationMap()); + String envId = query.getServiceId(); + if (StringUtils.isBlank(envId)) { + query.setServiceId((String)globalSettings.get(Const.GLOBAL_ENV_ID)); + } TaskResultBuilder resultBuilder = TaskResultBuilder.newBuilder(context); try { logger.addBuildLogEntry("[" + Utils.getArtifactId() + " v" + Utils.getVersion() + "]"); - ReportBuilder.QualityReport report = overOpsService.perform(query, logger); - OverOpsReportModel overOpsReport = ReportUtils.copyResult(report); + QualityReport reportModel = overOpsService.runQualityReport(endPoint, apiKey, query, Requestor.BAMBOO); - context.getBuildContext().getBuildResult().getCustomBuildData().put("overOpsReport", objectMapper.writeValueAsString(overOpsReport)); + context.getBuildContext().getBuildResult().getCustomBuildData().put("overOpsReport", objectMapper.writeValueAsString(reportModel.getHtmlParts())); context.getBuildContext().getBuildResult().getCustomBuildData().put("isOverOpsStep", "true"); - if (overOpsReport.isMarkedUnstable() && overOpsReport.isUnstable()) { + if (reportModel.getStatusCode() == ReportStatus.FAILED) { return resultBuilder.failed().build(); } else { return resultBuilder.success().build(); @@ -89,4 +94,34 @@ public TaskResult execute(@NotNull TaskContext context) throws TaskException { } } + private QualityReportParams getQualityReportParams(ConfigurationMap params) { + QualityReportParams qrp = new QualityReportParams(); + + qrp.setServiceId((String)params.get(Const.ENV_ID)); + qrp.setApplicationName(params.get(Const.APP_NAME)); + qrp.setDeploymentName(params.get(Const.DEP_NAME)); + + qrp.setRegexFilter(params.get(Const.REGEX_FILTER)); + qrp.setMarkUnstable(Boolean.parseBoolean(params.get(Const.MARK_UNSTABLE))); + qrp.setPrintTopIssues(NumberUtils.toInt(params.get(Const.TOP_ERROR_COUNT), 0)); + + qrp.setNewEvents(Boolean.parseBoolean(params.get(Const.CHECK_NEW_ERRORS))); + qrp.setResurfacedErrors(Boolean.parseBoolean(params.get(Const.CHECK_RESURFACED_ERRORS))); + + qrp.setMaxErrorVolume(NumberUtils.toInt(params.get(Const.MAX_ERROR_VOLUME), 0)); + qrp.setMaxUniqueErrors(NumberUtils.toInt(params.get(Const.MAX_UNIQUE_ERRORS), 0)); + + qrp.setCriticalExceptionTypes(params.getOrDefault(Const.CRITICAL_EXCEPTION_TYPES, "")); + + qrp.setActiveTimespan(params.get(Const.ACTIVE_TIMESPAN)); + qrp.setBaselineTimespan(params.get(Const.BASELINE_TIMESPAN)); + qrp.setMinVolumeThreshold(NumberUtils.toInt(params.get(Const.MIN_VOLUME_THRESHOLD), 0)); + qrp.setMinErrorRateThreshold(NumberUtils.toDouble(params.get(Const.MIN_RATE_THRESHOLD), 0)); + qrp.setRegressionDelta(NumberUtils.toDouble(params.get(Const.REGRESSION_DELTA), 0)); + qrp.setCriticalRegressionDelta(NumberUtils.toDouble(params.get(Const.CRITICAL_REGRESSION_THRESHOLD), 0)); + qrp.setApplySeasonality(Boolean.parseBoolean(params.get(Const.APPLY_SEASONALITY))); + + qrp.setDebug(Boolean.parseBoolean(params.get(Const.DEBUG))); + return qrp; + } } diff --git a/src/main/java/com/overops/plugins/bamboo/configuration/TaskConfiguration.java b/src/main/java/com/overops/plugins/bamboo/configuration/TaskConfiguration.java index b2a488f..a2f7ec1 100644 --- a/src/main/java/com/overops/plugins/bamboo/configuration/TaskConfiguration.java +++ b/src/main/java/com/overops/plugins/bamboo/configuration/TaskConfiguration.java @@ -136,6 +136,10 @@ public void validate(ActionParametersMap params, ErrorCollection errorCollection errorCollection.addError(Const.ENV_ID, "Invalid environment ID"); } + if ((params.getString(Const.APP_NAME).trim().length() == 0) && (params.getString(Const.DEP_NAME).trim().length() == 0)) { + errorCollection.addError(Const.APP_NAME, "Must provide an Application Name, or a Deployment Name, or both."); + } + // validate total errors validNumber(Const.TOP_ERROR_COUNT); validNumber(Const.MAX_ERROR_VOLUME, Const.CHECK_VOLUME_ERRORS); diff --git a/src/main/java/com/overops/plugins/bamboo/model/QueryOverOps.java b/src/main/java/com/overops/plugins/bamboo/model/QueryOverOps.java index 47b46ff..ca4fb88 100644 --- a/src/main/java/com/overops/plugins/bamboo/model/QueryOverOps.java +++ b/src/main/java/com/overops/plugins/bamboo/model/QueryOverOps.java @@ -202,44 +202,6 @@ public void setDebug(boolean debug) { this.debug = debug; } - public static QueryOverOps mapToObject(ConfigurationMap params, Map globalSettings) { - - QueryOverOps queryOverOps = new QueryOverOps(); - - // api info always comes from global settings page - queryOverOps.apiUrl = globalSettings.get(GLOBAL_API_URL); - queryOverOps.apiToken = globalSettings.get(GLOBAL_API_TOKEN); - - // use default env ID from global settings page if missing in the task settings - queryOverOps.envId = (StringUtils.isBlank(params.get(ENV_ID)) ? globalSettings.get(GLOBAL_ENV_ID) : params.get(ENV_ID)); - - queryOverOps.applicationName = params.get(APP_NAME); - queryOverOps.deploymentName = params.get(DEP_NAME); - - queryOverOps.regexFilter = params.get(REGEX_FILTER); - queryOverOps.markUnstable = Boolean.parseBoolean(params.get(MARK_UNSTABLE)); - queryOverOps.topErrorCount = NumberUtils.toInt(params.get(TOP_ERROR_COUNT), 0); - - queryOverOps.newEvents = Boolean.parseBoolean(params.get(CHECK_NEW_ERRORS)); - queryOverOps.resurfacedErrors = Boolean.parseBoolean(params.get(CHECK_RESURFACED_ERRORS)); - - queryOverOps.maxErrorVolume = NumberUtils.toInt(params.get(MAX_ERROR_VOLUME), 0); - queryOverOps.maxUniqueErrors = NumberUtils.toInt(params.get(MAX_UNIQUE_ERRORS), 0); - - queryOverOps.criticalExceptionTypes = params.getOrDefault(CRITICAL_EXCEPTION_TYPES, ""); - - queryOverOps.activeTimespan = params.get(ACTIVE_TIMESPAN); - queryOverOps.baselineTimespan = params.get(BASELINE_TIMESPAN); - queryOverOps.minVolumeThreshold = NumberUtils.toInt(params.get(MIN_VOLUME_THRESHOLD), 0); - queryOverOps.minRateThreshold = NumberUtils.toDouble(params.get(MIN_RATE_THRESHOLD), 0); - queryOverOps.regressionDelta = NumberUtils.toDouble(params.get(REGRESSION_DELTA), 0); - queryOverOps.criticalRegressionThreshold = NumberUtils.toDouble(params.get(CRITICAL_REGRESSION_THRESHOLD), 0); - queryOverOps.applySeasonality = Boolean.parseBoolean(params.get(APPLY_SEASONALITY)); - - queryOverOps.debug = Boolean.parseBoolean(params.get(DEBUG)); - return queryOverOps; - } - @Override public String toString() { return "QueryOverOps{" + diff --git a/src/main/java/com/overops/plugins/bamboo/ui/ViewOverOpsReport.java b/src/main/java/com/overops/plugins/bamboo/ui/ViewOverOpsReport.java index 7604856..cc54ad5 100644 --- a/src/main/java/com/overops/plugins/bamboo/ui/ViewOverOpsReport.java +++ b/src/main/java/com/overops/plugins/bamboo/ui/ViewOverOpsReport.java @@ -6,7 +6,7 @@ import com.atlassian.bamboo.resultsummary.BuildResultsSummary; import com.atlassian.bamboo.resultsummary.BuildResultsSummaryImpl; import com.atlassian.bamboo.resultsummary.ResultsSummary; -import com.overops.plugins.bamboo.model.OverOpsReportModel; +import com.overops.report.service.model.HtmlParts; import com.overops.plugins.bamboo.utils.Util; import org.apache.log4j.Logger; @@ -21,7 +21,7 @@ public class ViewOverOpsReport extends PlanResultsAction { private static final long serialVersionUID = 1L; private static final Logger log = Logger.getLogger(ViewOverOpsReport.class); - private OverOpsReportModel report; + private HtmlParts report; public String execute() throws Exception { String result = super.execute(); @@ -37,7 +37,7 @@ public String execute() throws Exception { for (String key : customBuildData.keySet()) { if (key.startsWith("overOpsReport")) { log.debug("Found report link for master =" + key); - report = Util.stringToObject(customBuildData.get(key), OverOpsReportModel.class); + report = Util.stringToObject(customBuildData.get(key), HtmlParts.class); } } } @@ -49,7 +49,7 @@ public String execute() throws Exception { for (String key : customBuildData.keySet()) { if (key.startsWith("overOpsReport")) { log.debug("Found report link for master =" + key); - report = Util.stringToObject(customBuildData.get(key), OverOpsReportModel.class); + report = Util.stringToObject(customBuildData.get(key), HtmlParts.class); } } } @@ -57,11 +57,11 @@ public String execute() throws Exception { return result; } - public OverOpsReportModel getReport() { + public HtmlParts getReport() { return report; } - public void setReport(OverOpsReportModel report) { + public void setReport(HtmlParts report) { this.report = report; } } diff --git a/src/main/resources/templates/editTaskConfig.ftl b/src/main/resources/templates/editTaskConfig.ftl index 249b7be..cd116bd 100644 --- a/src/main/resources/templates/editTaskConfig.ftl +++ b/src/main/resources/templates/editTaskConfig.ftl @@ -43,8 +43,8 @@

General settings

[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.envId" name="envId" required="false" description="The OverOps environment identifier (e.g S12345). If blank, the default value is used."/] -[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.applicationName" name="applicationName" required="false" description="(Optional) Application Name as specified in OverOps."/] -[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.deploymentName" name="deploymentName" required="false" description="(Optional) Deployment Name as specified in OverOps. See: Bamboo variables"/] +[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.applicationName" name="applicationName" required="false" description="(Optional) Application Name as specified in OverOps. If blank, a Deplyment Name must be provided."/] +[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.deploymentName" name="deploymentName" required="false" description="(Optional) Deployment Name as specified in OverOps. If blank, an Application Name must be provided. See: Bamboo variables"/]
[@ww.textfield labelKey="com.overops.plugins.bamboo.task.config.regexFilter" name="regexFilter" required="false" description="(Optional) Ignore specific event types when generating the OverOps Reliability report. Event types include: Uncaught Exception, Caught Exception, Swallowed Exception, Logged Error, Logged Warning, Timer. For example: \"type\":\"s*(Logged Error|Logged Warning|Timer)\"" /]
diff --git a/src/main/resources/templates/viewOverOpsReport.ftl b/src/main/resources/templates/viewOverOpsReport.ftl index b853ef5..350a706 100644 --- a/src/main/resources/templates/viewOverOpsReport.ftl +++ b/src/main/resources/templates/viewOverOpsReport.ftl @@ -1,248 +1,10 @@ - + -
-

OverOps Quality Report

- [#if report.markedUnstable ] - [#if report.unstable] -
-

${report.summary}

-
- [#else] -
-

${report.summary}

-
- [/#if] - [/#if] - - [#if !report.markedUnstable ] - [#if report.unstable] -
-

${report.summary}

-
- [#else] -
-

${report.summary}

-
- [/#if] - [/#if] - -
- [#if report.checkNewEvents ] - - [#if report.passedNewErrorGate] - - - -
${report.newErrorSummary}
- - - -
Nothing to report
- [#else] - - ${report.newErrorSummary} - - - - - - - - - [#foreach k in report.newEvents] - - - - - - - [/#foreach] -
EventApplication(s)Introduced byVolume
${k.eventSummary}${k.applications}${k.introducedBy}${k.hits}
- [/#if] - - [/#if] -
- [#if report.checkResurfacedEvents ] - - [#if report.passedResurfacedErrorGate] - - - -
${report.resurfacedErrorSummary}
- - - -
Nothing to report
- [#else] - - ${report.resurfacedErrorSummary} - - - - - - - - - [#foreach k in report.resurfacedEvents] - - - - - - - [/#foreach] -
EventApplication(s)Introduced byVolume
${k.eventSummary}${k.applications}${k.introducedBy}${k.hits}
- [/#if] - - [/#if] -
- [#if report.checkTotalErrors || report.checkUniqueErrors ] - - [#if report.checkTotalErrors ] - [#if report.passedTotalErrorGate] - - - - [#else] - - - - [/#if] - [/#if] - [#if report.checkUniqueErrors ] - [#if report.passedUniqueErrorGate] - - - - [#else] - - - - [/#if] - [/#if] - [#if report.hasTopErrors] -
${report.totalErrorSummary}
${report.totalErrorSummary}
${report.uniqueErrorSummary}
${report.uniqueErrorSummary}
- - - - - - - [#foreach k in report.topEvents] - - - - - - - [/#foreach] -
Top Events Affecting Unique/Total Error GatesApplication(s)Introduced byVolume
${k.eventSummary}${k.applications}${k.introducedBy}${k.hits}
- [#else] - - - - -
Nothing to report
- [/#if] - - [/#if] -
- [#if report.checkCriticalErrors ] - - [#if report.passedCriticalErrorGate] - - - -
${report.criticalErrorSummary}
- - - -
Nothing to report
- [#else] - - ${report.criticalErrorSummary} - - - - - - - - - [#foreach k in report.criticalEvents] - - - - - - - [/#foreach] -
EventApplication(s)Introduced byVolume
${k.eventSummary}${k.applications}${k.introducedBy}${k.hits}
- [/#if] - - [/#if] -
- [#if report.checkRegressedErrors ] - - [#if report.passedRegressedEvents] - - - -
${report.regressionSumarry}
- - - -
Nothing to report
- [#else] - - ${report.regressionSumarry} - - - - - - - - - [#foreach k in report.regressedEvents] - - - - - - - [/#foreach] -
EventApplication(s)Introduced byVolume
${k.eventSummary}${k.applications}${k.introducedBy}${k.hits}
- [/#if] - - [/#if] - -
+${report.html} \ No newline at end of file From 35fd77541284c30ecba01983d547121062a9901b Mon Sep 17 00:00:00 2001 From: Angelo Rodriguez Date: Fri, 24 Apr 2020 11:36:46 -0400 Subject: [PATCH 2/4] [INTG-199] Bamboo - CI/CD UX Redesign --- src/main/resources/templates/viewOverOpsReport.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/viewOverOpsReport.ftl b/src/main/resources/templates/viewOverOpsReport.ftl index 350a706..2475923 100644 --- a/src/main/resources/templates/viewOverOpsReport.ftl +++ b/src/main/resources/templates/viewOverOpsReport.ftl @@ -1,5 +1,5 @@ - + From 66fb194778254f86dca64ab9368f602d0f310f11 Mon Sep 17 00:00:00 2001 From: Angelo Rodriguez Date: Fri, 24 Apr 2020 11:56:24 -0400 Subject: [PATCH 3/4] [INTG-199] Bamboo - CI/CD UX Redesign --- src/main/java/com/overops/plugins/bamboo/TaskType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/overops/plugins/bamboo/TaskType.java b/src/main/java/com/overops/plugins/bamboo/TaskType.java index 5aabdfe..a58ffc2 100644 --- a/src/main/java/com/overops/plugins/bamboo/TaskType.java +++ b/src/main/java/com/overops/plugins/bamboo/TaskType.java @@ -70,7 +70,7 @@ public TaskResult execute(@NotNull TaskContext context) throws TaskException { try { logger.addBuildLogEntry("[" + Utils.getArtifactId() + " v" + Utils.getVersion() + "]"); - QualityReport reportModel = overOpsService.runQualityReport(endPoint, apiKey, query, Requestor.BAMBOO); + QualityReport reportModel = overOpsService.runQualityReport(endPoint, apiKey, query, Requestor.BAMBOO, logger, Boolean.parseBoolean(context.getConfigurationMap().get(Const.DEBUG))); context.getBuildContext().getBuildResult().getCustomBuildData().put("overOpsReport", objectMapper.writeValueAsString(reportModel.getHtmlParts())); context.getBuildContext().getBuildResult().getCustomBuildData().put("isOverOpsStep", "true"); From aee94c82d2e7719d5c74e65a80f45239faa1ae6b Mon Sep 17 00:00:00 2001 From: Angelo Rodriguez Date: Fri, 24 Apr 2020 12:47:29 -0400 Subject: [PATCH 4/4] [INTG-199] Bamboo - CI/CD UX Redesign --- pom.xml | 3 +-- src/main/java/com/overops/plugins/bamboo/TaskType.java | 8 +++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7e82d62..cda87b7 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,6 @@ 1.8 2.33.0 - 2.32.0 @@ -104,7 +103,7 @@ com.takipi report-service - ${report.version} + ${takipi.version} diff --git a/src/main/java/com/overops/plugins/bamboo/TaskType.java b/src/main/java/com/overops/plugins/bamboo/TaskType.java index a58ffc2..0d7b0c1 100644 --- a/src/main/java/com/overops/plugins/bamboo/TaskType.java +++ b/src/main/java/com/overops/plugins/bamboo/TaskType.java @@ -1,10 +1,12 @@ package com.overops.plugins.bamboo; import java.io.PrintWriter; +import java.io.PrintStream; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import com.atlassian.bamboo.build.logger.BuildLogger; @@ -23,6 +25,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.overops.plugins.bamboo.configuration.Const; +import com.overops.plugins.bamboo.service.impl.BambooPrintWriter; import com.overops.report.service.QualityReportParams; import com.overops.report.service.ReportService; import com.overops.report.service.ReportService.Requestor; @@ -70,7 +73,10 @@ public TaskResult execute(@NotNull TaskContext context) throws TaskException { try { logger.addBuildLogEntry("[" + Utils.getArtifactId() + " v" + Utils.getVersion() + "]"); - QualityReport reportModel = overOpsService.runQualityReport(endPoint, apiKey, query, Requestor.BAMBOO, logger, Boolean.parseBoolean(context.getConfigurationMap().get(Const.DEBUG))); + boolean isDebug = Boolean.parseBoolean(context.getConfigurationMap().get(Const.DEBUG)); + PrintStream printStream = isDebug ? new BambooPrintWriter(System.out, logger) : null; + + QualityReport reportModel = overOpsService.runQualityReport(endPoint, apiKey, query, Requestor.BAMBOO, printStream, isDebug); context.getBuildContext().getBuildResult().getCustomBuildData().put("overOpsReport", objectMapper.writeValueAsString(reportModel.getHtmlParts())); context.getBuildContext().getBuildResult().getCustomBuildData().put("isOverOpsStep", "true");