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);
}
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);
}
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);
}
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");
}
}
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");
}
}
Aggregations