Skip to content

Commit

Permalink
review: Well Known Label Enricher
Browse files Browse the repository at this point in the history
Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
manusa committed Feb 5, 2024
1 parent 6e214f2 commit 2fc40ac
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.function.BiFunction;

public class MapUtil {
Expand Down Expand Up @@ -54,7 +55,8 @@ public static void mergeIfAbsent(Map<String, String> map, Map<String, String> to
* @param <V> second type
* @return merged hash map
*/
public static <K,V> Map<K,V> mergeMaps(Map<K, V> ...maps) {
@SafeVarargs
public static <K,V> Map<K,V> mergeMaps(Map<K, V>... maps) {
Map<K, V> answer = new HashMap<>();
for (int i = maps.length-1; i >= 0; i--) {
if (maps[i] != null) {
Expand All @@ -65,6 +67,25 @@ public static <K,V> Map<K,V> mergeMaps(Map<K, V> ...maps) {

}

/**
* Returns a new map with all the entries the provided properties merged.
*
* The first arguments take precedence over the later ones.
* i.e. properties defined in the last argument will not override properties defined in the first argument.
*
* @param properties var arg for properties
* @return merged hash map
*/
public static Map<String, String> mergeMaps(Properties... properties) {
Map<String, String> answer = new HashMap<>();
for (int i = properties.length-1; i >= 0; i--) {
if (properties[i] != null) {
answer.putAll(PropertiesUtil.toMap(properties[i]));
}
}
return answer;
}

/**
* Copies all the elements i.e., the mappings, from toPut map into ret, if toPut isn't null.
* @param ret target hash map
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,35 @@
import io.fabric8.kubernetes.api.builder.TypedVisitor;
import io.fabric8.kubernetes.api.model.KubernetesListBuilder;
import io.fabric8.kubernetes.api.model.LabelSelector;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder;
import io.fabric8.kubernetes.api.model.ReplicationControllerSpec;
import io.fabric8.kubernetes.api.model.ServiceBuilder;
import io.fabric8.kubernetes.api.model.ServiceSpec;
import io.fabric8.kubernetes.api.model.apps.DaemonSetBuilder;
import io.fabric8.kubernetes.api.model.apps.DaemonSetSpec;
import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;
import io.fabric8.kubernetes.api.model.apps.ReplicaSetBuilder;
import io.fabric8.kubernetes.api.model.apps.ReplicaSetSpec;
import io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder;
import io.fabric8.kubernetes.api.model.apps.StatefulSetSpec;
import io.fabric8.openshift.api.model.DeploymentConfigBuilder;
import io.fabric8.openshift.api.model.DeploymentConfigSpec;
import org.eclipse.jkube.kit.common.util.MapUtil;
import org.eclipse.jkube.kit.common.util.PropertiesUtil;
import org.eclipse.jkube.kit.config.resource.MetaDataConfig;
import org.eclipse.jkube.kit.config.resource.PlatformMode;
import org.eclipse.jkube.kit.config.resource.ResourceConfig;
import org.eclipse.jkube.kit.enricher.api.BaseEnricher;
import org.eclipse.jkube.kit.enricher.api.EnricherContext;
import org.eclipse.jkube.kit.enricher.api.model.Configuration;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;

import static org.eclipse.jkube.kit.common.util.PropertiesUtil.toMap;

public abstract class AbstractLabelEnricher extends BaseEnricher {
protected AbstractLabelEnricher(EnricherContext enricherContext, String name) {
super(enricherContext, name);
Expand All @@ -55,101 +53,101 @@ protected AbstractLabelEnricher(EnricherContext enricherContext, String name) {
abstract Map<String, String> createLabels(boolean withoutVersion, Map<String, String> labelsViaResourceConfig);

@Override
@SuppressWarnings("unchecked")
public void create(PlatformMode platformMode, KubernetesListBuilder builder) {
builder.accept(new TypedVisitor<ServiceBuilder>() {
@Override
public void visit(ServiceBuilder serviceBuilder) {
Map<String, String> selectors = new HashMap<>();
Map<String, String> labelsConfiguredViaResourceConfig = MapUtil.mergeMaps(
toMap(getResourceConfigLabels().getService()),
toMap(getResourceConfigLabels().getAll()));
if(serviceBuilder.buildSpec() != null && serviceBuilder.buildSpec().getSelector() != null) {
selectors.putAll(serviceBuilder.buildSpec().getSelector());
}
MapUtil.mergeIfAbsent(selectors, createLabels(true, labelsConfiguredViaResourceConfig));
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(serviceBuilder.buildSpec())
.map(ServiceSpec::getSelector)
.orElse(new HashMap<>()),
false,
getResourceConfigLabels().getService(),getResourceConfigLabels().getAll());
serviceBuilder.editOrNewSpec().addToSelector(selectors).endSpec();
}
});

builder.accept(new TypedVisitor<DeploymentBuilder>() {
@Override
public void visit(DeploymentBuilder builder) {
final Map<String, String> selectors = mergedSelectors(Optional.ofNullable(builder.buildSpec())
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(DeploymentSpec::getSelector)
.map(LabelSelector::getMatchLabels)
.orElse(new HashMap<>()), Arrays.asList(
getResourceConfigLabels().getDeployment(),
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll()));
.orElse(new HashMap<>()),
false,
getResourceConfigLabels().getDeployment(),
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll());
builder.editOrNewSpec().editOrNewSelector().withMatchLabels(selectors).endSelector().endSpec();
}
});

builder.accept(new TypedVisitor<DeploymentConfigBuilder>() {
@Override
public void visit(DeploymentConfigBuilder builder) {
final Map<String, String> selectors = mergedSelectors(Optional.ofNullable(builder.buildSpec())
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(DeploymentConfigSpec::getSelector)
.orElse(new HashMap<>()), Arrays.asList(
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll()));
.orElse(new HashMap<>()),
false,
getResourceConfigLabels().getPod(), getResourceConfigLabels().getAll());
builder.editOrNewSpec().addToSelector(selectors).endSpec();
}
});

builder.accept(new TypedVisitor<DaemonSetBuilder>() {
@Override
public void visit(DaemonSetBuilder builder) {
Map<String, String> selectors = new HashMap<>();
Map<String, String> labelsFromResourceConfig = MapUtil.mergeMaps(
toMap(getResourceConfigLabels().getPod()),
toMap(getResourceConfigLabels().getAll()));
if(builder.buildSpec() != null && builder.buildSpec().getSelector() != null && builder.buildSpec().getSelector().getMatchLabels() != null) {
selectors.putAll(builder.buildSpec().getSelector().getMatchLabels());
}
MapUtil.mergeIfAbsent(selectors, createLabels(false, labelsFromResourceConfig));
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(DaemonSetSpec::getSelector)
.map(LabelSelector::getMatchLabels)
.orElse(new HashMap<>()),
true, getResourceConfigLabels().getAll());
builder.editOrNewSpec().editOrNewSelector().withMatchLabels(selectors).endSelector().endSpec();
}
});

builder.accept(new TypedVisitor<ReplicationControllerBuilder>() {
@Override
public void visit(ReplicationControllerBuilder builder) {
final Map<String, String> selectors = mergedSelectors(Optional.ofNullable(builder.buildSpec())
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(ReplicationControllerSpec::getSelector)
.orElse(new HashMap<>()), Arrays.asList(
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll()));
.orElse(new HashMap<>()),
false,
getResourceConfigLabels().getPod(), getResourceConfigLabels().getAll());
builder.editOrNewSpec().addToSelector(selectors).endSpec();
}
});

builder.accept(new TypedVisitor<ReplicaSetBuilder>() {
@Override
public void visit(ReplicaSetBuilder builder) {
final Map<String, String> selectors = mergedSelectors(Optional.ofNullable(builder.buildSpec())
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(ReplicaSetSpec::getSelector)
.map(LabelSelector::getMatchLabels)
.orElse(new HashMap<>()), Arrays.asList(
getResourceConfigLabels().getReplicaSet(),
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll()));
.orElse(new HashMap<>()),
false,
getResourceConfigLabels().getReplicaSet(),
getResourceConfigLabels().getPod(),
getResourceConfigLabels().getAll());
builder.editOrNewSpec().editOrNewSelector().withMatchLabels(selectors).endSelector().endSpec();
}
});

builder.accept(new TypedVisitor<StatefulSetBuilder>() {
@Override
public void visit(StatefulSetBuilder builder) {
Map<String, String> selectors = new HashMap<>();
Map<String, String> labelsFromResourceConfig = MapUtil.mergeMaps(
toMap(getResourceConfigLabels().getPod()),
toMap(getResourceConfigLabels().getAll()));
if(builder.buildSpec() != null && builder.buildSpec().getSelector() != null && builder.buildSpec().getSelector().getMatchLabels() != null) {
selectors.putAll(builder.buildSpec().getSelector().getMatchLabels());
}
MapUtil.mergeIfAbsent(selectors, createLabels(false, labelsFromResourceConfig));
final Map<String, String> selectors = processSelectors(
Optional.ofNullable(builder.buildSpec())
.map(StatefulSetSpec::getSelector)
.map(LabelSelector::getMatchLabels)
.orElse(new HashMap<>()),
true,
getResourceConfigLabels().getPod(), getResourceConfigLabels().getAll());
builder.editOrNewSpec().editOrNewSelector().withMatchLabels(selectors).endSelector().endSpec();
}
});
Expand All @@ -162,20 +160,19 @@ public void enrich(PlatformMode platformMode, KubernetesListBuilder builder) {
builder.accept(new TypedVisitor<ObjectMetaBuilder>() {
@Override
public void visit(ObjectMetaBuilder element) {
Map<String, String> labels = Optional.ofNullable(element.getLabels()).orElse(new HashMap<>());
MapUtil.mergeIfAbsent(labels, createLabels(false, Collections.emptyMap()));
final Map<String, String> labels = processSelectors(
Optional.ofNullable(element.build())
.map(ObjectMeta::getLabels)
.orElse(new HashMap<>()),
true);
element.withLabels(labels);
}
});
}

@SuppressWarnings("unchecked")
private Map<String, String> mergedSelectors(Map<String, String> originalSelectors, List<Properties> labelPropertyList) {
Map<String, String> labelsFromResourceConfig = MapUtil.mergeMaps(labelPropertyList.stream()
.map(PropertiesUtil::toMap)
.toArray(Map[]::new));
MapUtil.mergeIfAbsent(originalSelectors, createLabels(true, labelsFromResourceConfig));
return originalSelectors;
private Map<String, String> processSelectors(Map<String, String> selectors, boolean includeVersion, Properties... labelPropertyList) {
MapUtil.mergeIfAbsent(selectors, createLabels(includeVersion, MapUtil.mergeMaps(labelPropertyList)));
return selectors;
}

protected MetaDataConfig getResourceConfigLabels() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import java.util.Map;
import java.util.Optional;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jkube.kit.common.Configs;
import org.eclipse.jkube.kit.config.resource.GroupArtifactVersion;
import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext;
Expand Down Expand Up @@ -65,7 +64,7 @@ public ProjectLabelEnricher(JKubeEnricherContext buildContext) {
}

@Override
public Map<String, String> createLabels(boolean withoutVersion, Map<String, String> labelsViaResourceConfig) {
public Map<String, String> createLabels(boolean includeVersion, Map<String, String> labelsViaResourceConfig) {
Map<String, String> ret = new HashMap<>();

boolean enableProjectLabel = Configs.asBoolean(getConfig(Config.USE_PROJECT_LABEL));
Expand All @@ -78,7 +77,7 @@ public Map<String, String> createLabels(boolean withoutVersion, Map<String, Stri

ret.putAll(addProjectLabelFromApplicableSource(Config.GROUP, "group", groupArtifactVersion.getGroupId(), labelsViaResourceConfig));
ret.putAll(addProjectLabelFromApplicableSource(Config.PROVIDER, LABEL_PROVIDER, null, labelsViaResourceConfig));
if (!withoutVersion) {
if (includeVersion) {
ret.putAll(addProjectLabelFromApplicableSource(Config.VERSION, "version", groupArtifactVersion.getVersion(), labelsViaResourceConfig));
}
return ret;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ private boolean shouldAddWellKnownLabels() {
}

@Override
public Map<String, String> createLabels(boolean withoutVersion, Map<String, String> labelsViaResourceConfig) {
public Map<String, String> createLabels(boolean includeVersion, Map<String, String> labelsViaResourceConfig) {
Map<String, String> ret = new HashMap<>();
if (!shouldAddWellKnownLabels()) {
return ret;
}

final GroupArtifactVersion groupArtifactVersion = getContext().getGav();
ret.putAll(addWellKnownLabelFromApplicableSource(Config.APP_NAME, "name", groupArtifactVersion.getArtifactId(), labelsViaResourceConfig));
if (!withoutVersion) {
if (includeVersion) {
ret.putAll(addWellKnownLabelFromApplicableSource(Config.APP_VERSION, "version", groupArtifactVersion.getVersion(), labelsViaResourceConfig));
}
ret.putAll(addWellKnownLabelFromApplicableSource(Config.APP_PART_OF, "part-of", groupArtifactVersion.getGroupId(), labelsViaResourceConfig));
Expand Down

0 comments on commit 2fc40ac

Please sign in to comment.