All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.pnc.facade.impl.BuildTriggererImpl Maven / Gradle / Ivy

/**
 * JBoss, Home of Professional Open Source.
 * Copyright 2014-2020 Red Hat, Inc., and individual contributors
 * as indicated by the @author tags.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jboss.pnc.facade.impl;

import com.google.common.base.Preconditions;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.stream.Collectors;
import javax.ejb.Stateless;

import javax.inject.Inject;

import org.jboss.pnc.common.logging.BuildTaskContext;
import org.jboss.pnc.coordinator.notifications.buildSetTask.BuildSetStatusNotifications;
import org.jboss.pnc.coordinator.notifications.buildTask.BuildStatusNotifications;
import org.jboss.pnc.dto.BuildConfigurationRevisionRef;
import org.jboss.pnc.dto.requests.GroupBuildRequest;
import org.jboss.pnc.facade.BuildTriggerer;
import org.jboss.pnc.facade.util.HibernateLazyInitializer;
import org.jboss.pnc.facade.util.UserService;
import org.jboss.pnc.facade.validation.InvalidEntityException;
import org.jboss.pnc.model.BuildConfiguration;
import org.jboss.pnc.model.BuildConfigurationAudited;
import org.jboss.pnc.model.BuildConfigurationSet;
import org.jboss.pnc.model.IdRev;
import org.jboss.pnc.facade.providers.GenericSettingProvider;
import org.jboss.pnc.spi.BuildOptions;
import org.jboss.pnc.spi.coordinator.BuildCoordinator;
import org.jboss.pnc.spi.coordinator.BuildSetTask;
import org.jboss.pnc.spi.coordinator.BuildTask;
import org.jboss.pnc.spi.datastore.repositories.BuildConfigurationAuditedRepository;
import org.jboss.pnc.spi.datastore.repositories.BuildConfigurationRepository;
import org.jboss.pnc.spi.datastore.repositories.BuildConfigurationSetRepository;
import org.jboss.pnc.spi.exception.BuildConflictException;
import org.jboss.pnc.spi.exception.CoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.jboss.pnc.common.util.StreamHelper.nullableStreamOf;

/**
 *
 * @author jbrazdil
 * @author Jakub Bartecek <[email protected]>
 */
@Stateless
public class BuildTriggererImpl implements BuildTriggerer {

    private static final Logger logger = LoggerFactory.getLogger(BuildTriggererImpl.class);

    @Inject
    private UserService user;

    @Inject
    private BuildSetStatusNotifications buildSetStatusNotifications;

    @Inject
    private BuildStatusNotifications buildStatusNotifications;

    @Inject
    private BuildCoordinator buildCoordinator;

    @Inject
    private BuildConfigurationRepository buildConfigurationRepository;

    @Inject
    private BuildConfigurationAuditedRepository buildConfigurationAuditedRepository;

    @Inject
    private BuildConfigurationSetRepository buildConfigurationSetRepository;

    @Inject
    private HibernateLazyInitializer hibernateLazyInitializer;

    @Inject
    GenericSettingProvider genericSettingProvider;

    @Override
    public int triggerBuild(final int buildConfigId, OptionalInt buildConfigurationRevision, BuildOptions buildOptions)
            throws BuildConflictException, CoreException {

        throwCoreExceptionIfInMaintenanceModeAndNonSystemUser();

        BuildSetTask result = doTriggerBuild(buildConfigId, buildConfigurationRevision, buildOptions);
        return selectBuildRecordIdOf(result.getBuildTasks(), buildConfigId);
    }

    @Override
    public int triggerGroupBuild(int groupConfigId, Optional revs, BuildOptions buildOptions)
            throws BuildConflictException, CoreException {

        throwCoreExceptionIfInMaintenanceModeAndNonSystemUser();

        BuildSetTask result = doTriggerGroupBuild(groupConfigId, revs, buildOptions);
        return result.getId();
    }

    @Override
    public boolean cancelBuild(int buildId) throws CoreException {
        return buildCoordinator.cancel(buildId);
    }

    @Override
    public Optional getMdcMeta(int buildId) {
        return buildCoordinator.getMDCMeta(buildId);
    }

