use of com.walmartlabs.concord.runtime.v2.ProjectLoaderV2 in project concord by walmartlabs.
the class Main method start.
private static ProcessSnapshot start(Runner runner, ProcessConfiguration cfg, Path workDir, Map<String, Object> args) throws Exception {
// assume all imports were processed by the agent
ProjectLoaderV2 loader = new ProjectLoaderV2(new NoopImportManager());
ProcessDefinition processDefinition = loader.load(workDir, new NoopImportsNormalizer(), ImportsListener.NOP_LISTENER).getProjectDefinition();
Map<String, Object> initiator = cfg.initiator();
if (initiator != null) {
// when the process starts the process' initiator and the current user are the same
args.put(Constants.Request.INITIATOR_KEY, initiator);
args.put(Constants.Request.CURRENT_USER_KEY, initiator);
}
return runner.start(cfg, processDefinition, args);
}
use of com.walmartlabs.concord.runtime.v2.ProjectLoaderV2 in project concord by walmartlabs.
the class AbstractParserTest method load.
protected static ProcessDefinition load(String resource) throws Exception {
URI uri = ClassLoader.getSystemResource(resource).toURI();
ProjectLoaderV2 loader = new ProjectLoaderV2(mock(ImportManager.class));
return loader.loadFromFile(Paths.get(uri)).getProjectDefinition();
}
use of com.walmartlabs.concord.runtime.v2.ProjectLoaderV2 in project concord by walmartlabs.
the class Run method call.
@Override
public Integer call() throws Exception {
sourceDir = sourceDir.normalize().toAbsolutePath();
Path targetDir;
if (Files.isRegularFile(sourceDir)) {
Path src = sourceDir.toAbsolutePath();
System.out.println("Running a single Concord file: " + src);
targetDir = Files.createTempDirectory("payload");
Files.copy(src, targetDir.resolve("concord.yml"), StandardCopyOption.REPLACE_EXISTING);
} else if (Files.isDirectory(sourceDir)) {
targetDir = sourceDir.resolve("target");
if (cleanup && Files.exists(targetDir)) {
if (verbose) {
System.out.println("Cleaning target directory");
}
IOUtils.deleteRecursively(targetDir);
}
// copy everything into target except target
IOUtils.copy(sourceDir, targetDir, "^target$", new CopyNotifier(verbose ? 0 : 100), StandardCopyOption.REPLACE_EXISTING);
} else {
throw new IllegalArgumentException("Not a directory or single Concord YAML file: " + sourceDir);
}
DependencyManager dependencyManager = initDependencyManager();
ImportManager importManager = new ImportManagerFactory(dependencyManager, new CliRepositoryExporter(repoCacheDir), Collections.emptySet()).create();
ProjectLoaderV2.Result loadResult;
try {
loadResult = new ProjectLoaderV2(importManager).load(targetDir, new CliImportsNormalizer(importsSource, verbose, defaultVersion), verbose ? new CliImportsListener() : null);
} catch (ImportProcessingException e) {
ObjectMapper om = new ObjectMapper();
System.err.println("Error while processing import " + om.writeValueAsString(e.getImport()) + ": " + e.getMessage());
return -1;
} catch (Exception e) {
System.err.println("Error while loading " + targetDir);
e.printStackTrace();
return -1;
}
ProcessDefinition processDefinition = loadResult.getProjectDefinition();
UUID instanceId = UUID.randomUUID();
if (verbose && !extraVars.isEmpty()) {
System.out.println("Additional variables: " + extraVars);
}
if (verbose && !profiles.isEmpty()) {
System.out.println("Active profiles: " + profiles);
}
ProcessConfiguration cfg = from(processDefinition.configuration()).entryPoint(entryPoint).instanceId(instanceId).build();
RunnerConfiguration runnerCfg = RunnerConfiguration.builder().dependencies(new DependencyResolver(dependencyManager, verbose).resolveDeps(processDefinition)).debug(cfg.debug()).build();
Map<String, Object> profileArgs = getProfilesArguments(processDefinition, profiles);
Map<String, Object> args = ConfigurationUtils.deepMerge(cfg.arguments(), profileArgs, extraVars);
if (verbose) {
System.out.println("Process arguments: " + args);
}
args.put(Constants.Context.TX_ID_KEY, instanceId.toString());
args.put(Constants.Context.WORK_DIR_KEY, targetDir.toAbsolutePath().toString());
if (effectiveYaml) {
Map<String, List<Step>> flows = new HashMap<>(processDefinition.flows());
for (String ap : profiles) {
Profile p = processDefinition.profiles().get(ap);
if (p != null) {
flows.putAll(p.flows());
}
}
ProcessDefinition pd = ProcessDefinition.builder().from(processDefinition).configuration(ProcessDefinitionConfiguration.builder().from(processDefinition.configuration()).arguments(args).build()).flows(flows).imports(Imports.builder().build()).profiles(Collections.emptyMap()).build();
ProjectSerializerV2 serializer = new ProjectSerializerV2();
serializer.write(pd, System.out);
return 0;
}
System.out.println("Starting...");
Injector injector = new InjectorFactory(new WorkingDirectory(targetDir), runnerCfg, () -> cfg, new ProcessDependenciesModule(targetDir, runnerCfg.dependencies(), cfg.debug()), new CliServicesModule(secretStoreDir, targetDir, new VaultProvider(vaultDir, vaultId), dependencyManager)).create();
Runner runner = injector.getInstance(Runner.class);
if (cfg.debug()) {
System.out.println("Available tasks: " + injector.getInstance(TaskProviders.class).names());
}
try {
runner.start(cfg, processDefinition, args);
} catch (Exception e) {
if (verbose) {
System.err.print("Error: ");
e.printStackTrace(System.err);
} else {
System.err.println("Error: " + e.getMessage());
}
return 1;
}
System.out.println("...done!");
return 0;
}
use of com.walmartlabs.concord.runtime.v2.ProjectLoaderV2 in project concord by walmartlabs.
the class ProjectLoaderV2Test method testMultiProjectFiles.
@Test
@SuppressWarnings("unchecked")
public void testMultiProjectFiles() throws Exception {
ProjectLoaderV2 loader = new ProjectLoaderV2(mock(ImportManager.class));
URI uri = ClassLoader.getSystemResource("multiProjectFile").toURI();
ProjectLoaderV2.Result result = loader.load(Paths.get(uri), new NoopImportsNormalizer(), ImportsListener.NOP_LISTENER);
assertNotNull(result);
assertNotNull(result.getProjectDefinition());
ProcessDefinition pd = result.getProjectDefinition();
// configuration:
ProcessDefinitionConfiguration cfg = pd.configuration();
assertNotNull(cfg);
// configuration.debug: should be collected from ROOT concord.yml
assertTrue(cfg.debug());
// configuration.activeProfiles: should be collected from ROOT concord.yml
assertEquals(Collections.singletonList("concord.yml"), cfg.activeProfiles());
// configuration.entryPoint: should be collected from ROOT concord.yml
assertEquals("root", cfg.entryPoint());
// configuration.dependencies: should be collected from ALL *.concord.yml
assertEquals(Arrays.asList("2.concord.yml", "concord.yml"), cfg.dependencies());
// configuration.arguments: should be collected from ALL *.concord.yml and mereged
assertEquals("ttt", cfg.arguments().get("abc"));
assertEquals("234", ((Map<String, Object>) cfg.arguments().get("nested")).get("value"));
// configuration.meta: should be collected from ROOT concord.yml
assertEquals(Collections.singletonMap("k", "concord.yml"), cfg.meta());
// configuration.events: should be collected from ROOT concord.yml
assertEquals(EventConfiguration.builder().recordTaskInVars(true).recordTaskOutVars(true).truncateInVars(true).truncateOutVars(true).truncateMaxStringLength(1).truncateMaxArrayLength(2).truncateMaxDepth(3).inVarsBlacklist(Arrays.asList("apiKey", "apiRootToken")).recordTaskMeta(true).truncateMeta(true).build(), cfg.events());
// configuration.requirements: should be collected from ROOT concord.yml
assertEquals(Collections.singletonMap("req", "concord.yml"), cfg.requirements());
// configuration.processTimeout: should be collected from ROOT concord.yml
assertEquals("PT1H", cfg.processTimeout().toString());
// configuration.suspendTimeout: should be collected from ROOT concord.yml
assertEquals("PT26H", cfg.suspendTimeout().toString());
// configuration.out: should be collected from ROOT concord.yml
assertEquals(Collections.singletonList("from-root"), cfg.out());
// configuration.template: should be collected from ROOT concord.yml
assertNotNull(cfg.template());
assertEquals("mytemplate", cfg.template());
// flows: should be collected from ALL *.concord.yml
// if flow has same name then most recent used
assertEquals(new HashSet<>(Arrays.asList("default", "flowN3")), pd.flows().keySet());
assertEquals(1, pd.flows().get("default").size());
assertTrue(pd.flows().get("default").get(0) instanceof Checkpoint);
assertEquals("root", ((Checkpoint) pd.flows().get("default").get(0)).getName());
// publicFlows: should be collected from ROOT concord.yml
assertEquals(Collections.singleton("root"), pd.publicFlows());
// profiles: should be collected from ALL *.concord.yml
// if profile has same name then most recent used
assertEquals(Collections.emptyMap(), pd.profiles());
// triggers: should be collected from ALL *.concord.yml
assertEquals(3, pd.triggers().size());
assertEquals(Arrays.asList("1.concord.yml", "2.concord.yml", "concord.yml"), pd.triggers().stream().map(t -> t.configuration().get("entryPoint")).collect(Collectors.toList()));
// imports: should be collected from ALL *.concord.yml
assertEquals(2, pd.imports().items().size());
assertEquals(Arrays.asList("2.concord.yml", "concord.yml"), pd.imports().items().stream().map(i -> ((Import.GitDefinition) i).url()).collect(Collectors.toList()));
// forms: should be collected from ALL *.concord.yml
// if form has same name then most recent used
assertEquals(1, pd.forms().size());
assertNotNull(pd.forms().get("myForm"));
assertEquals(1, pd.forms().get("myForm").fields().size());
assertEquals("myName3", pd.forms().get("myForm").fields().get(0).name());
// resources: should be collected from ALL *.concord.yml
assertEquals(Arrays.asList("glob:concord/{**/,}{*.,}concord.{yml,yaml}", "glob:tmp/1.yml"), pd.resources().concord());
}
Aggregations