protected String checkIfChainTriggerable()

in ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java [287:378]


    protected String checkIfChainTriggerable(String srvCode,
        String buildTypeId,
        String tcBranch,
        ITeamcityIgnited tcIgn,
        String selfLogin,
        ITrackedChain chain,
        String agentStatus) {
        List<BuildRefCompacted> buildsForBr = tcIgn.getQueuedAndRunningBuildsCompacted(tcBranch);

        for (BuildRefCompacted refComp : buildsForBr) {
            Integer buildId = refComp.getId();
            if (buildId == null)
                continue; // should not occur;

            FatBuildCompacted fatBuild = tcIgn.getFatBuild(buildId);

            Build build = fatBuild.toBuild(compactor);
            Triggered triggered = build.getTriggered();

            if (triggered == null) {
                logger.info("Unable to get triggering info for queued build {} (type={}).", buildId, build.buildTypeId);

                continue;
            }

            User user = build.getTriggered().getUser();

            if (user == null) {
                logger.info("Unable to get username for queued build {} (type={}). Possibly VCS triggered", buildId, build.buildTypeId);

                continue;
            }

            String buildTypeIdExisting = build.buildTypeId();
            if (buildTypeIdExisting == null) {
                logger.info("Unable to get buildTypeId for queued build {} (type={}).", buildId, build.buildTypeId);

                continue;
            }

            String login = user.username;

            if (selfLogin.equalsIgnoreCase(login)
                && buildTypeIdExisting.trim().equals(Strings.nullToEmpty(buildTypeId).trim())) {
                String msg
                    = MessageFormat.format("Queued build {0} was early triggered " +
                    "(user {1}, branch {2}, suite {3})." +
                    " Will not start new build.", Integer.toString(buildId), login, tcBranch, buildTypeIdExisting);

                logger.info(msg);

                return msg;
            }
        }

        long curr = System.currentTimeMillis();
        long delay = chain.triggerBuildQuietPeriod();

        long minsPassed = -1;
        if (delay > 0) {
            Long lastStart = startTimes.get(chain);

            if (lastStart != null &&
                (minsPassed = TimeUnit.MILLISECONDS.toMinutes(curr - lastStart)) < delay) {

                final String msg = MessageFormat.format("Skip triggering build, timeout has not expired " +
                                "(server={0}, suite={1}, branch={2}, delay={3} mins, passed={4} mins)",
                    srvCode, buildTypeId, tcBranch,
                        chain.triggerBuildQuietPeriod(), minsPassed);
                logger.info(msg);

                return msg;
            }
        }

        startTimes.put(chain, curr);

        StringBuilder trigComment = new StringBuilder();
        trigComment.append("Scheduled run ");
        trigComment.append(agentStatus);
        if (minsPassed > 0)
            trigComment.append(" Since last build triggering: ").append(Duration.ofMinutes(minsPassed));

        T2<Build, Set<Integer>> buildAndIds = tcIgn.triggerBuild(buildTypeId, tcBranch, true, false,
            chain.generateBuildParameters(),
            true,
            trigComment.toString());

        Build build = buildAndIds.get1();

        return "Build id " + build.getId() + " " + tcBranch + " for " + buildTypeId + " triggered; ";
    }