Skip to content

Commit

Permalink
feat: helm lint exposed in Gradle and Maven plugins
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 6, 2024
1 parent 13e01f8 commit d828cd2
Show file tree
Hide file tree
Showing 16 changed files with 534 additions and 19 deletions.
42 changes: 42 additions & 0 deletions gradle-plugin/it/src/it/helm-lint/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* 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
*/
plugins {
id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}"
id 'org.eclipse.jkube.openshift' version "${jKubeVersion}"
id 'java'
}

group = 'org.eclipse.jkube.integration.tests.gradle'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
mavenCentral()
}

def extensionConfig = {
offline = true
images {
image {
name = 'repository/helm-fragment:latest'
build {
from = 'repository/from:latest'
}
}
}
}

kubernetes(extensionConfig)
openshift(extensionConfig)

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* 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.gradle.plugin.tests;

import org.gradle.testkit.runner.BuildResult;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

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

class HelmLintIT {

@RegisterExtension
public final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension();

@BeforeEach
void setUp() {
gradleRunner.withITProject("helm-lint");
}

@Test
void k8sHelmLint() {
// When
final BuildResult result = gradleRunner
.withArguments("clean", "k8sResource", "k8sHelm", "k8sHelmLint").build();
// Then
assertThat(result).extracting(BuildResult::getOutput).asString()
.contains("k8s: Linting helm-lint 0.0.1-SNAPSHOT")
.contains("k8s: [INFO] Chart.yaml: icon is recommended")
.contains("k8s: Linting successful");
}

@Test
void ocHelmLint() {
// When
final BuildResult result = gradleRunner
.withArguments("clean", "ocResource", "ocHelm", "ocHelmLint").build();
// Then
assertThat(result).extracting(BuildResult::getOutput).asString()
.contains("oc: Linting helm-lint 0.0.1-SNAPSHOT")
.contains("oc: [INFO] Chart.yaml: icon is recommended")
.contains("oc: Linting successful");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.eclipse.jkube.gradle.plugin.task.KubernetesBuildTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesConfigViewTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesDebugTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmLintTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmPushTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask;
import org.eclipse.jkube.gradle.plugin.task.KubernetesLogTask;
Expand All @@ -49,6 +50,7 @@ public Map<String, Collection<Class<? extends Task>>> getTaskPrecedence() {
ret.put("k8sPush", Collections.singletonList(KubernetesBuildTask.class));
ret.put("k8sHelm", Collections.singletonList(KubernetesResourceTask.class));
ret.put("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class));
ret.put("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class));
return ret;
}

Expand All @@ -64,6 +66,7 @@ protected void jKubeApply(Project project) {
register(project, "k8sUndeploy", KubernetesUndeployTask.class);
register(project, "k8sHelm", KubernetesHelmTask.class);
register(project, "k8sHelmPush", KubernetesHelmPushTask.class);
register(project, "k8sHelmLint", KubernetesHelmLintTask.class);
register(project, "k8sRemoteDev", KubernetesRemoteDevTask.class);
register(project, "k8sWatch", KubernetesWatchTask.class);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* 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.gradle.plugin.task;

import org.eclipse.jkube.gradle.plugin.KubernetesExtension;
import org.eclipse.jkube.kit.resource.helm.HelmConfig;

import javax.inject.Inject;

import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig;

public class KubernetesHelmLintTask extends AbstractJKubeTask {
@Inject
public KubernetesHelmLintTask(Class<? extends KubernetesExtension> extensionClass) {
super(extensionClass);
setDescription("Examine Helm chart for possible issues");
}

@Override
public void run() {
if (kubernetesExtension.getSkipOrDefault()) {
return;
}
try {
final HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject,
kubernetesExtension.getKubernetesTemplateOrDefault(),
kubernetesExtension.helm)
.build();
jKubeServiceHub.getHelmService().lint(helm);
} catch (Exception exp) {
kitLogger.error("Error performing helm lint", exp);
throw new IllegalStateException(exp.getMessage(), exp);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,13 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() {
final Map<String, Collection<Class<? extends Task>>> result = new KubernetesPlugin().getTaskPrecedence();
// Then
assertThat(result)
.hasSize(5)
.hasSize(6)
.containsEntry("k8sApply", Collections.singletonList(KubernetesResourceTask.class))
.containsEntry("k8sDebug",
Arrays.asList(KubernetesBuildTask.class, KubernetesResourceTask.class, KubernetesApplyTask.class))
.containsEntry("k8sPush", Collections.singletonList(KubernetesBuildTask.class))
.containsEntry("k8sHelm", Collections.singletonList(KubernetesResourceTask.class))
.containsEntry("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class));
.containsEntry("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class))
.containsEntry("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* 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.gradle.plugin.task;

import com.marcnuri.helm.Helm;
import org.eclipse.jkube.gradle.plugin.KubernetesExtension;
import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension;
import org.eclipse.jkube.kit.resource.helm.HelmConfig;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.io.IOException;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.startsWith;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

class KubernetesHelmLintTaskTest {

@RegisterExtension
private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension();

@BeforeEach
void setUp() throws IOException {
System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath());
final TestKubernetesExtension extension = new TestKubernetesExtension();
extension.helm = HelmConfig.builder().chartExtension("tgz").build();
extension.isUseColor = false;
when(taskEnvironment.project.getName()).thenReturn("empty-project");
when(taskEnvironment.project.getVersion()).thenReturn("0.1.0");
when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension);
}

@AfterEach
void tearDown() {
System.clearProperty("jkube.kubernetesTemplate");
}

@Test
void runTask_withMissingHelmPackage_shouldThrowException() {
KubernetesHelmLintTask kubernetesHelmLintTask = new KubernetesHelmLintTask(KubernetesExtension.class);
assertThatThrownBy(kubernetesHelmLintTask::runTask)
.isInstanceOf(IllegalStateException.class)
.hasMessage("Linting failed");
verify(taskEnvironment.logger).lifecycle("k8s: Linting empty-project 0.1.0");
verify(taskEnvironment.logger).lifecycle(startsWith("k8s: Using packaged file:"));
}

@Test
void runTask_withHelmPackage_shouldSucceed() {
KubernetesHelmLintTask kubernetesHelmLintTask = new KubernetesHelmLintTask(KubernetesExtension.class);
Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call()
.packageIt().withDestination(taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm").resolve("empty-project").resolve("kubernetes")).call();
kubernetesHelmLintTask.runTask();
verify(taskEnvironment.logger).lifecycle("k8s: Linting empty-project 0.1.0");
verify(taskEnvironment.logger).lifecycle(startsWith("k8s: Using packaged file:"));
verify(taskEnvironment.logger).lifecycle("k8s: [INFO] Chart.yaml: icon is recommended");
verify(taskEnvironment.logger).lifecycle("k8s: Linting successful");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.jkube.gradle.plugin.task.OpenShiftApplyTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftBuildTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftDebugTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmLintTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmPushTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmTask;
import org.eclipse.jkube.gradle.plugin.task.OpenShiftPushTask;
Expand All @@ -53,6 +54,7 @@ public Map<String, Collection<Class<? extends Task>>> getTaskPrecedence() {
ret.put("ocPush", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class));
ret.put("ocHelm", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class));
ret.put("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class));
ret.put("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class));
return ret;
}

Expand All @@ -68,6 +70,7 @@ protected void jKubeApply(Project project) {
register(project, "ocUndeploy", OpenShiftUndeployTask.class);
register(project, "ocHelm", OpenShiftHelmTask.class);
register(project, "ocHelmPush", OpenShiftHelmPushTask.class);
register(project, "ocHelmLint", OpenShiftHelmLintTask.class);
register(project, "ocRemoteDev", OpenShiftRemoteDevTask.class);
register(project, "ocWatch", OpenShiftWatchTask.class);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* 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.gradle.plugin.task;

import org.eclipse.jkube.gradle.plugin.OpenShiftExtension;

import javax.inject.Inject;

public class OpenShiftHelmLintTask extends KubernetesHelmLintTask implements OpenShiftJKubeTask {
@Inject
public OpenShiftHelmLintTask(Class<? extends OpenShiftExtension> extensionClass) {
super(extensionClass);
setDescription("Examine Helm chart for possible issues");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,13 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() {
final Map<String, Collection<Class<? extends Task>>> result = new OpenShiftPlugin().getTaskPrecedence();
// Then
assertThat(result)
.hasSize(5)
.hasSize(6)
.containsEntry("ocApply", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class))
.containsEntry("ocDebug", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class,
KubernetesResourceTask.class, OpenShiftResourceTask.class, KubernetesApplyTask.class, OpenShiftApplyTask.class))
.containsEntry("ocPush", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class))
.containsEntry("ocHelm", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class))
.containsEntry("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class));
.containsEntry("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class))
.containsEntry("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
public class TestOpenShiftExtension extends OpenShiftExtension {

public Boolean isOffline;
public Boolean isUseColor;
public String buildRecreate;
public Boolean isForcePull;
public Boolean isFailOnNoKubernetesJson;
Expand All @@ -42,7 +43,7 @@ public Property<Boolean> getOffline() {

@Override
public Property<Boolean> getUseColor() {
return property(Boolean.class);
return property(Boolean.class).value(isUseColor);
}

@Override
Expand Down
Loading

0 comments on commit d828cd2

Please sign in to comment.