You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ak...@apache.org on 2020/05/15 16:48:13 UTC
[incubator-pinot] branch master updated: [TE] Add support for
configuring additional custom fields in Jira Alert (#5386)
This is an automated email from the ASF dual-hosted git repository.
akshayrai09 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push:
new 516a168 [TE] Add support for configuring additional custom fields in Jira Alert (#5386)
516a168 is described below
commit 516a16820d7be247c42ff0385654bcecbbaf560b
Author: Akshay Rai <ak...@linkedin.com>
AuthorDate: Fri May 15 09:48:00 2020 -0700
[TE] Add support for configuring additional custom fields in Jira Alert (#5386)
---
.../dashboard/ThirdEyeDashboardApplication.java | 3 +-
.../alert/StatefulDetectionAlertFilter.java | 4 +-
.../alert/scheme/DetectionJiraAlerter.java | 7 ++-
.../thirdeye/detection/yaml/YamlResource.java | 51 ++++++++++++++++++++--
.../thirdeye/notification/commons/JiraEntity.java | 15 ++++++-
.../notification/commons/ThirdEyeJiraClient.java | 42 ++++++++++++------
.../formatter/channels/JiraContentFormatter.java | 2 +
.../thirdeye/detection/yaml/YamlResourceTest.java | 2 +-
.../commons/TestThirdEyeJiraClient.java | 12 +++--
9 files changed, 110 insertions(+), 28 deletions(-)
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardApplication.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardApplication.java
index 99d8064..1ac0973 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardApplication.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/dashboard/ThirdEyeDashboardApplication.java
@@ -191,7 +191,8 @@ public class ThirdEyeDashboardApplication
DAO_REGISTRY.getDetectionConfigManager(), DAO_REGISTRY.getDetectionAlertConfigManager()));
env.jersey().register(new DetectionResource());
env.jersey().register(new DetectionAlertResource(DAO_REGISTRY.getDetectionAlertConfigManager()));
- env.jersey().register(new YamlResource(config.getDetectionPreviewConfig(), config.getAlertOnboardingPermitPerSecond()));
+ env.jersey().register(new YamlResource(config.getAlerterConfiguration(), config.getDetectionPreviewConfig(),
+ config.getAlertOnboardingPermitPerSecond()));
env.jersey().register(new SqlDataSourceResource());
TimeSeriesLoader timeSeriesLoader = new DefaultTimeSeriesLoader(
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/StatefulDetectionAlertFilter.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/StatefulDetectionAlertFilter.java
index 56c0613..b099677 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/StatefulDetectionAlertFilter.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/StatefulDetectionAlertFilter.java
@@ -48,13 +48,11 @@ public abstract class StatefulDetectionAlertFilter extends DetectionAlertFilter
public static final String PROP_BCC = "bcc";
public static final String PROP_RECIPIENTS = "recipients";
- private static final String PROP_SEND_ONCE = "sendOnce";
-
// Time beyond which we do not want to notify anomalies
private static final long ANOMALY_NOTIFICATION_LOOKBACK_TIME = TimeUnit.DAYS.toMillis(14);
public StatefulDetectionAlertFilter(DataProvider provider, DetectionAlertConfigDTO config, long endTime) {
- super(provider, config, endTime);//prepareStatement.setObject(parameterIndex++, pair.getValue(), info.sqlType);
+ super(provider, config, endTime);
}
protected final Set<MergedAnomalyResultDTO> filter(Map<Long, Long> vectorClocks) {
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/scheme/DetectionJiraAlerter.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/scheme/DetectionJiraAlerter.java
index 70d6fc2..4d2c7bc 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/scheme/DetectionJiraAlerter.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/alert/scheme/DetectionJiraAlerter.java
@@ -63,6 +63,9 @@ import static org.apache.pinot.thirdeye.notification.commons.JiraConfiguration.*
* labels: # optional, default - thirdeye label is always appended
* - test-label-1
* - test-label-2
+ * custom:
+ * test1: value1
+ * test2: value2
*/
@AlertScheme(type = "JIRA")
public class DetectionJiraAlerter extends DetectionAlertScheme {
@@ -92,7 +95,7 @@ public class DetectionJiraAlerter extends DetectionAlertScheme {
}
private void updateJiraAlert(Issue issue, JiraEntity jiraEntity) {
- // Append labels
+ // Append labels - do not remove existing labels
jiraEntity.getLabels().addAll(issue.getLabels());
jiraEntity.setLabels(jiraEntity.getLabels().stream().distinct().collect(Collectors.toList()));
@@ -152,7 +155,7 @@ public class DetectionJiraAlerter extends DetectionAlertScheme {
try {
JiraEntity jiraEntity = buildJiraEntity(result.getKey(), result.getValue());
- // Fetch the most recent reported issue
+ // Fetch the most recent reported issues within mergeGap by jira service account under the project
List<Issue> issues = jiraClient.getIssues(jiraEntity.getJiraProject(), jiraEntity.getLabels(),
this.jiraAdminConfig.getJiraUser(), jiraEntity.getMergeGap());
Optional<Issue> latestJiraIssue = issues.stream().max(
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
index 0d8446d..c8601fe 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/detection/yaml/YamlResource.java
@@ -56,7 +56,10 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.pinot.thirdeye.anomaly.ThirdEyeAnomalyConfiguration;
import org.apache.pinot.thirdeye.anomaly.task.TaskConstants;
+import org.apache.pinot.thirdeye.anomaly.task.TaskContext;
+import org.apache.pinot.thirdeye.anomaly.task.TaskRunner;
import org.apache.pinot.thirdeye.api.Constants;
import org.apache.pinot.thirdeye.auth.ThirdEyePrincipal;
import org.apache.pinot.thirdeye.dashboard.DetectionPreviewConfiguration;
@@ -88,6 +91,8 @@ import org.apache.pinot.thirdeye.detection.DetectionPipeline;
import org.apache.pinot.thirdeye.detection.DetectionPipelineLoader;
import org.apache.pinot.thirdeye.detection.DetectionPipelineResult;
import org.apache.pinot.thirdeye.detection.TaskUtils;
+import org.apache.pinot.thirdeye.detection.alert.DetectionAlertTaskInfo;
+import org.apache.pinot.thirdeye.detection.alert.DetectionAlertTaskRunner;
import org.apache.pinot.thirdeye.detection.cache.builder.AnomaliesCacheBuilder;
import org.apache.pinot.thirdeye.detection.cache.builder.TimeSeriesCacheBuilder;
import org.apache.pinot.thirdeye.detection.onboard.YamlOnboardingTaskInfo;
@@ -148,8 +153,10 @@ public class YamlResource {
private final long previewTimeout;
private final DetectionConfigFormatter detectionConfigFormatter;
private final RateLimiter onboardingRateLimiter;
+ private final Map<String, Map<String, Object>> alerterConfig;
- public YamlResource(DetectionPreviewConfiguration previewConfig, double alertOnboardingPermitPerSecond) {
+ public YamlResource(Map<String, Map<String, Object>> alerterConfig, DetectionPreviewConfiguration previewConfig,
+ double alertOnboardingPermitPerSecond) {
this.detectionConfigDAO = DAORegistry.getInstance().getDetectionConfigManager();
this.subscriptionConfigDAO = DAORegistry.getInstance().getDetectionAlertConfigManager();
this.metricDAO = DAORegistry.getInstance().getMetricConfigDAO();
@@ -162,6 +169,7 @@ public class YamlResource {
this.yaml = new Yaml();
this.executor = Executors.newFixedThreadPool(previewConfig.getParallelism());
this.previewTimeout = previewConfig.getTimeout();
+ this.alerterConfig = alerterConfig;
this.onboardingRateLimiter = RateLimiter.create(alertOnboardingPermitPerSecond);
TimeSeriesLoader timeseriesLoader =
@@ -182,8 +190,8 @@ public class YamlResource {
this.detectionConfigFormatter = new DetectionConfigFormatter(metricDAO, datasetDAO);
}
- public YamlResource(DetectionPreviewConfiguration previewConfig) {
- this(previewConfig, Double.MAX_VALUE);
+ public YamlResource(Map<String, Map<String, Object>> alerterConfig, DetectionPreviewConfiguration previewConfig) {
+ this(alerterConfig, previewConfig, Double.MAX_VALUE);
}
/*
@@ -1107,4 +1115,41 @@ public class YamlResource {
LOG.info("Successfully returned " + yamls.size() + " detection configs.");
return Response.ok(yamls).build();
}
+
+ /**
+ * Api to trigger a notification alert. Mostly used for ad-hoc testing.
+ * Alert will be sent only if there are new anomalies since the last watermark.
+ * Watermarks will be updated after notifying anomalies if any.
+ */
+ @PUT
+ @Path("/notify/{id}")
+ @ApiOperation("Send notification email for detection alert config")
+ public Response triggerNotification(
+ @ApiParam("Subscription configuration id for the alert") @NotNull @PathParam("id") long subscriptionId) {
+ LOG.info("Triggering subscription task with id " + subscriptionId);
+ Map<String, String> responseMessage = new HashMap<>();
+ try {
+ // Build the task context
+ ThirdEyeAnomalyConfiguration config = new ThirdEyeAnomalyConfiguration();
+ config.setAlerterConfiguration(alerterConfig);
+ TaskContext taskContext = new TaskContext();
+ taskContext.setThirdEyeAnomalyConfiguration(config);
+
+ // Run the notification task. This will update the subscription watermark as well.
+ DetectionAlertTaskInfo taskInfo = new DetectionAlertTaskInfo(subscriptionId);
+ TaskRunner taskRunner = new DetectionAlertTaskRunner();
+ taskRunner.execute(taskInfo, taskContext);
+ } catch (Exception e) {
+ LOG.error("Exception while triggering the notification task with id " + subscriptionId, e);
+ responseMessage.put("message", "Failed to trigger the notification");
+ responseMessage.put("more-info", "Triggered subscription id " + subscriptionId + ". Error = " + e.getMessage());
+ return Response.serverError().entity(responseMessage).build();
+ }
+
+ LOG.info("Subscription with id " + subscriptionId + " triggered successfully");
+ responseMessage.put("message", "Subscription was triggered successfully.");
+ responseMessage.put("more-info", "Triggered subscription id " + subscriptionId);
+ responseMessage.put("detectionAlertConfigId", String.valueOf(subscriptionId));
+ return Response.ok().entity(responseMessage).build();
+ }
}
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/JiraEntity.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/JiraEntity.java
index 8863ce6..6bb43ff 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/JiraEntity.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/JiraEntity.java
@@ -21,6 +21,7 @@ package org.apache.pinot.thirdeye.notification.commons;
import java.io.File;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
@@ -38,6 +39,9 @@ public class JiraEntity {
private List<String> labels;
private List<String> components;
+ // Ability to configure non-standard customized jira fields
+ private Map<String, Object> customFieldsMap;
+
// Report new anomalies by reopening jira tickets created within
// the last mergeGap milliseconds
private long mergeGap;
@@ -120,6 +124,14 @@ public class JiraEntity {
this.components = components;
}
+ public Map<String, Object> getCustomFieldsMap() {
+ return customFieldsMap;
+ }
+
+ public void setCustomFieldsMap(Map<String, Object> customFieldsMap) {
+ this.customFieldsMap = customFieldsMap;
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Jira{");
@@ -129,6 +141,7 @@ public class JiraEntity {
sb.append(", summary='").append(summary).append('\'');
sb.append(", labels='").append(labels).append('\'');
sb.append(", components='").append(components).append('\'');
+ sb.append(", custom='").append(customFieldsMap).append('\'');
sb.append(", mergeGap='").append(mergeGap).append('\'');
sb.append(", snapshot='").append(snapshot == null ? "" : snapshot.getName()).append('\'');
sb.append('}');
@@ -137,6 +150,6 @@ public class JiraEntity {
@Override
public int hashCode() {
- return Objects.hash(jiraProject, jiraIssueTypeId, assignee, summary, labels, mergeGap, snapshot, components);
+ return Objects.hash(jiraProject, jiraIssueTypeId, assignee, summary, labels, customFieldsMap, mergeGap, snapshot, components);
}
}
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/ThirdEyeJiraClient.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/ThirdEyeJiraClient.java
index 8ce9097..10e00d0 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/ThirdEyeJiraClient.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/commons/ThirdEyeJiraClient.java
@@ -28,7 +28,7 @@ import com.atlassian.jira.rest.client.api.domain.CimProject;
import com.atlassian.jira.rest.client.api.domain.Comment;
import com.atlassian.jira.rest.client.api.domain.Issue;
import com.atlassian.jira.rest.client.api.domain.Transition;
-import com.atlassian.jira.rest.client.api.domain.input.FieldInput;
+import com.atlassian.jira.rest.client.api.domain.input.ComplexIssueInputFieldValue;
import com.atlassian.jira.rest.client.api.domain.input.IssueInput;
import com.atlassian.jira.rest.client.api.domain.input.IssueInputBuilder;
import com.atlassian.jira.rest.client.api.domain.input.TransitionInput;
@@ -62,6 +62,7 @@ public class ThirdEyeJiraClient {
public static final String PROP_ISSUE_TYPE = "issuetype";
public static final String PROP_PROJECT = "project";
public static final String PROP_ASSIGNEE = "assignee";
+ public static final String PROP_CUSTOM = "custom";
public static final String PROP_MERGE_GAP = "mergeGap";
public static final String PROP_LABELS = "labels";
public static final String PROP_COMPONENTS = "components";
@@ -160,14 +161,11 @@ public class ThirdEyeJiraClient {
* Updates existing issue with assignee and labels
*/
public void updateIssue(Issue issue, JiraEntity jiraEntity) {
- IssueInput issueInput = new IssueInputBuilder()
- .setAssigneeName(jiraEntity.getAssignee())
- .setFieldInput(new FieldInput(PROP_LABELS, jiraEntity.getLabels()))
- .build();
-
- String prevAssignee = issue.getAssignee() == null ? "unassigned" : issue.getAssignee().getName();
- LOG.info("Updating Jira {} with [assignee={}, labels={}]. Previous state [assignee={}, labels={}]", issue.getKey(),
- jiraEntity.getAssignee(), jiraEntity.getLabels(), prevAssignee, issue.getLabels());
+ IssueInputBuilder issueBuilder = new IssueInputBuilder();
+ setJiraAlertUpdatableFields(issueBuilder, jiraEntity);
+ IssueInput issueInput = issueBuilder.build();
+
+ LOG.info("Updating Jira {} with {}", issue.getKey(), issueInput.toString());
restClient.getIssueClient().updateIssue(issue.getKey(), issueInput).claim();
if (jiraEntity.getSnapshot() != null && jiraEntity.getSnapshot().exists()) {
restClient.getIssueClient().addAttachments(issue.getAttachmentsUri(), jiraEntity.getSnapshot()).claim();
@@ -219,6 +217,26 @@ public class ThirdEyeJiraClient {
return basicIssue.getKey();
}
+ /**
+ * Set jira fields which should be updated when a new alert is fired
+ */
+ private void setJiraAlertUpdatableFields(IssueInputBuilder issueBuilder, JiraEntity jiraEntity) {
+ issueBuilder.setAssigneeName(jiraEntity.getAssignee());
+ issueBuilder.setFieldValue(PROP_LABELS, jiraEntity.getLabels());
+
+ if (jiraEntity.getComponents() != null && !jiraEntity.getComponents().isEmpty()) {
+ issueBuilder.setComponentsNames(jiraEntity.getComponents());
+ }
+
+ if (jiraEntity.getCustomFieldsMap() != null) {
+ for (Map.Entry<String, Object> customFieldEntry : jiraEntity.getCustomFieldsMap().entrySet()) {
+ issueBuilder.setFieldValue(
+ customFieldEntry.getKey(),
+ ComplexIssueInputFieldValue.with("name", customFieldEntry.getValue().toString()));
+ }
+ }
+ }
+
IssueInput buildIssue(JiraEntity jiraEntity) {
IssueInputBuilder issueBuilder = new IssueInputBuilder();
@@ -239,13 +257,9 @@ public class ThirdEyeJiraClient {
issueBuilder.setProjectKey(jiraEntity.getJiraProject());
issueBuilder.setSummary(jiraEntity.getSummary());
issueBuilder.setIssueTypeId(jiraEntity.getJiraIssueTypeId());
- issueBuilder.setAssigneeName(jiraEntity.getAssignee());
issueBuilder.setDescription(jiraEntity.getDescription());
- issueBuilder.setFieldInput(new FieldInput(PROP_LABELS, jiraEntity.getLabels()));
- if (jiraEntity.getComponents() != null && !jiraEntity.getComponents().isEmpty()) {
- issueBuilder.setComponentsNames(jiraEntity.getComponents());
- }
+ setJiraAlertUpdatableFields(issueBuilder, jiraEntity);
return issueBuilder.build();
}
diff --git a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/formatter/channels/JiraContentFormatter.java b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/formatter/channels/JiraContentFormatter.java
index 79e89df..88df2bd 100644
--- a/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/formatter/channels/JiraContentFormatter.java
+++ b/thirdeye/thirdeye-pinot/src/main/java/org/apache/pinot/thirdeye/notification/formatter/channels/JiraContentFormatter.java
@@ -171,6 +171,8 @@ public class JiraContentFormatter extends AlertContentFormatter {
jiraEntity.setDescription(buildDescription(jiraTemplate, templateValues));
jiraEntity.setComponents(ConfigUtils.getList(alertClientConfig.get(PROP_COMPONENTS)));
jiraEntity.setSnapshot(buildSnapshot());
+ Map<String, Object> customFieldsMap = ConfigUtils.getMap(alertClientConfig.get(PROP_CUSTOM));
+ jiraEntity.setCustomFieldsMap(customFieldsMap);
return jiraEntity;
}
diff --git a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/yaml/YamlResourceTest.java b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/yaml/YamlResourceTest.java
index 696b061..3bffc18 100644
--- a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/yaml/YamlResourceTest.java
+++ b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/detection/yaml/YamlResourceTest.java
@@ -39,7 +39,7 @@ public class YamlResourceTest {
public void beforeClass() {
testDAOProvider = DAOTestBase.getInstance();
this.user = new ThirdEyePrincipal("test", "test");
- this.yamlResource = new YamlResource(new DetectionPreviewConfiguration());
+ this.yamlResource = new YamlResource(null, new DetectionPreviewConfiguration());
this.daoRegistry = DAORegistry.getInstance();
DetectionConfigManager detectionDAO = this.daoRegistry.getDetectionConfigManager();
DetectionConfigDTO config1 = new DetectionConfigDTO();
diff --git a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/notification/commons/TestThirdEyeJiraClient.java b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/notification/commons/TestThirdEyeJiraClient.java
index 3bdf231..68377d9 100644
--- a/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/notification/commons/TestThirdEyeJiraClient.java
+++ b/thirdeye/thirdeye-pinot/src/test/java/org/apache/pinot/thirdeye/notification/commons/TestThirdEyeJiraClient.java
@@ -27,6 +27,10 @@ public class TestThirdEyeJiraClient {
jiraEntity.setAssignee("test_assignee");
jiraEntity.setLabels(Arrays.asList("test_1", "test_2"));
jiraEntity.setDescription("test_description");
+ Map<String, Object> custom = new HashMap<>();
+ custom.put("test1", "value1");
+ custom.put("test2", "value2");
+ jiraEntity.setCustomFieldsMap(custom);
JiraConfiguration jiraConfig = new JiraConfiguration();
jiraConfig.setJiraHost("host");
@@ -47,14 +51,16 @@ public class TestThirdEyeJiraClient {
// Assert if all the parameters are set
Assert.assertEquals(((ComplexIssueInputFieldValue) issueInput.getField("assignee").getValue())
.getValuesMap().values().toString(), "[test_assignee]");
+ Assert.assertEquals(((ComplexIssueInputFieldValue) issueInput.getField("project").getValue())
+ .getValuesMap().values().toString(), "[test_project]");
Assert.assertEquals(((List) issueInput.getField("labels").getValue()), Arrays.asList("test_1", "test_2"));
Assert.assertEquals(issueInput.getField("summary").getValue(), "test_summary");
Assert.assertEquals(issueInput.getField("description").getValue(), "test_description");
- Assert.assertEquals(((ComplexIssueInputFieldValue) issueInput.getField("project").getValue())
- .getValuesMap().values().toString(), "[test_project]");
+ Assert.assertEquals(issueInput.getField("test1").getValue().toString(), "ComplexIssueInputFieldValue{valuesMap={name=value1}}");
+ Assert.assertEquals(issueInput.getField("test2").getValue().toString(), "ComplexIssueInputFieldValue{valuesMap={name=value2}}");
// Assert if all the required fields are sets
- Assert.assertEquals(issueInput.getFields().size(), 7);
+ Assert.assertEquals(issueInput.getFields().size(), 9);
Assert.assertTrue(issueInput.getFields().keySet().contains("anotherrequiredfield"));
Assert.assertFalse(issueInput.getFields().keySet().contains("notrequiredfield"));
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org