You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/05/31 17:04:09 UTC

[ignite-teamcity-bot] branch ignite-11880 updated (c540194 -> 890afaa)

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a change to branch ignite-11880
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git.


    from c540194  IGNITE-11880: Configurable notifications by build parameters/suite IDS & names
     add ce0fbcf  IGNITE-11880:  Configurable tags by build parameters/suite IDS & names (#125)
     new a400234  Merge branch 'master' into ignite-11880
     new 890afaa  IGNITE-11880: Configurable notifications by build parameters/suite IDS & names

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/ignite/ci/analysis/MultBuildRunCtx.java |  2 +-
 .../java/org/apache/ignite/ci/issue/Issue.java     | 16 +++++++++++++-
 .../ignite/ci/tcbot/conf/INotificationChannel.java | 20 ++++++++++++++++-
 .../ignite/ci/tcbot/conf/NotificationChannel.java  | 25 +++++++++++++++++++++-
 .../ignite/ci/tcbot/issue/IIssuesStorage.java      | 12 ++++++++---
 .../ignite/ci/tcbot/issue/IssueDetector.java       | 20 ++++++++++++++---
 .../org/apache/ignite/ci/user/TcHelperUser.java    | 17 +++++++++++++--
 .../apache/ignite/ci/web/model/TcHelperUserUi.java |  2 +-
 .../ci/web/model/current/SuiteCurrentStatus.java   |  4 ++--
 9 files changed, 103 insertions(+), 15 deletions(-)


[ignite-teamcity-bot] 01/02: Merge branch 'master' into ignite-11880

Posted by dp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch ignite-11880
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit a40023451a1f2c1a4cd5b84a3ab726e112b7df81
Merge: c540194 ce0fbcf
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri May 31 14:47:54 2019 +0300

    Merge branch 'master' into ignite-11880



[ignite-teamcity-bot] 02/02: IGNITE-11880: Configurable notifications by build parameters/suite IDS & names

Posted by dp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch ignite-11880
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit 890afaa163dd83f067d3e742447618e8d90bf2c2
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri May 31 20:03:48 2019 +0300

    IGNITE-11880: Configurable notifications by build parameters/suite IDS & names
---
 .../apache/ignite/ci/analysis/MultBuildRunCtx.java |  2 +-
 .../java/org/apache/ignite/ci/issue/Issue.java     | 16 +++++++++++++-
 .../ignite/ci/tcbot/conf/INotificationChannel.java | 20 ++++++++++++++++-
 .../ignite/ci/tcbot/conf/NotificationChannel.java  | 25 +++++++++++++++++++++-
 .../ignite/ci/tcbot/issue/IIssuesStorage.java      | 12 ++++++++---
 .../ignite/ci/tcbot/issue/IssueDetector.java       | 20 ++++++++++++++---
 .../org/apache/ignite/ci/user/TcHelperUser.java    | 17 +++++++++++++--
 .../apache/ignite/ci/web/model/TcHelperUserUi.java |  2 +-
 .../ci/web/model/current/SuiteCurrentStatus.java   |  4 ++--
 9 files changed, 103 insertions(+), 15 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
index da9af4e..db1051f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
@@ -475,7 +475,7 @@ public class MultBuildRunCtx implements ISuiteResults {
         return buildsStream().map(SingleBuildRunCtx::getLogCheckIfFinished).filter(Objects::nonNull);
     }
 
-    public Set<String> tags() {
+    @Nonnull public Set<String> tags() {
         return buildsStream().flatMap(b -> b.tags().stream()).collect(Collectors.toSet());
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
index edddad8..367f055 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Issue.java
@@ -19,10 +19,12 @@ package org.apache.ignite.ci.issue;
 
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import javax.annotation.Nonnull;
 import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.util.TimeUtil;
 import org.jetbrains.annotations.Nullable;
@@ -61,6 +63,9 @@ public class Issue {
     /** Detected timestamp. */
     @Nullable public Long detectedTs;
 
+    /** Set of build tags detected. */
+    public Set<String> buildTags = new TreeSet<>();
+
     public Issue(IssueKey issueKey, IssueType type) {
         this.issueKey = issueKey;
         this.detectedTs = System.currentTimeMillis();
@@ -150,12 +155,21 @@ public class Issue {
     }
 
     public String getDisplayName() {
-        if(displayName==null)
+        if (displayName == null)
             return issueKey.getTestOrBuildName();
 
         return displayName;
     }
 
+    /**
+     * @return Set of build tags detected.
+     */
+    @Nonnull public Set<String> buildTags() {
+        return buildTags == null && buildTags.isEmpty()
+            ? Collections.emptySet()
+            : Collections.unmodifiableSet(buildTags);
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         String tsStart = buildStartTs == null ? null : TimeUtil.timestampToDateTimePrintable(buildStartTs);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java
index ec8e15e..9dc19d8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/INotificationChannel.java
@@ -22,13 +22,31 @@ import javax.annotation.Nullable;
  *
  */
 public interface INotificationChannel {
-    public boolean isSubscribed(String trackedBranchId);
+    /**
+     * @param trackedBranchId Tracked branch id.
+     */
+    public boolean isSubscribedToBranch(String trackedBranchId);
 
+    /**
+     * Checks if server related issue can be used for notification. For users it is determined by credentials.
+     *
+     * @param srvCode Server code.
+     */
     public boolean isServerAllowed(String srvCode);
 
+    /**
+     * @param tag Tag from actual build/issue.
+     */
+    public boolean isSubscribedToTag(@Nullable String tag);
+
     @Nullable
     public String email();
 
     @Nullable
     public String slack();
+
+    /**
+     * @return any tags specified for this channel, filtration should be applied.
+     */
+    public boolean hasTagFilter();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java
index 87f6e8a..a2bc47d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationChannel.java
@@ -19,6 +19,8 @@ package org.apache.ignite.ci.tcbot.conf;
 import com.google.common.base.MoreObjects;
 import java.util.Collection;
 import java.util.HashSet;
+import javax.annotation.Nullable;
+import jdk.internal.joptsimple.internal.Strings;
 
 /**
  *
@@ -33,8 +35,11 @@ public class NotificationChannel implements INotificationChannel {
     /** Subscribed to failures in tracked branches. */
     private Collection<String> subscribed = new HashSet<>();
 
+    /** Subscribed to tags. Empty ot null set means all tags are applicable. */
+    private Collection<String> tagsFilter = new HashSet<>();
+
     /** {@inheritDoc} */
-    @Override public boolean isSubscribed(String trackedBranchId) {
+    @Override public boolean isSubscribedToBranch(String trackedBranchId) {
         return subscribed != null && subscribed.contains(trackedBranchId);
     }
 
@@ -44,6 +49,19 @@ public class NotificationChannel implements INotificationChannel {
     }
 
     /** {@inheritDoc} */
+    @Override public boolean isSubscribedToTag(@Nullable String tag) {
+        if (!hasTagFilter())
+            return true;
+
+        if(Strings.isNullOrEmpty(tag))
+            return true; // nothing to filter, consider subscribed
+
+        tagsFilter.contains(tag);
+
+        return false;
+    }
+
+    /** {@inheritDoc} */
     @Override public String email() {
         return email;
     }
@@ -53,6 +71,11 @@ public class NotificationChannel implements INotificationChannel {
         return slack;
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean hasTagFilter() {
+        return (tagsFilter != null) && !tagsFilter.isEmpty();
+    }
+
     public void slack(String slack) {
         this.slack = slack;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IIssuesStorage.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IIssuesStorage.java
index ccca2df..46a023e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IIssuesStorage.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IIssuesStorage.java
@@ -30,9 +30,15 @@ public interface IIssuesStorage {
      */
     public boolean containsIssueKey(IssueKey issueKey);
 
-    void saveIssue(Issue issue);
+    public void saveIssue(Issue issue);
 
-    Stream<Issue> allIssues();
+    public Stream<Issue> allIssues();
 
-    boolean setNotified(IssueKey key, String addr);
+    /**
+     * Checks and saves address was notified (NotThreadSafe)
+     * @param key issue key.
+     * @param addr Address to register as notified.
+     * @return update successful. This address was not notified before.
+     */
+    public boolean setNotified(IssueKey key, String addr);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
index 9c3a32b..268cd67 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
@@ -25,11 +25,13 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.ci.analysis.SuiteInBranch;
@@ -179,7 +181,13 @@ public class IssueDetector {
 
                 channels.stream()
                     .filter(ch -> ch.isServerAllowed(srvCode))
-                    .filter(ch -> ch.isSubscribed(issue.trackedBranchName))
+                    .filter(ch -> ch.isSubscribedToBranch(issue.trackedBranchName))
+                    .filter(ch -> {
+                        if (ch.hasTagFilter())
+                            return issue.buildTags().stream().anyMatch(ch::isSubscribedToTag);
+
+                        return true;
+                    })
                     .forEach(channel -> {
                         String email = channel.email();
                         String slack = channel.slack();
@@ -263,7 +271,8 @@ public class IssueDetector {
                 final String trackedBranch = res.getTrackedBranch();
 
                 for (TestFailure testFailure : suiteCurrentStatus.testFailures) {
-                    if (registerTestFailIssues(tcIgnited, srvId, normalizeBranch, testFailure, trackedBranch))
+                    if (registerTestFailIssues(tcIgnited, srvId, normalizeBranch, testFailure, trackedBranch,
+                        suiteCurrentStatus.tags))
                         newIssues++;
                 }
 
@@ -343,6 +352,8 @@ public class IssueDetector {
         issue.webUrl = suiteFailure.webToHist;
         issue.buildStartTs = tcIgnited.getBuildStartTs(issueKey.buildId);
 
+        issue.buildTags.addAll(suiteFailure.tags);
+
         locateChanges(tcIgnited, issueKey.buildId, issue);
 
         logger.info("Register new issue for suite fail: " + issue);
@@ -364,7 +375,8 @@ public class IssueDetector {
         String srvId,
         String normalizeBranch,
         TestFailure testFailure,
-        String trackedBranch) {
+        String trackedBranch,
+        @Nonnull Set<String> suiteTags) {
 
         String name = testFailure.name;
         TestInBranch testInBranch = new TestInBranch(name, normalizeBranch);
@@ -419,6 +431,8 @@ public class IssueDetector {
         issue.displayName = testFailure.testName;
         issue.webUrl = testFailure.webUrl;
 
+        issue.buildTags.addAll(suiteTags);
+
         locateChanges(tcIgnited, buildId, issue);
 
         logger.info("Register new issue for test fail: " + issue);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
index 2003dec..5ae99dc 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
@@ -24,15 +24,18 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.tcbot.conf.INotificationChannel;
 import org.apache.ignite.ci.tcmodel.user.User;
 import org.apache.ignite.ci.util.CryptUtil;
-import org.jetbrains.annotations.Nullable;
 
 import static javax.xml.bind.DatatypeConverter.printHexBinary;
 
+/**
+ * TC Bot user. Contains login information and encrypted passwords.
+ */
 @Persisted
 public class TcHelperUser implements IVersionedEntity, INotificationChannel {
     public static final int LATEST_VERSION = 2;
@@ -130,7 +133,7 @@ public class TcHelperUser implements IVersionedEntity, INotificationChannel {
     }
 
     /** {@inheritDoc} */
-    @Override public boolean isSubscribed(String trackedBranchId) {
+    @Override public boolean isSubscribedToBranch(String trackedBranchId) {
         return subscribedToAllFailures != null && subscribedToAllFailures.contains(trackedBranchId);
     }
 
@@ -140,6 +143,16 @@ public class TcHelperUser implements IVersionedEntity, INotificationChannel {
     }
 
     /** {@inheritDoc} */
+    @Override public boolean isSubscribedToTag(@Nullable String tag) {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean hasTagFilter() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
     @Override public String email() {
         return email;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/TcHelperUserUi.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/TcHelperUserUi.java
index ccd341e..b28954d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/TcHelperUserUi.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/TcHelperUserUi.java
@@ -39,7 +39,7 @@ public class TcHelperUserUi {
         fullName = user.fullName;
         email = user.email;
         allTrackedBranches.forEach(
-            branchId -> subscribedAllToBranchFailures.put(branchId, user.isSubscribed(branchId))
+            branchId -> subscribedAllToBranchFailures.put(branchId, user.isSubscribedToBranch(branchId))
         );
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
index 136f71d..9b5b06a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
@@ -126,7 +126,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
      */
     @Nullable public ProblemRef problemRef;
 
-    public Set<String> tags = new HashSet<>();
+    @Nonnull public Set<String> tags = new HashSet<>();
 
     /**
      * Possible blocker comment: filled for PR and builds checks, non null value contains problem explanation
@@ -225,7 +225,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
         runningBuildCount = suite.runningBuildCount();
         queuedBuildCount = suite.queuedBuildCount();
         serverId = tcIgnited.serverId();
-        this.suiteId = suite.suiteId();
+        suiteId = suite.suiteId();
         branchName = branchForLink(suite.branchName());
 
         tags = suite.tags();