Search in sources :

Example 21 with ProcessException

use of com.walmartlabs.concord.server.process.ProcessException in project concord by walmartlabs.

the class ProcessDefinitionProcessor method process.

@Override
public Payload process(Chain chain, Payload payload) {
    ProcessKey processKey = payload.getProcessKey();
    Path workDir = payload.getHeader(Payload.WORKSPACE_DIR);
    if (workDir == null) {
        return chain.process(payload);
    }
    UUID projectId = payload.getHeader(Payload.PROJECT_ID);
    try {
        String runtime = getRuntimeType(payload);
        ProjectLoader.Result result = projectLoader.loadProject(workDir, runtime, importsNormalizer.forProject(projectId), new ProcessImportsListener(processKey));
        List<Snapshot> snapshots = result.snapshots();
        payload = PayloadUtils.addSnapshots(payload, snapshots);
        ProcessDefinition pd = result.projectDefinition();
        int depsCount = pd.configuration().dependencies().size();
        if (depsCount > MAX_DEPENDENCIES_COUNT) {
            String msg = String.format("Too many dependencies. Current: %d, maximum allowed: %d", depsCount, MAX_DEPENDENCIES_COUNT);
            throw new ConcordApplicationException(msg, Response.Status.BAD_REQUEST);
        }
        payload = payload.putHeader(Payload.PROJECT_DEFINITION, pd).putHeader(Payload.RUNTIME, pd.runtime()).putHeader(Payload.IMPORTS, pd.imports()).putHeader(Payload.DEPENDENCIES, pd.configuration().dependencies());
        // save the runtime type in the process configuration
        Map<String, Object> cfg = payload.getHeader(Payload.CONFIGURATION, Collections.emptyMap());
        // make mutable
        cfg = new HashMap<>(cfg);
        cfg.put(Constants.Request.RUNTIME_KEY, runtime);
        payload = payload.putHeader(Payload.CONFIGURATION, cfg);
    } catch (ImportProcessingException e) {
        throw new ProcessException(processKey, "Error while processing import " + e.getImport() + ". Error: " + e.getMessage(), e);
    } catch (Exception e) {
        log.warn("process -> ({}) project loading error: {}", workDir, e.getMessage());
        throw new ProcessException(processKey, "Error while loading the project, check the syntax. " + e.getMessage(), e);
    }
    return chain.process(payload);
}
Also used : Path(java.nio.file.Path) ImportProcessingException(com.walmartlabs.concord.imports.ImportProcessingException) ProcessDefinition(com.walmartlabs.concord.process.loader.model.ProcessDefinition) ProcessKey(com.walmartlabs.concord.server.sdk.ProcessKey) ProjectLoader(com.walmartlabs.concord.process.loader.ProjectLoader) ProcessException(com.walmartlabs.concord.server.process.ProcessException) IOException(java.io.IOException) ImportProcessingException(com.walmartlabs.concord.imports.ImportProcessingException) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException) Snapshot(com.walmartlabs.concord.repository.Snapshot) ProcessException(com.walmartlabs.concord.server.process.ProcessException) ConcordApplicationException(com.walmartlabs.concord.server.sdk.ConcordApplicationException)

Example 22 with ProcessException

use of com.walmartlabs.concord.server.process.ProcessException in project concord by walmartlabs.

the class RepositoryProcessor method process.

@Override
@WithTimer
public Payload process(Chain chain, final Payload payload) {
    ProcessKey processKey = payload.getProcessKey();
    UUID projectId = payload.getHeader(Payload.PROJECT_ID);
    RepositoryEntry repo = getRepositoryEntry(payload);
    if (projectId == null || repo == null) {
        return chain.process(payload);
    }
    logManager.info(processKey, "Copying the repository's data: {} @ {}:{}, path: {}", repo.getUrl(), repo.getBranch() != null ? repo.getBranch() : "*", repo.getCommitId() != null ? repo.getCommitId() : "head", repo.getPath() != null ? repo.getPath() : "/");
    Path dst = payload.getHeader(Payload.WORKSPACE_DIR);
    Payload newPayload = repositoryManager.withLock(repo.getUrl(), () -> {
        try {
            Repository repository = payload.getHeader(Payload.REPOSITORY);
            if (repository == null) {
                repository = repositoryManager.fetch(projectId, repo, true);
            }
            Snapshot snapshot = repository.export(dst);
            CommitInfo ci = null;
            if (repository.fetchResult() != null) {
                FetchResult r = Objects.requireNonNull(repository.fetchResult());
                ci = new CommitInfo(r.head(), r.branchOrTag(), r.author(), r.message());
            }
            RepositoryInfo i = new RepositoryInfo(repo.getId(), repo.getName(), repo.getUrl(), repo.getPath(), repo.getBranch(), repo.getCommitId(), ci);
            return payload.putHeader(REPOSITORY_INFO_KEY, i).putHeader(Payload.REPOSITORY, repository).putHeader(Payload.REPOSITORY_SNAPSHOT, Collections.singletonList(snapshot));
        } catch (Exception e) {
            log.error("process -> repository error", e);
            logManager.error(processKey, "Error while processing a repository: " + repo.getUrl(), e);
            throw new ProcessException(processKey, "Error while processing a repository: " + repo.getUrl(), e);
        }
    });
    return chain.process(newPayload);
}
Also used : Path(java.nio.file.Path) Snapshot(com.walmartlabs.concord.repository.Snapshot) Repository(com.walmartlabs.concord.repository.Repository) ProcessException(com.walmartlabs.concord.server.process.ProcessException) FetchResult(com.walmartlabs.concord.repository.FetchResult) Payload(com.walmartlabs.concord.server.process.Payload) ProcessKey(com.walmartlabs.concord.server.sdk.ProcessKey) RepositoryEntry(com.walmartlabs.concord.server.org.project.RepositoryEntry) UUID(java.util.UUID) ProcessException(com.walmartlabs.concord.server.process.ProcessException) WithTimer(com.walmartlabs.concord.server.sdk.metrics.WithTimer)

