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/08/16 15:38:00 UTC

[ignite-teamcity-bot] branch master updated: Admin user flag, now allows to forcibly resolve ticket from the board.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 75b4188  Admin user flag, now allows to forcibly resolve ticket from the board.
75b4188 is described below

commit 75b418871354ca7ead2e36a23cd78267a1889051
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri Aug 16 18:37:55 2019 +0300

    Admin user flag, now allows to forcibly resolve ticket from the board.
---
 .../org/apache/ignite/ci/runners/ClientTmpHelper.java | 19 ++++++++++++++++++-
 .../ignite/ci/runners/RemoteClientTmpHelper.java      | 19 ++++++++++++++++++-
 .../ignite/ci/web/rest/board/DefectRestService.java   |  8 ++++----
 ignite-tc-helper-web/src/main/webapp/board/index.html |  7 ++++---
 .../java/org/apache/ignite/ci/user/TcHelperUser.java  | 16 ++++++++++++++++
 .../ignite/tcbot/engine/board/BoardService.java       | 19 +++++++++++++------
 .../ignite/tcbot/engine/ui/BoardDefectSummaryUi.java  | 10 ++++++++++
 7 files changed, 83 insertions(+), 15 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/ClientTmpHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/ClientTmpHelper.java
index 0541e80..cf3cbd7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/ClientTmpHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/ClientTmpHelper.java
@@ -20,10 +20,12 @@ package org.apache.ignite.ci.runners;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.db.TcHelperDb;
+import org.apache.ignite.ci.user.TcHelperUser;
 import org.apache.ignite.githubignited.IGitHubConnIgnited;
 import org.apache.ignite.ci.issue.Issue;
 import org.apache.ignite.tcbot.engine.issue.IssuesStorage;
 import org.apache.ignite.jiraignited.JiraTicketDao;
+import org.apache.ignite.tcbot.engine.user.UserAndSessionsStorage;
 
 /**
  * Utility class for local connection to TC helper DB (server) and any manipulations with data needed.
@@ -31,12 +33,27 @@ import org.apache.ignite.jiraignited.JiraTicketDao;
 public class ClientTmpHelper {
     public static void main(String[] args) {
         //select some main option here.
-        mainDropIssHist(args);
+        //mainDropIssHist(args);
+
+        mainSetUserAsAdmin(args);
     }
 
     /**
      * @param args Args.
      */
