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 354408e IGNITE-11491: Git proxy and VISA validitiy protection: step
1: diplsay hash for completed build (#112)
354408e is described below
commit 354408ee7c1621a83179e40b9bdbfb5dbad05e80
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Thu Mar 7 20:03:50 2019 +0300
IGNITE-11491: Git proxy and VISA validitiy protection: step 1: diplsay hash
for completed build (#112)
---
.../org/apache/ignite/ci/github/GitHubBranch.java | 4 ++
.../org/apache/ignite/ci/github/PullRequest.java | 7 +++
.../ci/github/ignited/IGitHubConnIgnited.java | 5 ++-
.../ci/github/pure/GitHubConnectionImpl.java | 3 +-
.../trigger/BuildLink.java} | 31 ++------------
.../trigger/TriggerResult.java} | 30 +++----------
.../ignite/ci/tcbot/visa/ContributionToCheck.java | 3 ++
.../tcbot/visa/TcBotTriggerAndSignOffService.java | 29 +++++++++++--
.../apache/ignite/ci/web/rest/TriggerBuilds.java | 12 +++---
ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js | 4 ++
.../src/main/webapp/js/testfails-2.1.js | 50 +++++++++++++---------
ignite-tc-helper-web/src/main/webapp/prs.html | 3 +-
12 files changed, 97 insertions(+), 84 deletions(-)
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
index 92d4475..0b4e332 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
@@ -43,4 +43,8 @@ public class GitHubBranch {
public String ref() {
return ref;
}
+
+ public String sha() {
+ return sha;
+ }
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
index 4437436..1a52921 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
@@ -19,9 +19,11 @@ package org.apache.ignite.ci.github;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
+import com.google.common.base.Strings;
import com.google.gson.annotations.SerializedName;
import org.apache.ignite.ci.analysis.IVersionedEntity;
import org.apache.ignite.ci.db.Persisted;
+import org.jetbrains.annotations.Nullable;
/**
*
@@ -157,4 +159,9 @@ public class PullRequest implements IVersionedEntity {
return LATEST_VERSION;
}
+ @Nullable public String lastCommitShaShort() {
+ String sha = head().sha();
+
+ return Strings.isNullOrEmpty(sha) ? null : sha.substring(0, 7);
+ }
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
index 1170c7a..10d14aa 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/IGitHubConnIgnited.java
@@ -25,7 +25,10 @@ import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
*
*/
public interface IGitHubConnIgnited {
- IGitHubConfig config();
+ /**
+ * @return Config of GH project.
+ */
+ public IGitHubConfig config();
/**
* @return list of open pull requests
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
index 522421d..a7ff550 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/pure/GitHubConnectionImpl.java
@@ -89,8 +89,7 @@ class GitHubConnectionImpl implements IGitHubConnection {
}
/** {@inheritDoc} */
- @Override
- public void init(String srvCode) {
+ @Override public void init(String srvCode) {
this.srvCode = srvCode;
final File workDir = HelperConfig.resolveWorkDir();
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/BuildLink.java
similarity index 51%
copy from
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
copy to
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/BuildLink.java
index 92d4475..dfcb43b 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/BuildLink.java
@@ -14,33 +14,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.ignite.ci.github;
-import com.google.common.base.Objects;
+package org.apache.ignite.ci.tcbot.trigger;
-public class GitHubBranch {
- private String label;
- private String ref;
- private String sha;
-
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
- if (o == null || getClass() != o.getClass())
- return false;
- GitHubBranch branch = (GitHubBranch)o;
- return Objects.equal(label, branch.label) &&
- Objects.equal(ref, branch.ref) &&
- Objects.equal(sha, branch.sha);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- return Objects.hashCode(label, ref, sha);
- }
-
- public String ref() {
- return ref;
- }
+public class BuildLink {
+ String webUrl;
+ String headShaShort;
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/TriggerResult.java
similarity index 52%
copy from
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
copy to
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/TriggerResult.java
index 92d4475..f809bf9 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/GitHubBranch.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trigger/TriggerResult.java
@@ -14,33 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.ignite.ci.github;
-import com.google.common.base.Objects;
+package org.apache.ignite.ci.tcbot.trigger;
-public class GitHubBranch {
- private String label;
- private String ref;
- private String sha;
+import org.apache.ignite.ci.web.model.SimpleResult;
- /** {@inheritDoc} */
- @Override public boolean equals(Object o) {
- if (this == o)
- return true;
- if (o == null || getClass() != o.getClass())
- return false;
- GitHubBranch branch = (GitHubBranch)o;
- return Objects.equal(label, branch.label) &&
- Objects.equal(ref, branch.ref) &&
- Objects.equal(sha, branch.sha);
- }
-
- /** {@inheritDoc} */
- @Override public int hashCode() {
- return Objects.hashCode(label, ref, sha);
- }
-
- public String ref() {
- return ref;
+public class TriggerResult extends SimpleResult {
+ public TriggerResult(String result) {
+ super(result);
}
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/ContributionToCheck.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/ContributionToCheck.java
index ce92d10..c4e1859 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/ContributionToCheck.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/ContributionToCheck.java
@@ -38,6 +38,9 @@ package org.apache.ignite.ci.tcbot.visa;
/** Pr html url. */
public String prHtmlUrl;
+ /** Pr head commit hash (first 7 hexes). */
+ public String prHeadCommit;
+
/** Branch Name for team city */
public String tcBranchName;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index 75f682e..aca9cfb 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -122,6 +122,7 @@ public class TcBotTriggerAndSignOffService {
/** Helper. */
@Inject ITcBotBgAuth tcBotBgAuth;
+ /** PR chain processor. */
@Inject PrChainsProcessor prChainsProcessor;
/** Config. */
@@ -250,20 +251,40 @@ public class TcBotTriggerAndSignOffService {
@Nullable Boolean top,
@Nullable Boolean observe,
@Nullable String ticketId,
- ICredentialsProv prov) {
+ @Nullable String prNum,
+ @Nullable ICredentialsProv prov) {
String jiraRes = "";
- final ITeamcityIgnited teamcity = tcIgnitedProv.server(srvId, prov);
+ ITeamcityIgnited teamcity = tcIgnitedProv.server(srvId, prov);
+
+ IGitHubConnIgnited ghIgn = gitHubConnIgnitedProvider.server(srvId);
+
+ if(!Strings.isNullOrEmpty(prNum)) {
+ try {
+ PullRequest pr = ghIgn.getPullRequest(Integer.parseInt(prNum));
+
+ if(pr!=null) {
+ String shaShort = pr.lastCommitShaShort();
+
+ if(shaShort!=null)
+ jiraRes = "Actual commit: " + shaShort + ". ";
+ }
+ }
+ catch (NumberFormatException e) {
+ logger.error("PR & TC state checking failed" , e);
+ }
+ }
String[] suiteIds = Objects.requireNonNull(suiteIdList).split(",");
+ //todo consult if there are change differences here
https://ci.ignite.apache.org/app/rest/changes?locator=buildType:(id:IgniteTests24Java8_Cache7),pending:true,branch:pull%2F6224%2Fhead
Build[] builds = new Build[suiteIds.length];
for (int i = 0; i < suiteIds.length; i++)
builds[i] = teamcity.triggerBuild(suiteIds[i], branchForTc, false,
top != null && top);
if (observe != null && observe)
- jiraRes = observeJira(srvId, branchForTc, ticketId, prov,
parentSuiteId, builds);
+ jiraRes += observeJira(srvId, branchForTc, ticketId, prov,
parentSuiteId, builds);
return jiraRes;
}
@@ -366,6 +387,7 @@ public class TcBotTriggerAndSignOffService {
check.prNumber = pr.getNumber();
check.prTitle = pr.getTitle();
check.prHtmlUrl = pr.htmlUrl();
+ check.prHeadCommit = pr.lastCommitShaShort();
check.prTimeUpdate = pr.getTimeUpdate();
GitHubUser user = pr.gitHubUser();
@@ -420,6 +442,7 @@ public class TcBotTriggerAndSignOffService {
contribution.prTitle = ticket.fields.summary;
contribution.prHtmlUrl = "";
+ contribution.prHeadCommit = "";
contribution.prTimeUpdate = ""; //todo ticket updateTime
contribution.prAuthor = "";
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
index bd953d7..b9a7235 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/TriggerBuilds.java
@@ -38,6 +38,7 @@ import org.apache.ignite.ci.jira.pure.IJiraIntegration;
import org.apache.ignite.ci.jira.pure.IJiraIntegrationProvider;
import org.apache.ignite.ci.tcbot.conf.IJiraServerConfig;
import org.apache.ignite.ci.tcbot.conf.ITcBotConfig;
+import org.apache.ignite.ci.tcbot.trigger.TriggerResult;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
import org.apache.ignite.ci.user.ICredentialsProv;
import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
@@ -62,14 +63,15 @@ public class TriggerBuilds {
@GET
@Path("trigger")
- public SimpleResult triggerBuilds(
+ public TriggerResult triggerBuilds(
@Nullable @QueryParam("serverId") String srvCode,
@Nullable @QueryParam("branchName") String branchForTc,
@Nonnull @QueryParam("parentSuiteId") String parentSuiteId,
@Nonnull @QueryParam("suiteIdList") String suiteIdList,
@Nullable @QueryParam("top") Boolean top,
@Nullable @QueryParam("observe") Boolean observe,
- @Nullable @QueryParam("ticketId") String ticketId
+ @Nullable @QueryParam("ticketId") String ticketId,
+ @Nullable @QueryParam("prNum") String prNum
) {
ICredentialsProv prov = ICredentialsProv.get(req);
Injector injector = CtxListener.getInjector(ctx);
@@ -77,13 +79,13 @@ public class TriggerBuilds {
injector.getInstance(ITeamcityIgnitedProvider.class).checkAccess(srvCode, prov);
if (isNullOrEmpty(suiteIdList))
- return new SimpleResult("Error: nothing to run.");
+ return new TriggerResult("Error: nothing to run.");
String jiraRes = injector
.getInstance(TcBotTriggerAndSignOffService.class)
- .triggerBuildsAndObserve(srvCode, branchForTc, parentSuiteId,
suiteIdList, top, observe, ticketId, prov);
+ .triggerBuildsAndObserve(srvCode, branchForTc, parentSuiteId,
suiteIdList, top, observe, ticketId, prNum, prov);
- return new SimpleResult("Tests started." + (!jiraRes.isEmpty() ?
"<br>" + jiraRes : ""));
+ return new TriggerResult("Tests started." + (!jiraRes.isEmpty() ?
"<br>" + jiraRes : ""));
}
/**
diff --git a/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
b/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
index d9e14e2..28c93a1 100644
--- a/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
+++ b/ignite-tc-helper-web/src/main/webapp/js/prs-1.1.js
@@ -114,6 +114,10 @@ function showContributionsTable(result, srvId, suiteId) {
"render": function (data, type, row, meta) {
if (type === 'display' && row.prNumber > 0) {
data = "<a href='" + data + "'>#" + row.prNumber +
"</a>";
+
+ if (type === 'display' &&
isDefinedAndFilled(row.prHeadCommit)) {
+ data += " (" + row.prHeadCommit + ")";
+ }
}
return data;
diff --git a/ignite-tc-helper-web/src/main/webapp/js/testfails-2.1.js
b/ignite-tc-helper-web/src/main/webapp/js/testfails-2.1.js
index 969b2c2..a45f850 100644
--- a/ignite-tc-helper-web/src/main/webapp/js/testfails-2.1.js
+++ b/ignite-tc-helper-web/src/main/webapp/js/testfails-2.1.js
@@ -89,7 +89,10 @@ function showChainResultsWithSettings(result, settings) {
}
-//@param server - see ChainAtServerCurrentStatus
+/**
+ * @param server - see
org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus Java Class.
+ * @param settings - see Settings JavaScript class.
+ */
function showChainCurrentStatusData(server, settings) {
if(!isDefinedAndFilled(server))
return;
@@ -179,12 +182,12 @@ function showChainCurrentStatusData(server, settings) {
mInfo += "Trigger failed " + cntFailed + " builds";
mInfo += " <a href='javascript:void(0);' ";
mInfo += " onClick='triggerBuilds(\"" + server.serverId + "\", \"" +
parentSuitId + "\", " +
- "\"" + suitesFailedList + "\", \"" + server.branchName + "\",
false, false)' ";
+ "\"" + suitesFailedList + "\", \"" + server.branchName + "\",
false, false, null, \"" + server.prNum + "\")' ";
mInfo += " title='trigger builds'>in queue</a> ";
mInfo += " <a href='javascript:void(0);' ";
mInfo += " onClick='triggerBuilds(\"" + server.serverId + "\", \"" +
parentSuitId + "\", " +
- "\"" + suitesFailedList + "\", \"" + server.branchName + "\",
true, false)' ";
+ "\"" + suitesFailedList + "\", \"" + server.branchName + "\",
true, false, null, \"" + server.prNum + "\")' ";
mInfo += " title='trigger builds'>on top</a><br>";
}
@@ -232,24 +235,25 @@ function showChainCurrentStatusData(server, settings) {
var blockersList = "";
- for (var i = 0; i < server.suites.length; i++) {
- var suite = server.suites[i];
+ for (var l = 0; l < server.suites.length; l++) {
+ var suite0 = server.suites[l];
- suite = suiteWithCriticalFailuresOnly(suite);
+ var suiteOrNull = suiteWithCriticalFailuresOnly(suite0);
- if (suite != null) {
+ if (suiteOrNull != null) {
if (blockersList.length !== 0)
blockersList += ",";
- blockersList += suite.suiteId;
+ blockersList += suite0.suiteId;
}
}
res += "<button onclick='triggerBuilds(\"" + server.serverId + "\",
\"" + parentSuitId + "\", \"" +
- blockersList + "\", \"" + server.branchName + "\", false, false)'>
Re-run possible blockers</button><br>";
+ blockersList + "\", \"" + server.branchName + "\", false, false,
null, \"" + + server.prNum + "\")'> " +
+ "Re-run possible blockers</button><br>";
res += "<button onclick='triggerBuilds(\"" + server.serverId + "\",
\"" + parentSuitId + "\", \"" +
- blockersList + "\", \"" + server.branchName + "\", false, true)'>
" +
+ blockersList + "\", \"" + server.branchName + "\", false, true,
null, \"" + + server.prNum +"\")'> " +
"Re-run possible blockers & Comment JIRA</button><br>";
}
@@ -268,10 +272,10 @@ function showChainCurrentStatusData(server, settings) {
res += addBlockersData(server, settings);
- for (var i = 0; i < server.suites.length; i++) {
- var suite = server.suites[i];
+ for (var m = 0; m < server.suites.length; m++) {
+ var subSuite = server.suites[m];
- res += showSuiteData(suite, settings);
+ res += showSuiteData(subSuite, settings, server.prNum);
}
res += "<tr><td colspan='4'> </td></tr>";
@@ -300,7 +304,7 @@ function addBlockersData(server, settings) {
suite = suiteWithCriticalFailuresOnly(suite);
if (suite != null)
- blockers += showSuiteData(suite, settings);
+ blockers += showSuiteData(suite, settings, server.prNum);
}
if (blockers === "") {
@@ -400,13 +404,14 @@ function notifyGit() {
});
}
-function triggerBuilds(serverId, parentSuiteId, suiteIdList, branchName, top,
observe, ticketId) {
+function triggerBuilds(serverId, parentSuiteId, suiteIdList, branchName, top,
observe, ticketId, prNum) {
var queueAtTop = isDefinedAndFilled(top) && top;
var observeJira = isDefinedAndFilled(observe) && observe;
var suiteIdsNotExists = !isDefinedAndFilled(suiteIdList) ||
suiteIdList.length === 0;
var branchNotExists = !isDefinedAndFilled(branchName) || branchName.length
=== 0;
branchName = branchNotExists ? null : branchForTc(branchName);
ticketId = (isDefinedAndFilled(ticketId) && ticketId.length > 0) ?
ticketId : null;
+ prNum = (isDefinedAndFilled(prNum) && prNum.length > 0) ? prNum : null;
var triggerConfirm = $("#triggerConfirm");
@@ -449,6 +454,9 @@ function triggerBuilds(serverId, parentSuiteId,
suiteIdList, branchName, top, ob
} else
sendGetRequest();
+ /**
+ * See org.apache.ignite.ci.web.rest.TriggerBuilds#triggerBuilds
+ */
function sendGetRequest() {
$.ajax({
url: 'rest/build/trigger',
@@ -459,7 +467,8 @@ function triggerBuilds(serverId, parentSuiteId,
suiteIdList, branchName, top, ob
"suiteIdList": suiteIdList,
"top": queueAtTop,
"observe": observeJira,
- "ticketId": ticketId
+ "ticketId": ticketId,
+ "prNum": prNum
},
success: successDialog,
error: showErrInLoadStatus
@@ -581,11 +590,12 @@ function commentJira(serverId, branchName, parentSuiteId,
ticketId) {
/**
* Create html string with table rows, containing suite data.
*
- * @param suite - see SuiteCurrentStatus Java class.
+ * @param suite - see
org.apache.ignite.ci.web.model.current.SuiteCurrentStatus Java class.
* @param settings - see Settings JavaScript class.
+ * @param prNum - PR shown, used by triggering.
* @returns {string} Table rows with suite data.
*/
-function showSuiteData(suite, settings) {
+function showSuiteData(suite, settings, prNum) {
var moreInfoTxt = "";
if (isDefinedAndFilled(suite.userCommits) && suite.userCommits !== "") {
@@ -651,12 +661,12 @@ function showSuiteData(suite, settings) {
mInfo += " Trigger build: ";
mInfo += "<a href='javascript:void(0);' ";
mInfo += " onClick='triggerBuilds(\"" + suite.serverId + "\", null,
\"" +
- suite.suiteId + "\", \"" + suite.branchName + "\", false, false)'
";
+ suite.suiteId + "\", \"" + suite.branchName + "\", false, false,
null, \"" + prNum + "\")' ";
mInfo += " title='trigger build' >queue</a> ";
mInfo += "<a href='javascript:void(0);' ";
mInfo += " onClick='triggerBuilds(\"" + suite.serverId + "\", null,
\"" +
- suite.suiteId + "\", \"" + suite.branchName + "\", true, false)' ";
+ suite.suiteId + "\", \"" + suite.branchName + "\", true, false,
null, \"" + prNum + "\")' ";
mInfo += " title='trigger build at top of queue'>top</a><br>";
}
diff --git a/ignite-tc-helper-web/src/main/webapp/prs.html
b/ignite-tc-helper-web/src/main/webapp/prs.html
index 6989a00..cd736b4 100644
--- a/ignite-tc-helper-web/src/main/webapp/prs.html
+++ b/ignite-tc-helper-web/src/main/webapp/prs.html
@@ -180,7 +180,8 @@
var branchName = fields.namedItem("branchForTc").value;
var ticketId = fields.namedItem("ticketId").value;
- triggerBuilds(srvId, suiteId, branchName, false, trigCase !==
"tests", ticketId)
+ //todo prNum
+ triggerBuilds(srvId, suiteId, branchName, false, trigCase !==
"tests", ticketId);
}
/**