Skip to content

Commit

Permalink
Fix fabric8io#968: improve support for sidecar containers
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolaferraro authored and rohanKanojia committed Oct 30, 2018
1 parent 0d3a6f6 commit 4eb2163
Show file tree
Hide file tree
Showing 17 changed files with 774 additions and 30 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ After this we will switch probably to real [Semantic Versioning 2.0.0](http://se
* Fix 1365: Generated image reference in deployment.yml contains duplicate registry name
* Removed support for loading env variable from schema.json
* Removed MergeEnricher as it is broken and not used anyway

* Feature 968: Improved support for sidecar containers with sidecar auto-detection and targeted health checks

###3.5.40
* Feature 1264: Added `osio` profile, with enricher to apply OpenShift.io space labels to resources
* Feature 1291: Added ImageStream triggers for StatefulSets, ReplicaSets and DaemonSets
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ private List<EnvVar> getEnvVars(ResourceConfig config) {
.endValueFrom()
.build());

envVars.add(
new EnvVarBuilder()
.withName("FABRIC8_GENERATED")
.withValue("true")
.build());
return envVars;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -656,12 +656,16 @@ public static void mergePodSpec(PodSpecBuilder builder, PodSpec defaultPodSpec,
if (containers == null || containers.isEmpty()) {
builder.addToContainers(defaultContainers.toArray(new Container[size]));
} else {
int idx = 0;
for (Container defaultContainer : defaultContainers) {
Container container;
if (idx < containers.size()) {
container = containers.get(idx);
} else {
Container container = null;
for (Container fragmentContainer : containers) {
if (fragmentContainer.getName() == null || fragmentContainer.getName().equals(defaultContainer.getName())) {
container = fragmentContainer;
break;
}
}

if (container == null) {
container = new Container();
containers.add(container);
}
Expand All @@ -687,15 +691,16 @@ public static void mergePodSpec(PodSpecBuilder builder, PodSpec defaultPodSpec,
if (container.getSecurityContext() == null) {
container.setSecurityContext(defaultContainer.getSecurityContext());
}
idx++;
}
builder.withContainers(containers);
}
} else if (!containers.isEmpty()) {
// lets default the container name if there's none specified in the custom yaml file
Container container = containers.get(0);
if (StringUtils.isBlank(container.getName())) {
container.setName(defaultName);
for (Container container : containers) {
if (StringUtils.isBlank(container.getName())) {
container.setName(defaultName);
break; // do it for one container only, but not necessarily the first one
}
}
builder.withContainers(containers);
}
Expand Down
2 changes: 1 addition & 1 deletion doc/src/main/asciidoc/inc/_enricher.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -1019,4 +1019,4 @@ The trigger is added to all containers that apply, but can be restricted to a li

== Enricher API

_howto write your own enricher and install them_
_howto write your own enricher and install them_
Original file line number Diff line number Diff line change
Expand Up @@ -20,41 +20,52 @@
import io.fabric8.kubernetes.api.model.ContainerBuilder;
import io.fabric8.kubernetes.api.model.KubernetesListBuilder;
import io.fabric8.kubernetes.api.model.Probe;
import io.fabric8.maven.core.util.Configs;
import io.fabric8.maven.core.util.kubernetes.KubernetesResourceUtil;
import io.fabric8.maven.enricher.api.BaseEnricher;
import io.fabric8.maven.enricher.api.MavenEnricherContext;
import io.fabric8.maven.enricher.api.EnricherContext;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
* Enriches containers with health check probes.
*/
public abstract class AbstractHealthCheckEnricher extends BaseEnricher {

public AbstractHealthCheckEnricher(MavenEnricherContext buildContext, String name) {
private enum Config implements Configs.Key {
enrichAllContainers {{ d = "false"; }},
enrichContainers {{ d = null; }};

public String def() { return d; } protected String d;
}

public AbstractHealthCheckEnricher(EnricherContext buildContext, String name) {
super(buildContext, name);
}

@Override
public void addMissingResources(KubernetesListBuilder builder) {

builder.accept(new TypedVisitor<ContainerBuilder>() {
@Override
public void visit(ContainerBuilder container) {
if (!container.hasReadinessProbe()) {
Probe probe = getReadinessProbe(container);
if (probe != null) {
log.info("Adding readiness " + describe(probe));
container.withReadinessProbe(probe);
}
for (ContainerBuilder container : getContainersToEnrich(builder)) {
if (!container.hasReadinessProbe()) {
Probe probe = getReadinessProbe(container);
if (probe != null) {
log.info("Adding readiness " + describe(probe));
container.withReadinessProbe(probe);
}
}

if (!container.hasLivenessProbe()) {
Probe probe = getLivenessProbe(container);
if (probe != null) {
log.info("Adding liveness " + describe(probe));
container.withLivenessProbe(probe);
}
if (!container.hasLivenessProbe()) {
Probe probe = getLivenessProbe(container);
if (probe != null) {
log.info("Adding liveness " + describe(probe));
container.withLivenessProbe(probe);
}
}
});
}
}

private String describe(Probe probe) {
Expand Down Expand Up @@ -82,6 +93,46 @@ private String describe(Probe probe) {
return desc.toString();
}

protected List<ContainerBuilder> getContainersToEnrich(KubernetesListBuilder builder) {
final List<ContainerBuilder> containerBuilders = new LinkedList<>();
builder.accept(new TypedVisitor<ContainerBuilder>() {
@Override
public void visit(ContainerBuilder containerBuilder) {
containerBuilders.add(containerBuilder);
}
});

boolean enrichAllContainers = "true".equalsIgnoreCase(getConfig(Config.enrichAllContainers));
String enrichContainers = getConfig(Config.enrichContainers);
Set<String> containersToEnrich = new HashSet<>();
if (enrichContainers != null) {
containersToEnrich.addAll(Arrays.asList(enrichContainers.split(",")));
}

if (enrichAllContainers) {
return containerBuilders;
} else if (!containersToEnrich.isEmpty()) {
List<ContainerBuilder> filteredContainers = new LinkedList<>();
for (ContainerBuilder container : containerBuilders) {
if (container.hasName() && containersToEnrich.contains(container.getName())) {
filteredContainers.add(container);
}
}
return filteredContainers;
} else if (containerBuilders.size() == 1) {
return containerBuilders;
} else {
// Multiple unfiltered containers, enrich only the generated ones
List<ContainerBuilder> generatedContainers = new LinkedList<>();
for (ContainerBuilder container : containerBuilders) {
if ("true".equals(KubernetesResourceUtil.getEnvVar(container.buildEnv(), "FABRIC8_GENERATED", "false"))) {
generatedContainers.add(container);
}
}
return generatedContainers;
}
}

/**
* Override this method to create a per-container readiness probe.
*/
Expand Down
Loading

0 comments on commit 4eb2163

Please sign in to comment.