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/04/19 12:22:12 UTC

[ignite-teamcity-bot] branch ignite-11779 updated: IGNITE-11779 Support configurable notifications for non-master branches

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

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


The following commit(s) were added to refs/heads/ignite-11779 by this push:
     new 018c573  IGNITE-11779 Support configurable notifications for non-master branches
018c573 is described below

commit 018c57338737695ac9f48ae9a09db6a04e73caf9
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri Apr 19 15:22:07 2019 +0300

    IGNITE-11779 Support configurable notifications for non-master branches
---
 conf/branches.json                                 | 12 +++--
 .../org/apache/ignite/ci/conf/PasswordEncoder.java | 14 +++--
 .../org/apache/ignite/ci/mail/EmailSender.java     | 33 ++++--------
 ...NotificationsConfig.java => EmailSettings.java} | 48 +++++++----------
 .../ci/tcbot/conf/LocalFilesBasedConfig.java       |  7 +--
 .../ignite/ci/tcbot/conf/NotificationsConfig.java  | 62 ++++++++++++++++------
 .../ignite/ci/tcbot/issue/IssueDetector.java       |  7 ++-
 7 files changed, 99 insertions(+), 84 deletions(-)

diff --git a/conf/branches.json b/conf/branches.json
index e757811..5c0ec1d 100644
--- a/conf/branches.json
+++ b/conf/branches.json
@@ -43,10 +43,14 @@
     }
   ],
   "notifications": {
-
-    /**  */
-    "emailUsername": "ignitetcbot@gmail.com",
-    ""
+    /* Email sending settings, only smtp.gmail.com is now supported. */
+    "email": {
+      /* Username, equal to from: field */
+      "username": "ignitetcbot@gmail.com",
+      /** Email password encoded using Password Encoder.  */
+      //todo specify password
+      "pwd": "",
+    }
   },
   "branches": [
     {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/conf/PasswordEncoder.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/conf/PasswordEncoder.java
index 8cf5f88..9d04779 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/conf/PasswordEncoder.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/conf/PasswordEncoder.java
@@ -95,15 +95,23 @@ public class PasswordEncoder {
         Preconditions.checkState(decode.equals(pass));
     }
 
-    public static void main1(String[] args) {
-        String pass = "mmm";
+    public static void mainEncodeEmailPassword(String[] args) {
+        String pass = "Enter Password Here";
         String encode = encode(pass);
-        System.err.println("Encoded: " + HelperConfig.ENCODED_PASSWORD + "=" + encode);
+        System.err.println("\"notifications\": {\n" +
+            "    \"email\": {\n" +
+            "      \"pwd\": \"" + encode+ "\",\n" +
+            "    }\n" +
+            "  } ");
         String decode = decode(encode);
         Preconditions.checkState(decode.equals(pass));
     }
 
     public static void main(String[] args) {
+        mainEncodeEmailPassword(args);
+    }
+
+    public static void main1(String[] args) {
         encodeJiraTok("ignitetcbot", "21313");
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
index adec91d..f047312 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/mail/EmailSender.java
@@ -29,31 +29,20 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
-import org.apache.ignite.ci.HelperConfig;
-import org.apache.ignite.ci.conf.PasswordEncoder;
+import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
 
 /**
  * Class for sending email with configured credentials.
  */
 public class EmailSender {
-    public static void main(String[] args) {
+    public static boolean sendEmail(String to, String subject, String html, String plainText,
+        NotificationsConfig notifications) {
 
-        // Recipient's email ID needs to be mentioned.
-        String to = "dpavlov.spb@gmail.com";
+        String user = notifications.emailUsernameMandatory();
 
-        String html = "<p>This is actual message</p>";
+        String from = user;
 
-        String subject = "This is the Subject Line!";
-
-        sendEmail(to, subject, html, "This is actual message.");
-    }
-
-    public static void sendEmail(String to, String subject, String html, String plainText) {
-        Properties cfgProps = HelperConfig.loadEmailSettings();
-        String from = HelperConfig.getMandatoryProperty(cfgProps, HelperConfig.USERNAME, HelperConfig.MAIL_PROPS);
-        String enc = HelperConfig.getMandatoryProperty(cfgProps, HelperConfig.ENCODED_PASSWORD, HelperConfig.MAIL_PROPS);
-
-        String pwd = PasswordEncoder.decode(enc);
+        final String pwd = notifications.emailPasswordClearMandatory();
 
         Properties props = new Properties();
         props.put("mail.smtp.host", "smtp.gmail.com");
@@ -62,16 +51,13 @@ public class EmailSender {
         props.put("mail.smtp.auth", "true");
         props.put("mail.smtp.port", "465");
 
-        // Sender's email ID needs to be mentioned
-        // Setup mail getOrCreateCreds
-        // Get the default Session object.
-
         Session ses = Session.getInstance(props,
             new Authenticator() {
                 @Override protected PasswordAuthentication getPasswordAuthentication() {
-                    return new PasswordAuthentication(from, pwd);
+                    return new PasswordAuthentication(user, pwd);
                 }
             });
+
         try {
             // Create a default MimeMessage object.
             MimeMessage msg = new MimeMessage(ses);
@@ -102,9 +88,12 @@ public class EmailSender {
             Transport.send(msg);
 
             System.out.println("Sent message successfully to [" + to + "]...");
+
+            return true;
         }
         catch (MessagingException mex) {
             mex.printStackTrace();
         }
+        return false;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java
similarity index 55%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java
index ae7e7aa..55b028e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/EmailSettings.java
@@ -14,52 +14,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.ignite.ci.tcbot.conf;
 
-import jdk.internal.joptsimple.internal.Strings;
-
-/**
- * Notifications Config
- */
-public class NotificationsConfig {
+public class EmailSettings {
     /** Email to send notifications from. */
-    String emailUsername;
-    /** Email password. */
-    String emailPwd;
-
-    /** Slack auth token. Not encoded using Password encoder */
-    String slackAuthTok;
-
-    public boolean isEmpty() {
-        return Strings.isNullOrEmpty(emailUsername)
-            && Strings.isNullOrEmpty(emailPwd)
-            && Strings.isNullOrEmpty(slackAuthTok);
-    }
+    private String username;
 
-    public String slackAuthToken() {
-        return slackAuthTok;
-    }
+    /** Email password, encoded using Password Encoder. */
+    private String pwd;
 
     /**
      * @return Email to send notifications from.
      */
-    public String emailUsername() {
-        return emailUsername;
+    public String username() {
+        return username;
     }
 
+    /**
+     * @param username New email to send notifications from.
+     */
+    public void username(String username) {
+        this.username = username;
+    }
 
     /**
-     * @return Email password.
+     * @return Email password, encoded using Password Encoder.
      */
-    public String emailPassword() {
-        return emailPwd;
+    public String password() {
+        return pwd;
     }
 
     /**
-     * @param emailPwd New email password.
+     * @param pwd New email password, encoded using Password Encoder.
      */
-    public void emailPassword(String emailPwd) {
-        this.emailPwd = emailPwd;
+    public void password(String pwd) {
+        this.pwd = pwd;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
index 39f0ef2..d20647b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/LocalFilesBasedConfig.java
@@ -76,12 +76,7 @@ public class LocalFilesBasedConfig implements ITcBotConfig {
         if (notifications != null && !notifications.isEmpty())
             return notifications;
 
-        Properties cfgProps = HelperConfig.loadEmailSettings();
-        final String authTok = cfgProps.getProperty(HelperConfig.SLACK_AUTH_TOKEN);
-
-        NotificationsConfig cfg = new NotificationsConfig();
-        cfg.slackAuthTok = authTok;
-        return notifications;
+        return NotificationsConfig.backwardConfig();
     }
 
     /** {@inheritDoc} */
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
index ae7e7aa..cefbe7f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/NotificationsConfig.java
@@ -17,23 +17,43 @@
 
 package org.apache.ignite.ci.tcbot.conf;
 
-import jdk.internal.joptsimple.internal.Strings;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import java.util.Properties;
+import javax.annotation.Nonnull;
+import org.apache.ignite.ci.HelperConfig;
+import org.apache.ignite.ci.conf.PasswordEncoder;
+import org.jetbrains.annotations.NotNull;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
 
 /**
  * Notifications Config
  */
 public class NotificationsConfig {
-    /** Email to send notifications from. */
-    String emailUsername;
-    /** Email password. */
-    String emailPwd;
+    /** Email. */
+    private EmailSettings email = new EmailSettings();
 
     /** Slack auth token. Not encoded using Password encoder */
-    String slackAuthTok;
+    private String slackAuthTok;
+
+    @NotNull public static NotificationsConfig backwardConfig() {
+        Properties cfgProps = HelperConfig.loadEmailSettings();
+
+        NotificationsConfig cfg = new NotificationsConfig();
+
+        cfg.slackAuthTok = cfgProps.getProperty(HelperConfig.SLACK_AUTH_TOKEN);
+
+        cfg.email.username(cfgProps.getProperty(HelperConfig.USERNAME));
+
+        cfg.email.password(cfgProps.getProperty(HelperConfig.ENCODED_PASSWORD));
+
+        return cfg;
+    }
 
     public boolean isEmpty() {
-        return Strings.isNullOrEmpty(emailUsername)
-            && Strings.isNullOrEmpty(emailPwd)
+        return (email == null || Strings.isNullOrEmpty(email.username()))
+            && (email == null || Strings.isNullOrEmpty(email.password()))
             && Strings.isNullOrEmpty(slackAuthTok);
     }
 
@@ -45,21 +65,29 @@ public class NotificationsConfig {
      * @return Email to send notifications from.
      */
     public String emailUsername() {
-        return emailUsername;
+        return email == null ? null : email.username();
     }
 
+    public String emailUsernameMandatory() {
+        String username = emailUsername();
 
-    /**
-     * @return Email password.
-     */
-    public String emailPassword() {
-        return emailPwd;
+        Preconditions.checkState(!isNullOrEmpty(username),
+            "notifications/email/username property should be filled in branches.json");
+
+        return username;
     }
 
+
     /**
-     * @param emailPwd New email password.
+     * @return Email password.
      */
-    public void emailPassword(String emailPwd) {
-        this.emailPwd = emailPwd;
+    @Nonnull
+    public String emailPasswordClearMandatory() {
+        Preconditions.checkNotNull(email,
+            "notifications/email/pwd property should be filled in branches.json");
+        Preconditions.checkState(!isNullOrEmpty(email.password()),
+            "notifications/email/pwd property should be filled in branches.json");
+
+        return PasswordEncoder.decode(email.password());
     }
 }
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 634263d..a3b9610 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
@@ -47,6 +47,7 @@ import org.apache.ignite.ci.mail.EmailSender;
 import org.apache.ignite.ci.mail.SlackSender;
 import org.apache.ignite.ci.tcbot.chain.TrackedBranchChainsProcessor;
 import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.ci.tcbot.conf.NotificationsConfig;
 import org.apache.ignite.ci.tcbot.conf.TcServerConfig;
 import org.apache.ignite.ci.tcbot.user.IUserStorage;
 import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
@@ -191,6 +192,8 @@ public class IssueDetector {
         if (toBeSent.isEmpty())
             return "Noting to notify, " + issuesChecked + " issues checked";
 
+        NotificationsConfig notifications = cfg.notifications();
+
         StringBuilder res = new StringBuilder();
         Collection<Notification> values = toBeSent.values();
         for (Notification next : values) {
@@ -200,7 +203,7 @@ public class IssueDetector {
                 List<String> messages = next.toSlackMarkup();
 
                 for (String msg : messages) {
-                    final boolean snd = SlackSender.sendMessage(slackUser, msg, cfg.notifications());
+                    final boolean snd = SlackSender.sendMessage(slackUser, msg, notifications);
 
                     res.append("Send ").append(slackUser).append(": ").append(snd);
                     if (!snd)
@@ -211,7 +214,7 @@ public class IssueDetector {
                 String builds = next.buildIdToIssue.keySet().toString();
                 String subj = "[MTCGA]: " + next.countIssues() + " new failures in builds " + builds + " needs to be handled";
 
-                EmailSender.sendEmail(next.addr, subj, next.toHtml(), next.toPlainText());
+                EmailSender.sendEmail(next.addr, subj, next.toHtml(), next.toPlainText(), notifications);
                 res.append("Send ").append(next.addr).append(" subject: ").append(subj);
             }
         }