Example 23 with ProcessException

use of com.walmartlabs.concord.server.process.ProcessException in project concord by walmartlabs.

the class WorkspaceArchiveProcessor method process.

@Override
public Payload process(Chain chain, Payload payload) {
    ProcessKey processKey = payload.getProcessKey();
    Path archive = payload.getAttachment(Payload.WORKSPACE_ARCHIVE);
    if (archive == null) {
        return chain.process(payload);
    }
    if (!Files.exists(archive)) {
        logManager.error(processKey, "No input archive found: " + archive);
        throw new ProcessException(processKey, "No input archive found: " + archive, Status.BAD_REQUEST);
    }
    Path workspace = payload.getHeader(Payload.WORKSPACE_DIR);
    try {
        IOUtils.unzip(archive, workspace, StandardCopyOption.REPLACE_EXISTING);
    } catch (IOException e) {
        logManager.error(processKey, "Error while unpacking an archive: " + archive, e);
        throw new ProcessException(processKey, "Error while unpacking an archive: " + archive, e);
    }
    payload = payload.removeAttachment(Payload.WORKSPACE_ARCHIVE);
    return chain.process(payload);
}
Also used : Path(java.nio.file.Path) ProcessException(com.walmartlabs.concord.server.process.ProcessException) ProcessKey(com.walmartlabs.concord.server.sdk.ProcessKey) IOException(java.io.IOException)

Example 24 with ProcessException

use of com.walmartlabs.concord.server.process.ProcessException in project concord by walmartlabs.

the class FilePolicyApplier method apply.

@Override
public void apply(Payload payload, PolicyEngine policy) throws Exception {
    ProcessKey processKey = payload.getProcessKey();
    Path workDir = payload.getHeader(Payload.WORKSPACE_DIR);
    CheckResult<FileRule, Path> result = policy.getFilePolicy().check(workDir);
    result.getWarn().forEach(i -> {
        policyWarn.inc();
        logManager.warn(processKey, "Potentially restricted file '{}' (file policy: {})", workDir.relativize(i.getEntity()), i.getRule());
    });
    result.getDeny().forEach(i -> {
        policyDeny.inc();
        logManager.error(processKey, "File '{}' is forbidden by the file policy {}", workDir.relativize(i.getEntity()), i.getRule());
    });
    if (!result.getDeny().isEmpty()) {
        throw new ProcessException(processKey, "Found forbidden files");
    }
}
Also used : Path(java.nio.file.Path) ProcessException(com.walmartlabs.concord.server.process.ProcessException) FileRule(com.walmartlabs.concord.policyengine.FileRule) ProcessKey(com.walmartlabs.concord.server.sdk.ProcessKey)

Example 25 with ProcessException

use of com.walmartlabs.concord.server.process.ProcessException in project concord by walmartlabs.

the class ProcessTimeoutPolicyApplier method apply.

@Override
public void apply(Payload payload, PolicyEngine policy) {
    ProcessKey processKey = payload.getProcessKey();
    Map<String, Object> cfg = payload.getHeader(Payload.CONFIGURATION);
    if (cfg == null) {
        return;
    }
    Object processTimeout = cfg.get(Constants.Request.PROCESS_TIMEOUT);
    if (processTimeout == null) {
        return;
    }
    CheckResult<ProcessTimeoutRule, Object> result = policy.getProcessTimeoutPolicy().check(processTimeout);
    result.getDeny().forEach(i -> {
        policyDeny.inc();
        String msg = i.getRule().getMsg() != null ? i.getRule().getMsg() : DEFAULT_PROCESS_TIMEOUT_MSG;
        Object actualTimeout = i.getEntity();
        String limit = i.getRule().getMax();
        logManager.error(processKey, MessageFormat.format(msg, actualTimeout, limit));
    });
    if (!result.getDeny().isEmpty()) {
        throw new ProcessException(processKey, "'processTimeout' value policy violation");
    }
}
Also used : ProcessException(com.walmartlabs.concord.server.process.ProcessException) ProcessTimeoutRule(com.walmartlabs.concord.policyengine.ProcessTimeoutRule) ProcessKey(com.walmartlabs.concord.server.sdk.ProcessKey)

Aggregations

ProcessException (com.walmartlabs.concord.server.process.ProcessException)31 ProcessKey (com.walmartlabs.concord.server.sdk.ProcessKey)20 Path (java.nio.file.Path)19 IOException (java.io.IOException)18 UUID (java.util.UUID)9 InputStream (java.io.InputStream)4 Map (java.util.Map)4 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)3 PolicyEngine (com.walmartlabs.concord.policyengine.PolicyEngine)3 ProjectEntry (com.walmartlabs.concord.server.org.project.ProjectEntry)3 ProcessDefinition (com.walmartlabs.concord.process.loader.model.ProcessDefinition)2 Snapshot (com.walmartlabs.concord.repository.Snapshot)2 Payload (com.walmartlabs.concord.server.process.Payload)2 PartialProcessKey (com.walmartlabs.concord.server.sdk.PartialProcessKey)2 WithTimer (com.walmartlabs.concord.server.sdk.metrics.WithTimer)2 UserInfo (com.walmartlabs.concord.server.user.UserInfoProvider.UserInfo)2 URI (java.net.URI)2 URISyntaxException (java.net.URISyntaxException)2 ConfigurationUtils (com.walmartlabs.concord.common.ConfigurationUtils)1 CycleChecker (com.walmartlabs.concord.common.CycleChecker)1