    private BuildSetTask doTriggerBuild(
            final int buildConfigId,
            OptionalInt buildConfigurationRevision,
            BuildOptions buildOptions) throws BuildConflictException, CoreException {

        BuildSetTask buildSetTask;
        if (buildConfigurationRevision.isPresent()) {
            final BuildConfigurationAudited buildConfigurationAudited = buildConfigurationAuditedRepository
                    .queryById(new IdRev(buildConfigId, buildConfigurationRevision.getAsInt()));
            Preconditions.checkArgument(
                    buildConfigurationAudited != null,
                    "Can't find Build Configuration with id=" + buildConfigId + ", rev="
                            + buildConfigurationRevision.getAsInt());

            buildSetTask = buildCoordinator.build(
                    hibernateLazyInitializer
                            .initializeBuildConfigurationAuditedBeforeTriggeringIt(buildConfigurationAudited),
                    user.currentUser(),
                    buildOptions);
        } else {
            final BuildConfiguration buildConfiguration = buildConfigurationRepository.queryById(buildConfigId);
            Preconditions.checkArgument(
                    buildConfiguration != null,
                    "Can't find Build Configuration with id=" + buildConfigId);

            buildSetTask = buildCoordinator.build(
                    hibernateLazyInitializer.initializeBuildConfigurationBeforeTriggeringIt(buildConfiguration),
                    user.currentUser(),
                    buildOptions);
        }

        logger.info(
                "Started build of Build Configuration {}. Build Tasks: {}",
                buildConfigId,
                buildSetTask.getBuildTasks()
                        .stream()
                        .map(bt -> Integer.toString(bt.getId()))
                        .collect(Collectors.joining()));
        return buildSetTask;
    }

    private BuildSetTask doTriggerGroupBuild(
            final int groupConfigId,
            Optional revs,
            BuildOptions buildOptions) throws CoreException {
        final BuildConfigurationSet buildConfigurationSet = buildConfigurationSetRepository.queryById(groupConfigId);
        Preconditions.checkArgument(
                buildConfigurationSet != null,
                "Can't find configuration with given id=" + groupConfigId);

        List revisions = revs.map(GroupBuildRequest::getBuildConfigurationRevisions)
                .orElse(Collections.emptyList());

        BuildSetTask buildSetTask = buildCoordinator.build(
                hibernateLazyInitializer.initializeBuildConfigurationSetBeforeTriggeringIt(buildConfigurationSet),
                loadAuditedsFromDB(buildConfigurationSet, revisions),
                user.currentUser(),
                buildOptions);

        logger.info(
                "Started build of Group Configuration {}. Build Tasks: {}",
                groupConfigId,
                buildSetTask.getBuildTasks()
                        .stream()
                        .map(bt -> Integer.toString(bt.getId()))
                        .collect(Collectors.joining()));
        return buildSetTask;
    }

    private Map loadAuditedsFromDB(
            BuildConfigurationSet buildConfigurationSet,
            List buildConfigurationAuditedRests) throws InvalidEntityException {
        Map buildConfigurationAuditedsMap = new HashMap<>();

        Set buildConfigurationAuditedRevs = nullableStreamOf(buildConfigurationAuditedRests)
                .map(bcrRef -> new IdRev(Integer.valueOf(bcrRef.getId()), bcrRef.getRev()))
                .collect(Collectors.toSet());
        if (!buildConfigurationAuditedRevs.isEmpty()) {
            Map buildConfigurationsAuditedMap = buildConfigurationAuditedRepository
                    .queryById(buildConfigurationAuditedRevs);

            for (BuildConfigurationRevisionRef bc : buildConfigurationAuditedRests) {
                BuildConfigurationAudited buildConfigurationAudited = buildConfigurationsAuditedMap
                        .get(new IdRev(Integer.valueOf(bc.getId()), bc.getRev()));
                Preconditions.checkArgument(
                        buildConfigurationAudited != null,
                        "Can't find Build Configuration with id=" + bc.getId() + ", rev=" + bc.getRev());
                buildConfigurationAudited = hibernateLazyInitializer
                        .initializeBuildConfigurationAuditedBeforeTriggeringIt(buildConfigurationAudited);

                if (!buildConfigurationSet.getBuildConfigurations()
                        .contains(buildConfigurationAudited.getBuildConfiguration())) {
                    throw new InvalidEntityException(
                            "BuildConfigurationSet " + buildConfigurationSet
                                    + " doesn't contain this BuildConfigurationAudited entity "
                                    + buildConfigurationAudited);
                }

                buildConfigurationAuditedsMap.put(buildConfigurationAudited.getId(), buildConfigurationAudited);
            }
        }

        return buildConfigurationAuditedsMap;
    }

    private int selectBuildRecordIdOf(Collection buildTasks, int buildConfigId) throws CoreException {
        return buildTasks.stream()
                .filter(t -> t.getBuildConfigurationAudited().getBuildConfiguration().getId().equals(buildConfigId))
                .map(BuildTask::getId)
                .findAny()
                .orElseThrow(() -> new CoreException("No build id for the triggered configuration"));
    }

    private void throwCoreExceptionIfInMaintenanceModeAndNonSystemUser() throws BuildConflictException {

        if (!genericSettingProvider.isCurrentUserAllowedToTriggerBuilds()) {
            String reason = genericSettingProvider.getAnnouncementBanner();

            if (reason == null) {
                reason = "";
            }

            throw new BuildConflictException("PNC is in maintenance mode: " + reason);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy