Skip to content

Commit

Permalink
feat (jkube-kit) : Add health check enricher for SmallRye Health (ecl…
Browse files Browse the repository at this point in the history
…ipse-jkube#443)

Add SmallRyeHealthCheckEnricher to add readiness, liveness and startup
probes if `io.smallrye:smallrye-health` is present in project
dependencies.

Signed-off-by: Rohan Kumar <rohaan@redhat.com>
  • Loading branch information
rohanKanojia committed Aug 19, 2022
1 parent 06916b6 commit 08973e3
Show file tree
Hide file tree
Showing 19 changed files with 529 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -21,6 +21,7 @@ Usage:
./scripts/extract-changelog-for-version.sh 1.3.37 5
```
### 1.9.0-SNAPSHOT
* Fix #443: Add health check enricher for SmallRye Health
* Fix #777: `k8s:build` with Dockerfile throws `Connection reset by peer` error on old docker daemons
* Fix #1137: Add support to add `.resources` in initContainer generated by VolumePermissionEnricher
* Fix #1156: `k8s:build`/`k8sBuild` tries to access Kubernetes Cluster
Expand Down
5 changes: 5 additions & 0 deletions gradle-plugin/kubernetes/pom.xml
Expand Up @@ -121,6 +121,11 @@
<artifactId>jkube-kit-wildfly-jar</artifactId>
<version>${jkube.kit.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-smallrye</artifactId>
<version>${jkube.kit.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-profiles</artifactId>
Expand Down
Expand Up @@ -60,6 +60,7 @@
- jkube-healthcheck-webapp
- jkube-healthcheck-micronaut
- jkube-healthcheck-openliberty
- jkube-healthcheck-smallrye
- jkube-prometheus
- jkube-service-discovery

Expand Down
Expand Up @@ -55,6 +55,7 @@
- jkube-healthcheck-webapp
- jkube-healthcheck-micronaut
- jkube-healthcheck-openliberty
- jkube-healthcheck-smallrye

# DeploymentConfigEnricher converts Deployment into DeploymentConfig
- jkube-openshift-deploymentconfig
Expand Down
Expand Up @@ -77,20 +77,22 @@ public static boolean hasDependency(JavaProject jkubeProject, String groupId, St
return getDependency(jkubeProject, groupId, artifactId) != null;
}

public static boolean hasTransitiveDependency(JavaProject javaProject, String groupId, String artifactId) {
return getTransitiveDependency(javaProject, groupId, artifactId) != null;
}

public static boolean hasDependencyWithGroupId(JavaProject project, String groupId) {
return Optional.ofNullable(project).map(JavaProject::getDependencies)
.map(deps -> deps.stream().anyMatch(dep -> Objects.equals(dep.getGroupId(), groupId)))
.orElse(false);
}

public static Dependency getTransitiveDependency(JavaProject javaProject, String groupId, String artifactId) {
return getDependencyByGroupArtifact(javaProject.getDependenciesWithTransitive(), groupId, artifactId);
}

public static Dependency getDependency(JavaProject jkubeProject, String groupId, String artifactId) {
List<Dependency> dependencyList = jkubeProject.getDependencies();
if (dependencyList != null) {
return iterateOverListWithCondition(dependencyList, dependency ->
Objects.equals(dependency.getGroupId(), groupId) && Objects.equals(dependency.getArtifactId(), artifactId))
.orElse(null);
}
return null;
return getDependencyByGroupArtifact(jkubeProject.getDependencies(), groupId, artifactId);
}

/**
Expand Down Expand Up @@ -198,4 +200,13 @@ public static File resolveArtifact(JavaProject project, String groupId, String a
}
return artifact;
}

private static Dependency getDependencyByGroupArtifact(List<Dependency> dependencyList, String groupId, String artifactId) {
if (dependencyList != null) {
return iterateOverListWithCondition(dependencyList, dependency ->
Objects.equals(dependency.getGroupId(), groupId) && Objects.equals(dependency.getArtifactId(), artifactId))
.orElse(null);
}
return null;
}
}
Expand Up @@ -19,7 +19,8 @@
import static org.eclipse.jkube.kit.common.util.SemanticVersionUtil.isVersionAtLeast;

public class MicroprofileHealthUtil {
private static final String MICROPROFILE_HEALTH_DEPENDENCY = "microprofile-health";
private static final String MICROPROFILE_HEALTH_DEPENDENCY = "microprofile-health-api";
private static final String MICROPROFILE_HEALTH_GROUP = "org.eclipse.microprofile.health";
private static final String MICROPROFILE_DEPENDENCY = "microprofile";
private static final String MICROPROFILE_GROUP = "org.eclipse.microprofile";
private static final int MICROPROFILE_HEALTH_SUPPORTED_VERSION_MAJOR = 3;
Expand All @@ -31,28 +32,28 @@ public class MicroprofileHealthUtil {
private MicroprofileHealthUtil() { }

public static boolean hasMicroProfileHealthDependency(JavaProject javaProject) {
return JKubeProjectUtil.hasDependency(javaProject, MICROPROFILE_GROUP , MICROPROFILE_HEALTH_DEPENDENCY);
return JKubeProjectUtil.hasTransitiveDependency(javaProject, MICROPROFILE_HEALTH_GROUP , MICROPROFILE_HEALTH_DEPENDENCY);
}

public static boolean hasMicroProfileDependency(JavaProject javaProject) {
return JKubeProjectUtil.hasDependency(javaProject, MICROPROFILE_GROUP , MICROPROFILE_DEPENDENCY);
return JKubeProjectUtil.hasTransitiveDependency(javaProject, MICROPROFILE_GROUP , MICROPROFILE_DEPENDENCY);
}

public static boolean isStartupEndpointSupported(JavaProject javaProject) {
String microProfileHealthVersion;
if (hasMicroProfileDependency(javaProject)) {
microProfileHealthVersion = getMicroProfileVersionFromArtifactId(javaProject, MICROPROFILE_DEPENDENCY);
microProfileHealthVersion = getMicroProfileVersionFromArtifactId(javaProject, MICROPROFILE_GROUP, MICROPROFILE_DEPENDENCY);
} else if (hasMicroProfileHealthDependency(javaProject)) {
microProfileHealthVersion = getMicroProfileVersionFromArtifactId(javaProject, MICROPROFILE_HEALTH_DEPENDENCY);
microProfileHealthVersion = getMicroProfileVersionFromArtifactId(javaProject, MICROPROFILE_HEALTH_GROUP, MICROPROFILE_HEALTH_DEPENDENCY);
} else {
return false;
}

return isVersionAtLeast(MICROPROFILE_HEALTH_SUPPORTED_VERSION_MAJOR, MICROPROFILE_HEALTH_SUPPORTED_VERSION_MINOR, microProfileHealthVersion);
}

private static String getMicroProfileVersionFromArtifactId(JavaProject javaProject, String artifactId) {
Dependency microProfileDep = JKubeProjectUtil.getDependency(javaProject, MICROPROFILE_GROUP, artifactId);
private static String getMicroProfileVersionFromArtifactId(JavaProject javaProject, String groupId, String artifactId) {
Dependency microProfileDep = JKubeProjectUtil.getTransitiveDependency(javaProject, groupId, artifactId);
if (microProfileDep != null) {
return microProfileDep.getVersion();
}
Expand Down
Expand Up @@ -21,6 +21,7 @@
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Properties;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down Expand Up @@ -71,6 +72,33 @@ void hasDependencyWithGroupIdWithNoDependency() {
assertThat(result).isFalse();
}

@Test
void hasTransitiveDependency_whenGroupArtifactMatchesInProvidedDeps_shouldReturnTrue() {
// Given
final JavaProject project = mock(JavaProject.class);
when(project.getDependenciesWithTransitive()).thenReturn(Collections.singletonList(
Dependency.builder().groupId("org.example").artifactId("artifact").version("1.3.37").build()
));

// When
final boolean result = JKubeProjectUtil.hasTransitiveDependency(project, "org.example", "artifact");

// Then
assertThat(result).isTrue();
}

@Test
void hasTransitiveDependency_whenGroupArtifactNoMatchInProvidedDeps_shouldReturnTrue() {
// Given
final JavaProject project = mock(JavaProject.class);

// When
final boolean result = JKubeProjectUtil.hasTransitiveDependency(project, "org.example", "artifact");

// Then
assertThat(result).isFalse();
}

@Test
void getFinalOutputArtifact_withNothingProvided_returnsNull() {
// Given
Expand Down
Expand Up @@ -17,6 +17,8 @@
import org.eclipse.jkube.kit.common.JavaProject;
import org.junit.jupiter.api.Test;

import java.util.Collections;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

class MicroprofileHealthUtilTest {
Expand Down Expand Up @@ -47,7 +49,7 @@ void hasMicroProfileDependency_withMicroProfile_shouldReturnTrue() {
@Test
void hasMicroProfileHealthDependency_withMicroProfileHealth_shouldReturnTrue() {
// Given
JavaProject javaProject = createNewJavaProjectDependency("org.eclipse.microprofile", "microprofile-health", "5.0");
JavaProject javaProject = createNewJavaProjectDependency("org.eclipse.microprofile.health", "microprofile-health-api", "5.0");

// When
boolean result = MicroprofileHealthUtil.hasMicroProfileHealthDependency(javaProject);
Expand Down Expand Up @@ -95,7 +97,7 @@ void isStartupEndpointSupported_withMicroprofileAfter3_1_shouldReturnTrue() {
@Test
void isStartupEndpointSupported_withMicroprofileHealthAfter3_1_shouldReturnTrue() {
// Given
JavaProject javaProject = createNewJavaProjectDependency("org.eclipse.microprofile", "microprofile-health", "5.0");
JavaProject javaProject = createNewJavaProjectDependency("org.eclipse.microprofile.health", "microprofile-health-api", "5.0");

// When
boolean result = MicroprofileHealthUtil.isStartupEndpointSupported(javaProject);
Expand All @@ -105,10 +107,10 @@ void isStartupEndpointSupported_withMicroprofileHealthAfter3_1_shouldReturnTrue(
}

private JavaProject createNewJavaProjectDependency(String groupId, String artifactId, String version) {
return JavaProject.builder().dependency(Dependency.builder()
return JavaProject.builder().dependenciesWithTransitive(Collections.singletonList(Dependency.builder()
.groupId(groupId)
.artifactId(artifactId)
.version(version)
.build()).build();
.build())).build();
}
}
Expand Up @@ -182,7 +182,7 @@ void create_withMicroprofileEnabledAndEnricherConfiguration_shouldProbesAsConfig
}

private void withMicroprofileDependency(String microProfileVersion) {
when(javaProject.getDependencies()).thenReturn(Collections.singletonList(Dependency.builder()
when(javaProject.getDependenciesWithTransitive()).thenReturn(Collections.singletonList(Dependency.builder()
.groupId("org.eclipse.microprofile")
.artifactId("microprofile")
.version(microProfileVersion)
Expand Down
51 changes: 51 additions & 0 deletions jkube-kit/jkube-kit-smallrye/pom.xml
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2019 Red Hat, Inc.
This program and the accompanying materials are made
available under the terms of the Eclipse Public License 2.0
which is available at:
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
Red Hat, Inc. - initial API and implementation
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jkube-kit-parent</artifactId>
<groupId>org.eclipse.jkube</groupId>
<version>1.9.0-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jkube-kit-smallrye</artifactId>
<name>JKube Kit :: SmallRye</name>
<dependencies>
<dependency>
<groupId>org.eclipse.jkube</groupId>
<artifactId>jkube-kit-enricher-specific</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,28 @@
/**
* Copyright (c) 2019 Red Hat, Inc.
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at:
*
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
*/
package org.eclipse.jkube.smallrye;

import org.eclipse.jkube.kit.common.JavaProject;
import org.eclipse.jkube.kit.common.util.JKubeProjectUtil;

public class SmallRyeUtils {
private static final String SMALLRYE_GROUPID = "io.smallrye";
private static final String SMALLRYE_HEALTH_ARTIFACTID = "smallrye-health";

private SmallRyeUtils() { }

public static boolean hasSmallRyeDependency(JavaProject javaProject) {
return JKubeProjectUtil.hasDependency(javaProject, SMALLRYE_GROUPID , SMALLRYE_HEALTH_ARTIFACTID);
}
}

0 comments on commit 08973e3

Please sign in to comment.