use of io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogsSpec in project stackgres by ongres.
the class DistributedLogsTransformer method getResourceSpec.
private DistributedLogsSpec getResourceSpec(StackGresDistributedLogsSpec source) {
DistributedLogsSpec transformation = new DistributedLogsSpec();
transformation.setPersistentVolume(getResourcePersistentVolume(source.getPersistentVolume()));
transformation.setNonProduction(getResourceNonProduction(source.getNonProduction()));
transformation.setPostgresServices(new DistributedLogsPostgresServicesConverter().from(source.getPostgresServices()));
transformation.setScheduling(Optional.ofNullable(source.getScheduling()).map(sourcePodScheduling -> {
DistributedLogsPodScheduling podScheduling = new DistributedLogsPodScheduling();
podScheduling.setNodeSelector(sourcePodScheduling.getNodeSelector());
podScheduling.setTolerations(sourcePodScheduling.getTolerations());
return podScheduling;
}).orElse(null));
Optional.ofNullable(source.getMetadata()).map(StackGresDistributedLogsSpecMetadata::getAnnotations).ifPresent(sourceAnnotations -> {
transformation.setMetadata(new DistributedLogsSpecMetadata());
final DistributedLogsSpecAnnotations targetAnnotations = new DistributedLogsSpecAnnotations();
transformation.getMetadata().setAnnotations(targetAnnotations);
if (sourceAnnotations.getAllResources() != null) {
targetAnnotations.setAllResources(sourceAnnotations.getAllResources());
}
if (sourceAnnotations.getPods() != null) {
targetAnnotations.setPods(sourceAnnotations.getPods());
}
if (sourceAnnotations.getServices() != null) {
targetAnnotations.setServices(sourceAnnotations.getServices());
}
});
if (source.getToInstallPostgresExtensions() != null) {
transformation.setToInstallPostgresExtensions(source.getToInstallPostgresExtensions().stream().map(this::getClusterInstalledExtension).collect(ImmutableList.toImmutableList()));
}
return transformation;
}
use of io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogsSpec in project stackgres by ongres.
the class StackGresDistributedLogsUtilTest method shouldBuildSgDistributedLogsPostgresServices_withOnlyReplicas.
@Test
void shouldBuildSgDistributedLogsPostgresServices_withOnlyReplicas() {
StackGresDistributedLogsSpec spec = new StackGresDistributedLogsSpecFixture().withReplicasPostgresServices(replicas).build();
StackGresClusterPostgresServices postgresServices = StackGresDistributedLogsUtil.buildPostgresServices(spec);
assertNull(postgresServices.getPrimary());
assertNotNull(postgresServices.getReplicas());
assertTrue(replicas.equals(postgresServices.getReplicas()));
}
use of io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogsSpec in project stackgres by ongres.
the class StackGresDistributedLogsUtilTest method shouldBuildSgDistributedLogsPostgresServices_withOnlyPrimary.
@Test
void shouldBuildSgDistributedLogsPostgresServices_withOnlyPrimary() {
StackGresDistributedLogsSpec spec = new StackGresDistributedLogsSpecFixture().withPrimaryPostgresServices(primary).build();
StackGresClusterPostgresServices postgresServices = StackGresDistributedLogsUtil.buildPostgresServices(spec);
assertNotNull(postgresServices.getPrimary());
assertNull(postgresServices.getReplicas());
assertTrue(primary.equals(postgresServices.getPrimary()));
}
use of io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogsSpec in project stackgres by ongres.
the class DistributedLogsPodTemplateSpecFactory method getPodTemplateSpec.
@Override
public PodTemplateResult getPodTemplateSpec(DistributedLogsContainerContext context) {
StackGresDistributedLogs cluster = context.getDistributedLogsContext().getSource();
final Map<String, String> podLabels = labelFactory.statefulSetPodLabels(cluster);
List<ContainerFactory<DistributedLogsContainerContext>> containerFactories = containerFactoryDiscoverer.discoverContainers(context);
List<Container> containers = containerFactories.stream().map(f -> f.getContainer(context)).collect(Collectors.toUnmodifiableList());
final List<ContainerFactory<DistributedLogsContainerContext>> initContainerFactories = initContainerFactoryDiscoverer.discoverContainers(context);
List<Container> initContainers = initContainerFactories.stream().map(f -> f.getContainer(context)).collect(Collectors.toUnmodifiableList());
final List<String> claimedVolumes = Stream.concat(containers.stream(), initContainers.stream()).flatMap(container -> container.getVolumeMounts().stream()).map(VolumeMount::getName).distinct().collect(Collectors.toUnmodifiableList());
claimedVolumes.forEach(rv -> {
if (!context.availableVolumes().containsKey(rv) && !context.getDataVolumeName().equals(rv)) {
throw new IllegalStateException("Volume " + rv + " is required but not available");
}
});
List<Volume> volumes = claimedVolumes.stream().map(volumeName -> context.availableVolumes().get(volumeName)).filter(Objects::nonNull).collect(Collectors.toUnmodifiableList());
var podTemplateSpec = new PodTemplateSpecBuilder().withMetadata(new ObjectMetaBuilder().addToLabels(podLabels).addToAnnotations(StackGresContext.VERSION_KEY, cluster.getMetadata().getAnnotations().getOrDefault(StackGresContext.VERSION_KEY, StackGresProperty.OPERATOR_VERSION.getString())).build()).withNewSpec().withAffinity(Optional.of(new AffinityBuilder().withPodAntiAffinity(new PodAntiAffinityBuilder().addAllToRequiredDuringSchedulingIgnoredDuringExecution(ImmutableList.of(new PodAffinityTermBuilder().withLabelSelector(new LabelSelectorBuilder().withMatchExpressions(new LabelSelectorRequirementBuilder().withKey(StackGresContext.APP_KEY).withOperator("In").withValues(labelFactory.labelMapper().appName()).build(), new LabelSelectorRequirementBuilder().withKey("cluster").withOperator("In").withValues("true").build()).build()).withTopologyKey("kubernetes.io/hostname").build())).build()).build()).filter(affinity -> Optional.ofNullable(cluster.getSpec().getNonProduction()).map(StackGresDistributedLogsNonProduction::getDisableClusterPodAntiAffinity).map(disableClusterPodAntiAffinity -> !disableClusterPodAntiAffinity).orElse(true)).orElse(null)).withNodeSelector(Optional.ofNullable(cluster.getSpec()).map(StackGresDistributedLogsSpec::getScheduling).map(StackGresDistributedLogsPodScheduling::getNodeSelector).orElse(null)).withTolerations(Optional.ofNullable(cluster.getSpec()).map(StackGresDistributedLogsSpec::getScheduling).map(StackGresDistributedLogsPodScheduling::getTolerations).map(tolerations -> Seq.seq(tolerations).map(TolerationBuilder::new).map(TolerationBuilder::build).toList()).orElse(null)).withShareProcessNamespace(Boolean.TRUE).withServiceAccountName(PatroniRole.roleName(context.getDistributedLogsContext())).withSecurityContext(podSecurityContext.createResource(context.getDistributedLogsContext())).withVolumes(volumes).withContainers(containers).withInitContainers(initContainers).withTerminationGracePeriodSeconds(60L).endSpec().build();
return ImmutablePodTemplateResult.builder().spec(podTemplateSpec).claimedVolumes(claimedVolumes).build();
}
use of io.stackgres.common.crd.sgdistributedlogs.StackGresDistributedLogsSpec in project stackgres by ongres.
the class DefaultPostgresServicesMutator method validatePgServices.
private ImmutableList<JsonPatchOperation> validatePgServices(ImmutableList.Builder<JsonPatchOperation> operations, StackGresDistributedLogsSpec spec) {
return Optional.ofNullable(spec.getPostgresServices()).map(pgServices -> {
mapPgPrimaryService(pgServices);
mapPgReplicasService(pgServices);
JsonNode target = JSON_MAPPER.valueToTree(pgServices);
operations.add(applyReplaceValue(postgresServicesPointer, target));
return operations.build();
}).orElseGet(() -> {
StackGresDistributedLogsPostgresServices pgServices = new StackGresDistributedLogsPostgresServices();
pgServices.setPrimary(createPostgresServicePrimary());
pgServices.setReplicas(createPostgresServiceReplicas());
JsonNode target = JSON_MAPPER.valueToTree(pgServices);
operations.add(applyAddValue(postgresServicesPointer, target));
return operations.build();
});
}
Aggregations