use of io.stackgres.common.crd.sgcluster.StackGresClusterPod in project stackgres by ongres.
the class ClusterResourceMockedTest method checkCustomResource.
@Override
protected void checkCustomResource(StackGresCluster resource, ClusterDto resourceDto, Operation operation) {
final Metadata dtoMetadata = resourceDto.getMetadata();
final ObjectMeta resourceMetadata = resource.getMetadata();
if (dtoMetadata != null) {
assertNotNull(resourceMetadata);
assertEquals(dtoMetadata.getName(), resourceMetadata.getName());
assertEquals(dtoMetadata.getNamespace(), resourceMetadata.getNamespace());
assertEquals(dtoMetadata.getUid(), resourceMetadata.getUid());
} else {
assertNull(resourceMetadata);
}
final ClusterSpec dtoSpec = resourceDto.getSpec();
final StackGresClusterSpec resourceSpec = resource.getSpec();
if (dtoSpec != null) {
assertNotNull(resourceSpec);
assertEquals(dtoSpec.getPrometheusAutobind(), resourceSpec.getPrometheusAutobind());
assertEquals(dtoSpec.getInstances(), resourceSpec.getInstances());
assertEquals(dtoSpec.getPostgres().getVersion(), resourceSpec.getPostgres().getVersion());
assertEquals(dtoSpec.getSgInstanceProfile(), resourceSpec.getResourceProfile());
final ClusterConfiguration dtoSpecConfigurations = dtoSpec.getConfigurations();
final StackGresClusterConfiguration resourceSpecConfiguration = resourceSpec.getConfiguration();
if (dtoSpecConfigurations != null) {
assertNotNull(resourceSpecConfiguration);
assertEquals(dtoSpecConfigurations.getSgBackupConfig(), resourceSpecConfiguration.getBackupConfig());
assertEquals(dtoSpecConfigurations.getSgPoolingConfig(), resourceSpecConfiguration.getConnectionPoolingConfig());
assertEquals(dtoSpecConfigurations.getSgPostgresConfig(), resourceSpecConfiguration.getPostgresConfig());
} else {
assertNull(resourceSpecConfiguration);
}
final ClusterPod dtoSpecPods = dtoSpec.getPods();
if (dtoSpecPods != null) {
final StackGresClusterPod resourceSpecPod = resourceSpec.getPod();
assertNotNull(resourceSpecPod);
assertEquals(dtoSpecPods.getDisableConnectionPooling(), resourceSpecPod.getDisableConnectionPooling());
assertEquals(dtoSpecPods.getDisableMetricsExporter(), resourceSpecPod.getDisableMetricsExporter());
assertEquals(dtoSpecPods.getDisableMetricsExporter(), resourceSpecPod.getDisableMetricsExporter());
final ClusterPodPersistentVolume dtoPV = dtoSpecPods.getPersistentVolume();
final StackGresPodPersistentVolume resourcePV = resourceSpecPod.getPersistentVolume();
if (dtoPV != null) {
assertNotNull(resourcePV);
assertEquals(dtoPV.getSize(), resourcePV.getSize());
assertEquals(dtoPV.getStorageClass(), resourcePV.getStorageClass());
} else {
assertNull(resourcePV);
}
final StackGresClusterSpecLabels resourceMetadataLabels = Optional.ofNullable(resourceSpec.getMetadata()).map(StackGresClusterSpecMetadata::getLabels).orElse(null);
final ClusterSpecLabels dtoMetadataLabels = Optional.ofNullable(dtoSpec.getMetadata()).map(ClusterSpecMetadata::getLabels).orElse(null);
if (dtoMetadataLabels != null) {
assertNotNull(resourceMetadataLabels);
assertEquals(dtoMetadataLabels.getClusterPods(), resourceMetadataLabels.getClusterPods());
} else {
assertNull(resourceMetadataLabels);
}
final ClusterPodScheduling podScheduling = dtoSpecPods.getScheduling();
final StackGresClusterPodScheduling resourceScheduling = resourceSpecPod.getScheduling();
if (podScheduling != null) {
assertNotNull(resourceScheduling);
assertEquals(podScheduling.getNodeSelector(), resourceScheduling.getNodeSelector());
assertEquals(podScheduling.getNodeAffinity(), resourceScheduling.getNodeAffinity());
} else {
assertNull(resourceScheduling);
}
}
final ClusterInitData dtoInitData = dtoSpec.getInitData();
final StackGresClusterInitData resourceInitData = resourceSpec.getInitData();
if (dtoInitData != null) {
assertNotNull(resourceInitData);
final ClusterRestore dtoRestore = dtoInitData.getRestore();
final StackGresClusterRestore resourceRestore = resourceInitData.getRestore();
if (dtoRestore != null) {
assertNotNull(resourceRestore);
assertEquals(dtoRestore.getFromBackup().getUid(), resourceRestore.getFromBackup().getUid());
} else {
assertNull(resourceRestore);
}
if (dtoInitData.getScripts() != null) {
assertNotNull(resourceInitData.getScripts());
assertEquals(dtoInitData.getScripts().size(), resourceInitData.getScripts().size());
Seq.zip(dtoInitData.getScripts(), resourceInitData.getScripts()).forEach(entryTuple -> {
ClusterScriptEntry dtoEntry = entryTuple.v1;
StackGresClusterScriptEntry resourceEntry = entryTuple.v2;
assertEquals(dtoEntry.getDatabase(), resourceEntry.getDatabase());
assertEquals(dtoEntry.getName(), resourceEntry.getName());
assertEquals(dtoEntry.getScript(), resourceEntry.getScript());
final ClusterScriptFrom dtoScriptFrom = dtoEntry.getScriptFrom();
final StackGresClusterScriptFrom resourceScriptFrom = resourceEntry.getScriptFrom();
if (dtoScriptFrom != null) {
assertNotNull(resourceScriptFrom);
final SecretKeySelector dtoSecretKeyRef = dtoScriptFrom.getSecretKeyRef();
final SecretKeySelector resourceSecretKeyRef = resourceScriptFrom.getSecretKeyRef();
if (dtoSecretKeyRef != null) {
assertNotNull(resourceSecretKeyRef);
assertEquals(dtoSecretKeyRef.getName(), resourceSecretKeyRef.getName());
assertEquals(dtoSecretKeyRef.getKey(), resourceSecretKeyRef.getKey());
} else {
assertNull(resourceSecretKeyRef);
}
final ConfigMapKeySelector resourceConfigMapKeyRef = resourceScriptFrom.getConfigMapKeyRef();
final ConfigMapKeySelector dtoConfigMapKeyRef = dtoScriptFrom.getConfigMapKeyRef();
if (dtoConfigMapKeyRef != null) {
assertNotNull(resourceConfigMapKeyRef);
assertEquals(dtoConfigMapKeyRef.getName(), resourceConfigMapKeyRef.getName());
assertEquals(dtoConfigMapKeyRef.getKey(), resourceConfigMapKeyRef.getKey());
} else {
assertNull(resourceConfigMapKeyRef);
}
} else {
assertNull(resourceScriptFrom);
}
});
}
} else {
assertNull(resourceInitData);
}
if (dtoSpec.getDistributedLogs() != null) {
assertNotNull(resourceSpec.getDistributedLogs());
assertEquals(dtoSpec.getDistributedLogs().getDistributedLogs(), resourceSpec.getDistributedLogs().getDistributedLogs());
} else {
assertNull(resourceSpec.getDistributedLogs());
}
} else {
assertNull(resourceSpec);
}
}
use of io.stackgres.common.crd.sgcluster.StackGresClusterPod in project stackgres by ongres.
the class StackGresDistributedLogsUtil method getStackGresClusterForDistributedLogs.
static StackGresCluster getStackGresClusterForDistributedLogs(StackGresDistributedLogs distributedLogs) {
final StackGresCluster distributedLogsCluster = new StackGresCluster();
distributedLogsCluster.getMetadata().setNamespace(distributedLogs.getMetadata().getNamespace());
distributedLogsCluster.getMetadata().setName(distributedLogs.getMetadata().getName());
distributedLogsCluster.getMetadata().setUid(distributedLogs.getMetadata().getUid());
final StackGresClusterSpec spec = new StackGresClusterSpec();
spec.setPostgres(new StackGresClusterPostgres());
spec.getPostgres().setVersion(getPostgresVersion());
spec.setInstances(1);
final StackGresClusterPod pod = new StackGresClusterPod();
final StackGresPodPersistentVolume persistentVolume = new StackGresPodPersistentVolume();
persistentVolume.setSize(distributedLogs.getSpec().getPersistentVolume().getSize());
persistentVolume.setStorageClass(distributedLogs.getSpec().getPersistentVolume().getStorageClass());
pod.setPersistentVolume(persistentVolume);
spec.setPostgresServices(buildPostgresServices(distributedLogs.getSpec()));
StackGresClusterPodScheduling scheduling = new StackGresClusterPodScheduling();
Optional.of(distributedLogs).map(StackGresDistributedLogs::getSpec).map(StackGresDistributedLogsSpec::getScheduling).ifPresent(distributedLogsScheduling -> {
scheduling.setNodeSelector(distributedLogsScheduling.getNodeSelector());
scheduling.setTolerations(distributedLogsScheduling.getTolerations());
});
pod.setScheduling(scheduling);
spec.setPod(pod);
final StackGresClusterInitData initData = new StackGresClusterInitData();
final StackGresClusterScriptEntry script = new StackGresClusterScriptEntry();
script.setName("distributed-logs-template");
script.setDatabase("template1");
script.setScript(Unchecked.supplier(() -> Resources.asCharSource(StackGresDistributedLogsUtil.class.getResource("/distributed-logs-template.sql"), StandardCharsets.UTF_8).read()).get());
initData.setScripts(ImmutableList.of(script));
spec.setInitData(initData);
final StackGresClusterNonProduction nonProduction = new StackGresClusterNonProduction();
nonProduction.setDisableClusterPodAntiAffinity(Optional.ofNullable(distributedLogs.getSpec().getNonProduction()).map(StackGresDistributedLogsNonProduction::getDisableClusterPodAntiAffinity).orElse(false));
spec.setNonProduction(nonProduction);
final StackGresClusterSpecMetadata metadata = new StackGresClusterSpecMetadata();
final StackGresClusterSpecAnnotations annotations = new StackGresClusterSpecAnnotations();
Optional.of(distributedLogs).map(StackGresDistributedLogs::getSpec).map(StackGresDistributedLogsSpec::getMetadata).map(StackGresDistributedLogsSpecMetadata::getAnnotations).ifPresent(distributedLogsAnnotations -> {
annotations.setAllResources(distributedLogsAnnotations.getAllResources());
annotations.setClusterPods(distributedLogsAnnotations.getPods());
annotations.setPrimaryService(distributedLogsAnnotations.getServices());
annotations.setReplicasService(distributedLogsAnnotations.getServices());
});
metadata.setAnnotations(annotations);
spec.setMetadata(metadata);
spec.setToInstallPostgresExtensions(Optional.ofNullable(distributedLogs.getSpec()).map(StackGresDistributedLogsSpec::getToInstallPostgresExtensions).orElse(null));
distributedLogsCluster.setSpec(spec);
return distributedLogsCluster;
}
use of io.stackgres.common.crd.sgcluster.StackGresClusterPod in project stackgres by ongres.
the class ClusterTransformer method getCustomResourceSpec.
private StackGresClusterSpec getCustomResourceSpec(ClusterSpec source) {
if (source == null) {
return null;
}
StackGresClusterSpec transformation = new StackGresClusterSpec();
transformation.setPostgres(new StackGresClusterPostgres());
transformation.getPostgres().setVersion(source.getPostgres().getVersion());
transformation.getPostgres().setExtensions(Optional.ofNullable(source.getPostgres().getExtensions()).stream().flatMap(List::stream).map(this::getCustomResourceExtension).collect(ImmutableList.toImmutableList()));
final ClusterSsl sourceClusterSsl = source.getPostgres().getSsl();
if (sourceClusterSsl != null) {
transformation.getPostgres().setSsl(new StackGresClusterSsl());
transformation.getPostgres().getSsl().setEnabled(sourceClusterSsl.getEnabled());
transformation.getPostgres().getSsl().setCertificateSecretKeySelector(sourceClusterSsl.getCertificateSecretKeySelector());
transformation.getPostgres().getSsl().setPrivateKeySecretKeySelector(sourceClusterSsl.getPrivateKeySecretKeySelector());
}
final ClusterConfiguration sourceClusterConfiguration = source.getConfigurations();
if (sourceClusterConfiguration != null) {
transformation.setConfiguration(new StackGresClusterConfiguration());
transformation.getConfiguration().setBackupConfig(source.getConfigurations().getSgBackupConfig());
transformation.getConfiguration().setConnectionPoolingConfig(source.getConfigurations().getSgPoolingConfig());
transformation.getConfiguration().setPostgresConfig(source.getConfigurations().getSgPostgresConfig());
}
transformation.setInstances(source.getInstances());
transformation.setNonProduction(getCustomResourceNonProduction(source.getNonProduction()));
transformation.setPrometheusAutobind(source.getPrometheusAutobind());
transformation.setResourceProfile(source.getSgInstanceProfile());
final ClusterSpecMetadata specMetadata = source.getMetadata();
if (specMetadata != null) {
transformation.setMetadata(new StackGresClusterSpecMetadata());
final ClusterSpecAnnotations sourceAnnotations = specMetadata.getAnnotations();
if (sourceAnnotations != null) {
StackGresClusterSpecAnnotations targetAnnotations = new StackGresClusterSpecAnnotations();
targetAnnotations.setAllResources(sourceAnnotations.getAllResources());
targetAnnotations.setClusterPods(sourceAnnotations.getClusterPods());
targetAnnotations.setServices(sourceAnnotations.getServices());
targetAnnotations.setPrimaryService(sourceAnnotations.getPrimaryService());
targetAnnotations.setReplicasService(sourceAnnotations.getReplicasService());
transformation.getMetadata().setAnnotations(targetAnnotations);
}
final ClusterSpecLabels sourceLabels = specMetadata.getLabels();
if (sourceLabels != null) {
StackGresClusterSpecLabels targetLabels = new StackGresClusterSpecLabels();
targetLabels.setClusterPods(sourceLabels.getClusterPods());
transformation.getMetadata().setLabels(targetLabels);
}
}
final ClusterPostgresServices sourcePostgresServices = source.getPostgresServices();
if (sourcePostgresServices != null) {
transformation.setPostgresServices(new StackGresClusterPostgresServices());
final StackGresClusterPostgresServices targetPostgresService = transformation.getPostgresServices();
final PostgresService sourcePrimaryService = sourcePostgresServices.getPrimary();
if (sourcePrimaryService != null) {
targetPostgresService.setPrimary(new StackGresPostgresService());
final StackGresPostgresService targetPrimaryService = targetPostgresService.getPrimary();
targetPrimaryService.setType(sourcePrimaryService.getType());
targetPrimaryService.setEnabled(sourcePrimaryService.getEnabled());
}
final PostgresService sourceReplicaService = sourcePostgresServices.getReplicas();
if (sourceReplicaService != null) {
targetPostgresService.setReplicas(new StackGresPostgresService());
final StackGresPostgresService targetReplicaService = targetPostgresService.getReplicas();
targetReplicaService.setEnabled(sourceReplicaService.getEnabled());
targetReplicaService.setType(sourceReplicaService.getType());
}
}
final ClusterInitData sourceInitData = source.getInitData();
if (sourceInitData != null) {
final StackGresClusterInitData targetInitData = new StackGresClusterInitData();
transformation.setInitData(targetInitData);
if (sourceInitData.getRestore() != null) {
targetInitData.setRestore(getCustomResourceRestore(sourceInitData.getRestore()));
}
if (sourceInitData.getScripts() != null) {
targetInitData.setScripts(getCustomResourceScripts(sourceInitData.getScripts()));
}
}
final StackGresClusterPod targetPod = new StackGresClusterPod();
transformation.setPod(targetPod);
targetPod.setPersistentVolume(new StackGresPodPersistentVolume());
targetPod.getPersistentVolume().setStorageClass(source.getPods().getPersistentVolume().getStorageClass());
targetPod.getPersistentVolume().setSize(source.getPods().getPersistentVolume().getSize());
targetPod.setDisableConnectionPooling(source.getPods().getDisableConnectionPooling());
targetPod.setDisableMetricsExporter(source.getPods().getDisableMetricsExporter());
targetPod.setDisablePostgresUtil(source.getPods().getDisablePostgresUtil());
targetPod.setScheduling(Optional.ofNullable(source.getPods().getScheduling()).map(sourceScheduling -> {
return new ClusterPodSchedulingConverter().to(sourceScheduling);
}).orElse(null));
transformation.setDistributedLogs(getCustomResourceDistributedLogs(source.getDistributedLogs()));
return transformation;
}
use of io.stackgres.common.crd.sgcluster.StackGresClusterPod in project stackgres by ongres.
the class PodTemplateSpecFactory method getPodTemplateSpec.
@Override
public PodTemplateResult getPodTemplateSpec(StackGresClusterContainerContext context) {
final List<ContainerFactory<StackGresClusterContainerContext>> containerFactories = containerFactoryDiscoverer.discoverContainers(context);
final List<Container> containers = containerFactories.stream().map(f -> f.getContainer(context)).collect(Collectors.toUnmodifiableList());
Map<String, String> componentVersions = containerFactories.stream().map(f -> f.getComponentVersions(context)).map(Map::entrySet).flatMap(Set::stream).distinct().collect(ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue));
final List<ContainerFactory<StackGresClusterContainerContext>> 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());
StackGresCluster cluster = context.getClusterContext().getSource();
final Map<String, String> podLabels = labelFactory.statefulSetPodLabels(cluster);
final Map<String, String> customPodLabels = podsCustomLabels(cluster);
var podTemplate = new PodTemplateSpecBuilder().withMetadata(new ObjectMetaBuilder().addToLabels(customPodLabels).addToLabels(podLabels).addToAnnotations(StackGresContext.VERSION_KEY, StackGresProperty.OPERATOR_VERSION.getString()).addToAnnotations(componentVersions).build()).withNewSpec().withAffinity(new AffinityBuilder().withNodeAffinity(buildPodNodeAffinity(cluster)).withPodAntiAffinity(new PodAntiAffinityBuilder().addAllToRequiredDuringSchedulingIgnoredDuringExecution(Optional.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()).filter(ignore -> Optional.ofNullable(cluster.getSpec().getNonProduction()).map(StackGresClusterNonProduction::getDisableClusterPodAntiAffinity).map(disableClusterPodAntiAffinity -> !disableClusterPodAntiAffinity).orElse(true)).stream().collect(Collectors.toList())).build()).build()).withNodeSelector(Optional.ofNullable(cluster.getSpec()).map(StackGresClusterSpec::getPod).map(StackGresClusterPod::getScheduling).map(StackGresClusterPodScheduling::getNodeSelector).orElse(null)).withTolerations(Optional.ofNullable(cluster.getSpec()).map(StackGresClusterSpec::getPod).map(StackGresClusterPod::getScheduling).map(StackGresClusterPodScheduling::getTolerations).map(tolerations -> Seq.seq(tolerations).map(TolerationBuilder::new).map(TolerationBuilder::build).toList()).orElse(null)).withShareProcessNamespace(Boolean.TRUE).withServiceAccountName(PatroniRoleGenerator.roleName(context.getClusterContext())).withSecurityContext(podSecurityContext.createResource(context.getClusterContext())).withVolumes(volumes).withContainers(containers).withInitContainers(initContainers).withTerminationGracePeriodSeconds(60L).endSpec().build();
return ImmutablePodTemplateResult.builder().spec(podTemplate).claimedVolumes(claimedVolumes).build();
}
Aggregations