+    public static void mainSetUserAsAdmin(String[] args) {
+        try (Ignite ignite = TcHelperDb.startClient()) {
+            IgniteCache<String, TcHelperUser> users = ignite.cache(UserAndSessionsStorage.USERS);
+            TcHelperUser user = users.get("dpavlov");
+            user.setAdmin(true);
+            users.put(user.username, user);
+        }
+    }
+
+
+    /**
+     * @param args Args.
+     */
     public static void mainConsistCheck(String[] args) {
         int inconsistent;
         try (Ignite ignite = TcHelperDb.startClient()) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
index 935ca58..d01e3ba 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
@@ -33,6 +33,7 @@ import javax.xml.bind.JAXBException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.issue.Issue;
 import org.apache.ignite.ci.issue.IssueKey;
 import org.apache.ignite.tcbot.engine.issue.IssueType;
@@ -68,12 +69,28 @@ public class RemoteClientTmpHelper {
      * @param args Args.
      */
     public static void main(String[] args) {
-        mainDumpAllUsers(args);
+        mainSetUserAsAdmin(args);
+
+        //mainDumpAllUsers(args);
         // mainExport(args);
         // mainDropInvalidIssues(args);
         System.err.println("Please insert option of main");
     }
 
+
+    /**
+     * @param args Args.
+     */
+    public static void mainSetUserAsAdmin(String[] args) {
+        try (Ignite ignite = tcbotServerConnectedClient()) {
+            IgniteCache<String, TcHelperUser> users = ignite.cache(UserAndSessionsStorage.USERS);
+            TcHelperUser user = users.get("dpavlov");
+            user.setAdmin(true);
+            users.put(user.username, user);
+        }
+    }
+
+
     public static void mainDropInvalidIssues(String[] args) {
         try (Ignite ignite = tcbotServerConnectedClient()) {
             IgniteCache<IssueKey, Issue>  bst = ignite.cache(IssuesStorage.BOT_DETECTED_ISSUES);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/board/DefectRestService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/board/DefectRestService.java
index f30dae8..1fbba74 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/board/DefectRestService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/board/DefectRestService.java
@@ -28,10 +28,10 @@ import org.apache.ignite.ci.user.ITcBotUserCreds;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.tcbot.engine.board.BoardService;
 
-@Path(DefectRestService.BOARD)
+@Path(DefectRestService.DEFECT)
 @Produces(MediaType.APPLICATION_JSON)
 public class DefectRestService {
-    static final String BOARD = "defect";
+    static final String DEFECT = "defect";
 
     /** Servlet Context. */
     @Context
@@ -44,12 +44,12 @@ public class DefectRestService {
 
     @POST
     @Path("resolve")
-    public void resolveDefect(@FormParam("id") Integer defectId) {
+    public void resolveDefect(@FormParam("id") Integer defectId, @FormParam("forceResolve") Boolean forceResolve) {
         ITcBotUserCreds creds = ITcBotUserCreds.get(req);
 
         CtxListener.getInjector(ctx)
                 .getInstance(BoardService.class)
-                .resolveDefect(defectId, creds);
+                .resolveDefect(defectId, creds, forceResolve);
     }
 
 }
diff --git a/ignite-tc-helper-web/src/main/webapp/board/index.html b/ignite-tc-helper-web/src/main/webapp/board/index.html
index e7da95d..60311fe 100644
--- a/ignite-tc-helper-web/src/main/webapp/board/index.html
+++ b/ignite-tc-helper-web/src/main/webapp/board/index.html
@@ -63,11 +63,11 @@
                 formChanged: function () {
                 },
 
-                onResolve: function (id) {
+                onResolve: function (id, force) {
                     $.ajax({
                         url: "/rest/defect/resolve",
                         type: 'POST',
-                        data: { id: id } ,
+                        data: { id: id, forceResolve: force } ,
                         success: function (res) {
                             window.alert("Resolved defect [" + id + "]");
 
@@ -208,7 +208,8 @@
                         </tr>
                     </table>
 
-                    <button v-if="item.cntFailingIssues === 0" v-on:click="onResolve(item.id)">Resolve</button>
+                    <button v-if="item.cntFailingIssues === 0" v-on:click="onResolve(item.id, false)">Resolve</button>
+                    <button v-if="item.forceResolveAllowed === true" v-on:click="onResolve(item.id, true)" class='disabledbtn'>Force resolve</button>
                 </td>
             </template>
 
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java b/tcbot-engine/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
index 128e65b..2cc6be3 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/ci/user/TcHelperUser.java
@@ -59,6 +59,8 @@ public class TcHelperUser implements IVersionedEntity, INotificationChannel {
 
     public Set<String> additionalEmails = new LinkedHashSet<>();
 
+    private Boolean admin;
+
     /** Subscribed to all failures in following tracked branches. */
     @Nullable private Set<String> subscribedToAllFailures;
 
@@ -198,6 +200,20 @@ public class TcHelperUser implements IVersionedEntity, INotificationChannel {
             || (additionalEmails != null && additionalEmails.contains(email));
     }
 
+    /**
+     * @param admin Administration.
+     */
+    public void setAdmin(Boolean admin) {
+        this.admin = admin;
+    }
+
+    /**
+     *
+     */
+    public boolean isAdmin() {
+        return Boolean.TRUE.equals(admin);
+    }
+
     public static class Credentials {
         String serverId;
         String username;
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/board/BoardService.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/board/BoardService.java
index e7f9ade..6c8649c 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/board/BoardService.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/board/BoardService.java
@@ -85,8 +85,10 @@ public class BoardService {
         List<DefectCompacted> defects = defectStorage.loadAllDefects();
 
         BoardSummaryUi res = new BoardSummaryUi();
+        boolean admin = userStorage.getUser(creds.getPrincipalId()).isAdmin();
         for (DefectCompacted next : defects) {
             BoardDefectSummaryUi defectUi = new BoardDefectSummaryUi(next, compactor);
+            defectUi.setForceResolveAllowed(admin);
 
             String srvCode = next.tcSrvCode(compactor);
 
@@ -158,9 +160,8 @@ public class BoardService {
                         fatBuildCompacted.buildTypeId(compactor),
                         fatBuildCompacted.branchName(compactor)
                 );
-            } else {
+            } else
                 status = IssueResolveStatus.UNKNOWN;
-            }
         } else {
             if (rebuild.isPresent()) {
                 testResult = rebuild.get().getAllTests()
@@ -204,7 +205,7 @@ public class BoardService {
         Stream<Issue> stream = issuesStorage.allIssues();
 
         //todo make property how old issues can be considered as configuration parameter
-        long minIssueTs = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(11);
+        long minIssueTs = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(14);
 
         //todo not so good to to call init() twice
         fatBuildDao.init();
@@ -306,12 +307,18 @@ public class BoardService {
         }
     }
 
-    public void resolveDefect(Integer defectId, ICredentialsProv creds) {
+    public void resolveDefect(Integer defectId, ICredentialsProv creds, Boolean forceResolve) {
         DefectCompacted defect = defectStorage.load(defectId);
-        Preconditions.checkState(defect!=null, "Can't find defect by ID");
+        Preconditions.checkState(defect != null, "Can't find defect by ID");
 
         String principalId = creds.getPrincipalId();
-        TcHelperUser user = userStorage.getUser(principalId);
+        if(Boolean.TRUE.equals(forceResolve)) {
+            boolean admin = userStorage.getUser(principalId).isAdmin();
+
+            Preconditions.checkState(admin);
+        }
+
+        //todo if it is not forced resovle need to check blockers count for now
 
         int strId = compactor.getStringId(principalId);
         defect.resolvedByUsernameId(strId);
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/BoardDefectSummaryUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/BoardDefectSummaryUi.java
index 44021b8..6f1c90e 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/BoardDefectSummaryUi.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/BoardDefectSummaryUi.java
@@ -40,6 +40,7 @@ public class BoardDefectSummaryUi {
     private Set<String> tags = new HashSet<>();
 
     private List<BoardDefectIssueUi> issuesList = new ArrayList<>();
+    private boolean forceResolveAllowed;
 
     public BoardDefectSummaryUi(DefectCompacted defect, IStringCompactor compactor) {
         this.defect = defect;
@@ -160,6 +161,11 @@ public class BoardDefectSummaryUi {
         return (int) issues(IssueResolveStatus.FAILING).count();
     }
 
+    public boolean getForceResolveAllowed() {
+        return forceResolveAllowed;
+    }
+
+
     public List<BoardDefectIssueUi> getFixedIssues() {
         return issues(IssueResolveStatus.FIXED).collect(Collectors.toList());
     }
@@ -187,4 +193,8 @@ public class BoardDefectSummaryUi {
     public void addTags(Set<String> parameters) {
         this.tags.addAll(parameters);
     }
+
+    public void setForceResolveAllowed(boolean admin) {
+        this.forceResolveAllowed = admin;
+    }
 }