package com.uber.jenkins.phabricator.tasks; import com.uber.jenkins.phabricator.conduit.ConduitAPIException; import com.uber.jenkins.phabricator.conduit.DifferentialClient; import com.uber.jenkins.phabricator.lint.LintResults; import com.uber.jenkins.phabricator.unit.UnitResults; import com.uber.jenkins.phabricator.utils.Logger; import net.sf.json.JSONNull; import net.sf.json.JSONObject; import java.io.IOException; import java.util.Map; public class SendHarbormasterResultTask extends Task { private final DifferentialClient diffClient; private final String phid; private final boolean harbormasterSuccess; private UnitResults unitResults; private final Map<String, String> coverage; private final LintResults lintResults; public SendHarbormasterResultTask(Logger logger, DifferentialClient diffClient, String phid, boolean harbormasterSuccess, UnitResults unitResults, Map<String, String> harbormasterCoverage, LintResults lintResults) { super(logger); this.diffClient = diffClient; this.phid = phid; this.harbormasterSuccess = harbormasterSuccess; this.unitResults = unitResults; this.coverage = harbormasterCoverage; this.lintResults = lintResults; } /** * {@inheritDoc} */ @Override protected String getTag() { return "send-harbormaster-result"; } /** * {@inheritDoc} */ @Override protected void setup() { // Do nothing } /** * {@inheritDoc} */ @Override protected void execute() { try { if (!sendMessage(unitResults, coverage, lintResults)) { info("Error sending Harbormaster unit results, trying again without unit data (you may have an old Phabricator?)."); sendMessage(null, null, null); } } catch (ConduitAPIException e) { e.printStackTrace(); failTask(); } catch (IOException e) { e.printStackTrace(); failTask(); } } /** * Try to send a message to harbormaster * @param unitResults the unit testing results to send * @param coverage the coverage data to send * @return false if an error was encountered */ private boolean sendMessage(UnitResults unitResults, Map<String, String> coverage, LintResults lintResults) throws IOException, ConduitAPIException { JSONObject result = diffClient.sendHarbormasterMessage(phid, harbormasterSuccess, unitResults, coverage, lintResults); if (result.containsKey("error_info") && !(result.get("error_info") instanceof JSONNull)) { info(String.format("Error from Harbormaster: %s", result.getString("error_info"))); failTask(); return false; } else { this.result = Result.SUCCESS; } return true; } private void failTask() { info("Unable to post to Harbormaster"); result = result.FAILURE; } /** * {@inheritDoc} */ @Override protected void tearDown() { // Do nothing } }