diff --git a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/HelmClient.java b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/HelmClient.java index 3afac8067..8c38a2574 100644 --- a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/HelmClient.java +++ b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/HelmClient.java @@ -22,6 +22,7 @@ import com.hedera.fullstack.helm.client.model.Repository; import com.hedera.fullstack.helm.client.model.chart.Release; import com.hedera.fullstack.helm.client.model.install.InstallChartOptions; +import com.hedera.fullstack.helm.client.model.test.TestChartOptions; import java.util.List; /** @@ -92,6 +93,14 @@ default Release installChart(String releaseName, Chart chart) { */ void uninstallChart(String releaseName); + /** + * Executes the Helm CLI {@code test} sub-command and tests the specified Helm chart. + * + * @param releaseName the name of the release to test. + * @param options the options to pass to the Helm CLI command. + */ + void testChart(String releaseName, TestChartOptions options); + /** * Creates a new {@link HelmClientBuilder} instance with the default configuration. * diff --git a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/impl/DefaultHelmClient.java b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/impl/DefaultHelmClient.java index 1d134c09f..bad753a0c 100644 --- a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/impl/DefaultHelmClient.java +++ b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/impl/DefaultHelmClient.java @@ -25,9 +25,11 @@ import com.hedera.fullstack.helm.client.model.Version; import com.hedera.fullstack.helm.client.model.chart.Release; import com.hedera.fullstack.helm.client.model.install.InstallChartOptions; +import com.hedera.fullstack.helm.client.model.test.TestChartOptions; import com.hedera.fullstack.helm.client.proxy.request.HelmRequest; import com.hedera.fullstack.helm.client.proxy.request.authentication.KubeAuthentication; import com.hedera.fullstack.helm.client.proxy.request.chart.ChartInstallRequest; +import com.hedera.fullstack.helm.client.proxy.request.chart.ChartTestRequest; import com.hedera.fullstack.helm.client.proxy.request.chart.ChartUninstallRequest; import com.hedera.fullstack.helm.client.proxy.request.common.VersionRequest; import com.hedera.fullstack.helm.client.proxy.request.repository.RepositoryAddRequest; @@ -120,6 +122,14 @@ public void uninstallChart(final String releaseName) { }); } + @Override + public void testChart(final String releaseName, final TestChartOptions options) { + executeInternal(new ChartTestRequest(releaseName, options), Void.class, (b, c) -> { + b.call(); + return null; + }); + } + /** * Applies the default namespace and authentication configuration to the given builder. * diff --git a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptions.java b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptions.java new file mode 100644 index 000000000..79fdf9acc --- /dev/null +++ b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptions.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.fullstack.helm.client.model.test; + +import com.hedera.fullstack.helm.client.execution.HelmExecutionBuilder; +import com.hedera.fullstack.helm.client.model.Options; + +/** + * Represents the options to use when testing a chart. + * + * @param filter specify tests by attribute (currently "name") using attribute=value syntax or '!attribute=value' to + * exclude a test (can specify multiple or separate values with commas: name=test1,name=test2) + * @param timeout Time to wait for any individual Kubernetes operation (like Jobs for hooks) (default 5m0s). + */ +public record TestChartOptions(String filter, String timeout) implements Options { + /** + * Returns an instance of the TestChartOptionsBuilder. + * + * @return the TestChartOptionsBuilder. + */ + public static TestChartOptionsBuilder builder() { + return TestChartOptionsBuilder.builder(); + } + + /** + * Returns an instance of the default TestChartOptions. + * + * @return the default TestChartOptions. + */ + public static TestChartOptions defaults() { + return builder().build(); + } + + @Override + public void apply(final HelmExecutionBuilder builder) { + builder.argument("output", "json"); + + if (filter() != null) { + builder.argument("filter", filter()); + } + + if (timeout() != null) { + builder.argument("timeout", timeout()); + } + } +} diff --git a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptionsBuilder.java b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptionsBuilder.java new file mode 100644 index 000000000..899dba9f1 --- /dev/null +++ b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/model/test/TestChartOptionsBuilder.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.fullstack.helm.client.model.test; + +/** + * The builder for the {@link TestChartOptions}. + */ +public class TestChartOptionsBuilder { + private String filter; + private String timeout; + + /** + * Returns an instance of the TestChartOptionsBuilder. + * + * @return the TestChartOptionsBuilder. + */ + public static TestChartOptionsBuilder builder() { + return new TestChartOptionsBuilder(); + } + + /** + * Specify tests by attribute (currently "name") using attribute=value syntax or '!attribute=value' to exclude a + * test (can specify multiple or separate values with commas: name=test1,name=test2) + * + * @param filter Specify tests by attribute (currently "name") using attribute=value syntax or '!attribute=value' to + * exclude a test (can specify multiple or separate values with commas: name=test1,name=test2) + * @return the current TestChartOptionsBuilder. + */ + public TestChartOptionsBuilder filter(String filter) { + this.filter = filter; + return this; + } + + /** + * Time to wait for any individual Kubernetes operation (like Jobs for hooks) (default 5m0s). + * + * @param timeout Time to wait for any individual Kubernetes operation (like Jobs for hooks) (default 5m0s). + *
+ * return the current TestChartOptionsBuilder. + */ + public TestChartOptionsBuilder timeout(String timeout) { + this.timeout = timeout; + return this; + } + + /** + * builds the {@link TestChartOptions} instance. + * + * @return the {@link TestChartOptions} instance. + */ + public TestChartOptions build() { + return new TestChartOptions(filter, timeout); + } +} diff --git a/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/proxy/request/chart/ChartTestRequest.java b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/proxy/request/chart/ChartTestRequest.java new file mode 100644 index 000000000..c691d0642 --- /dev/null +++ b/fullstack-helm-client/src/main/java/com/hedera/fullstack/helm/client/proxy/request/chart/ChartTestRequest.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.hedera.fullstack.helm.client.proxy.request.chart; + +import com.hedera.fullstack.helm.client.execution.HelmExecutionBuilder; +import com.hedera.fullstack.helm.client.model.test.TestChartOptions; +import com.hedera.fullstack.helm.client.proxy.request.HelmRequest; +import java.util.Objects; + +/** + * A request to uninstall a chart. + * + * @param releaseName the name of the release to uninstall. + */ +public record ChartTestRequest(String releaseName, TestChartOptions options) implements HelmRequest { + + public ChartTestRequest { + Objects.requireNonNull(releaseName, "releaseName must not be null"); + Objects.requireNonNull(options, "options must not be null"); + + if (releaseName.isBlank()) { + throw new IllegalArgumentException("releaseName must not be null or blank"); + } + } + + /** + * Creates a new install request with the given chart and default options. + * @param releaseName The name of the release. + */ + public ChartTestRequest(String releaseName) { + this(releaseName, TestChartOptions.defaults()); + } + + @Override + public void apply(HelmExecutionBuilder builder) { + builder.subcommands("test"); + + if (options != null) { + options.apply(builder); + } + + builder.positional(releaseName); + } +}