use of com.hartwig.platinum.config.BatchConfiguration in project platinum by hartwigmedical.
the class KubernetesEngine method findOrCreate.
public KubernetesCluster findOrCreate(final String runName, final List<TumorNormalPair> pairs, final JsonKey jsonKey, final String outputBucketName, final String serviceAccountEmail) {
try {
String clusterName = configuration.cluster().orElse(runName);
GcpConfiguration gcpConfiguration = configuration.gcp();
String parent = String.format("projects/%s/locations/%s", gcpConfiguration.projectOrThrow(), gcpConfiguration.regionOrThrow());
if (find(fullPath(gcpConfiguration.projectOrThrow(), gcpConfiguration.regionOrThrow(), clusterName)).isEmpty()) {
create(containerApi, parent, clusterName, gcpConfiguration);
}
if (!configuration.inCluster()) {
if (!processRunner.execute(of("gcloud", "container", "clusters", "get-credentials", clusterName, "--region", gcpConfiguration.regionOrThrow(), "--project", gcpConfiguration.projectOrThrow()))) {
throw new RuntimeException("Failed to get credentials for cluster");
}
if (!processRunner.execute(of("kubectl", "get", "configmaps"))) {
throw new RuntimeException("Failed to run kubectl command against cluster");
}
LOGGER.info("Connection to cluster {} configured via gcloud and kubectl", Console.bold(clusterName));
}
DefaultKubernetesClient kubernetesClient = new DefaultKubernetesClient();
TargetNodePool targetNodePool = configuration.gcp().nodePoolConfiguration().map(c -> TargetNodePool.fromConfig(c, configuration.batch().map(BatchConfiguration::size).orElse(configuration.samples().isEmpty() ? configuration.sampleIds().size() : configuration.samples().size()))).orElse(TargetNodePool.defaultPool());
if (!targetNodePool.isDefault()) {
new GcloudNodePool(processRunner).create(targetNodePool, serviceAccountEmail, clusterName, gcpConfiguration.projectOrThrow());
}
return new KubernetesCluster(runName, new JobScheduler(kubernetesClient, configuration.retryFailed()), new PipelineServiceAccountSecretVolume(jsonKey, kubernetesClient, "service-account-key"), new PipelineConfigMapVolume(pairs, kubernetesClient, runName), outputBucketName, serviceAccountEmail, configuration, Delay.threadSleep(), targetNodePool);
} catch (Exception e) {
throw new RuntimeException("Failed to create cluster", e);
}
}
use of com.hartwig.platinum.config.BatchConfiguration in project platinum by hartwigmedical.
the class KubernetesCluster method submit.
public int submit(final List<SampleArgument> samples) {
Volume configMapVolume = configMap.asKubernetes();
Volume secretVolume = serviceAccountSecret.asKubernetes();
Volume maybeJksVolume = new JksSecret().asKubernetes();
int numSubmitted = 0;
for (SampleArgument sample : samples) {
try {
PipelineContainer pipelineContainer = new PipelineContainer(sample, runName, new PipelineArguments(configuration.argumentOverrides(), outputBucketName, serviceAccountEmail, runName, configuration), secretVolume.getName(), configMapVolume.getName(), configuration.image());
if (scheduler.submit(new PipelineJob(runName, sample.id(), configuration.keystorePassword().map(p -> new JksEnabledContainer(pipelineContainer.asKubernetes(), maybeJksVolume, p).asKubernetes()).orElse(pipelineContainer.asKubernetes()), concat(of(configMapVolume, secretVolume), configuration.keystorePassword().map(p -> maybeJksVolume).stream()).collect(toList()), targetNodePool, configuration.gcp().jobTtl().orElse(Duration.ZERO)))) {
numSubmitted++;
if (configuration.batch().isPresent()) {
BatchConfiguration batchConfiguration = configuration.batch().get();
if (numSubmitted % batchConfiguration.size() == 0) {
LOGGER.info("Batch of [{}] of [{}] scheduled, waiting [{}] minutes", (numSubmitted / batchConfiguration.size()), (samples.size() / batchConfiguration.size()), batchConfiguration.delay());
delay.forMinutes(batchConfiguration.delay());
}
}
}
} catch (KubernetesClientException e) {
LOGGER.warn("Refreshing K8 client as an error was encountered. ", e);
scheduler.refresh(configuration.cluster().orElse(runName), configuration.gcp());
}
}
return numSubmitted;
}
Aggregations