From 74bbe2059c95a4f0d92fa73e984c1a778db7c099 Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Tue, 1 Mar 2022 10:47:58 +0100 Subject: [PATCH 01/12] Implement lint goal --- src/python/pants/backend/helm/target_types.py | 1 + src/python/pants/backend/helm/util_rules/chart.py | 2 ++ src/python/pants/backend/helm/util_rules/chart_test.py | 1 + 3 files changed, 4 insertions(+) diff --git a/src/python/pants/backend/helm/target_types.py b/src/python/pants/backend/helm/target_types.py index 0d6cd34db93..3ca532d3c21 100644 --- a/src/python/pants/backend/helm/target_types.py +++ b/src/python/pants/backend/helm/target_types.py @@ -102,3 +102,4 @@ class HelmChartFieldSet(FieldSet): chart: HelmChartMetaSourceField sources: HelmChartSourcesField dependencies: HelmChartDependenciesField + lint_strict: HelmChartLintStrictField diff --git a/src/python/pants/backend/helm/util_rules/chart.py b/src/python/pants/backend/helm/util_rules/chart.py index 884e958f40b..6f8b44a4247 100644 --- a/src/python/pants/backend/helm/util_rules/chart.py +++ b/src/python/pants/backend/helm/util_rules/chart.py @@ -233,6 +233,8 @@ class HelmChart: metadata: HelmChartMetadata snapshot: Snapshot + lint_strict: bool | None + @property def path(self) -> str: return self.metadata.name diff --git a/src/python/pants/backend/helm/util_rules/chart_test.py b/src/python/pants/backend/helm/util_rules/chart_test.py index 9bac7c0d72f..4100a65d806 100644 --- a/src/python/pants/backend/helm/util_rules/chart_test.py +++ b/src/python/pants/backend/helm/util_rules/chart_test.py @@ -93,6 +93,7 @@ def test_collects_single_chart_sources( assert helm_chart.metadata == expected_metadata assert len(helm_chart.snapshot.files) == 4 assert helm_chart.address == address + assert helm_chart.lint_strict == lint_strict def test_gathers_local_subchart_sources_using_explicit_dependency(rule_runner: RuleRunner) -> None: From 7a472625ab1c44b7454bba99d85f09b0e848e9da Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Tue, 1 Mar 2022 18:43:18 +0100 Subject: [PATCH 02/12] Implement HelmProcess and write a test to verify it --- pants.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pants.toml b/pants.toml index e43a1015cdd..a356454daab 100644 --- a/pants.toml +++ b/pants.toml @@ -26,6 +26,7 @@ backend_packages.add = [ "pants.backend.experimental.scala", "pants.backend.experimental.scala.lint.scalafmt", "pants.backend.experimental.scala.debug_goals", + "pants.backend.experimental.helm", "internal_plugins.releases", ] plugins = [ From bd21d30177ef50e33151f16992cb08954896c8c7 Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Fri, 4 Mar 2022 10:04:43 +0100 Subject: [PATCH 03/12] Use a HelmChartRequest type for the HelmChart-based rules --- pants.toml | 2 +- src/python/pants/backend/helm/target_types.py | 1 - src/python/pants/backend/helm/util_rules/chart.py | 2 -- src/python/pants/backend/helm/util_rules/chart_test.py | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/pants.toml b/pants.toml index a356454daab..78ec09eaf98 100644 --- a/pants.toml +++ b/pants.toml @@ -26,7 +26,7 @@ backend_packages.add = [ "pants.backend.experimental.scala", "pants.backend.experimental.scala.lint.scalafmt", "pants.backend.experimental.scala.debug_goals", - "pants.backend.experimental.helm", + # "pants.backend.experimental.helm", "internal_plugins.releases", ] plugins = [ diff --git a/src/python/pants/backend/helm/target_types.py b/src/python/pants/backend/helm/target_types.py index 3ca532d3c21..0d6cd34db93 100644 --- a/src/python/pants/backend/helm/target_types.py +++ b/src/python/pants/backend/helm/target_types.py @@ -102,4 +102,3 @@ class HelmChartFieldSet(FieldSet): chart: HelmChartMetaSourceField sources: HelmChartSourcesField dependencies: HelmChartDependenciesField - lint_strict: HelmChartLintStrictField diff --git a/src/python/pants/backend/helm/util_rules/chart.py b/src/python/pants/backend/helm/util_rules/chart.py index 6f8b44a4247..884e958f40b 100644 --- a/src/python/pants/backend/helm/util_rules/chart.py +++ b/src/python/pants/backend/helm/util_rules/chart.py @@ -233,8 +233,6 @@ class HelmChart: metadata: HelmChartMetadata snapshot: Snapshot - lint_strict: bool | None - @property def path(self) -> str: return self.metadata.name diff --git a/src/python/pants/backend/helm/util_rules/chart_test.py b/src/python/pants/backend/helm/util_rules/chart_test.py index 4100a65d806..9bac7c0d72f 100644 --- a/src/python/pants/backend/helm/util_rules/chart_test.py +++ b/src/python/pants/backend/helm/util_rules/chart_test.py @@ -93,7 +93,6 @@ def test_collects_single_chart_sources( assert helm_chart.metadata == expected_metadata assert len(helm_chart.snapshot.files) == 4 assert helm_chart.address == address - assert helm_chart.lint_strict == lint_strict def test_gathers_local_subchart_sources_using_explicit_dependency(rule_runner: RuleRunner) -> None: From 52ff32bb8c408abde7c4916462c057ac024b8bd7 Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Mon, 14 Mar 2022 10:47:16 +0100 Subject: [PATCH 04/12] Address additional comments --- pants.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pants.toml b/pants.toml index 78ec09eaf98..e43a1015cdd 100644 --- a/pants.toml +++ b/pants.toml @@ -26,7 +26,6 @@ backend_packages.add = [ "pants.backend.experimental.scala", "pants.backend.experimental.scala.lint.scalafmt", "pants.backend.experimental.scala.debug_goals", - # "pants.backend.experimental.helm", "internal_plugins.releases", ] plugins = [ From 867425d07c0843356c306a3042a6981650f3392e Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Wed, 9 Mar 2022 13:07:48 +0100 Subject: [PATCH 05/12] Implement package goal --- .../pants/backend/helm/goals/package.py | 74 ++++++++++++++++++ .../pants/backend/helm/goals/package_test.py | 76 +++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 src/python/pants/backend/helm/goals/package.py create mode 100644 src/python/pants/backend/helm/goals/package_test.py diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py new file mode 100644 index 00000000000..3d34f6c15b0 --- /dev/null +++ b/src/python/pants/backend/helm/goals/package.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import logging +from dataclasses import dataclass +from pathlib import PurePath + +from pants.build_graph.address import Address +from pants.core.goals.package import BuiltPackage, BuiltPackageArtifact, PackageFieldSet +from pants.engine.fs import AddPrefix, Digest, RemovePrefix, CreateDigest, Directory, MergeDigests +from pants.engine.process import Process, ProcessResult +from pants.engine.rules import Get, collect_rules, rule, MultiGet +from pants.engine.target import WrappedTarget +from pants.engine.unions import UnionRule +from pants.util.logging import LogLevel +from pants.backend.helm.util_rules.chart import HelmChartMetadata, HelmChartRequest, HelmChart +from pants.backend.helm.target_types import HelmChartFieldSet, HelmChartOutputPathField +from pants.backend.helm.util_rules.tool import HelmProcess + +logger = logging.getLogger(__name__) + +@dataclass(frozen=True) +class BuiltHelmArtifact(BuiltPackageArtifact): + name: str | None = None + metadata: HelmChartMetadata | None = None + + @classmethod + def create(cls, path_to_dir: PurePath, metadata: HelmChartMetadata) -> BuiltHelmArtifact: + pckg_str = f"{metadata.name}-{metadata.version}" + path = PurePath(path_to_dir, f"{pckg_str}.tgz") + return cls( + metadata=metadata, + name=pckg_str, + relpath=str(path), + extra_log_lines=(f"Built Helm chart artifact: {pckg_str}",), + ) + +@dataclass(frozen=True) +class HelmPackageFieldSet(HelmChartFieldSet, PackageFieldSet): + output_path: HelmChartOutputPathField + + +@rule(desc="Package Helm chart", level=LogLevel.DEBUG) +async def run_helm_package(field_set: HelmPackageFieldSet) -> BuiltPackage: + output_dir = "__output_dir" + + chart, output_digest = await MultiGet( + Get(HelmChart, HelmChartRequest(field_set)), + Get(Digest, CreateDigest([Directory(output_dir)])) + ) + + input_digest = await Get(Digest, MergeDigests([chart.snapshot.digest, output_digest])) + + process_result = await Get( + ProcessResult, + HelmProcess( + argv=["package", chart.path], + input_digest=input_digest, + output_directories=(output_dir,), + description=f"Packaging Helm chart: {chart.metadata.name}" + ) + ) + + chart_dest_path = PurePath(field_set.output_path.value_or_default(file_ending=None)) + stripped_output_digest = await Get(Digest, RemovePrefix(process_result.output_digest, output_dir)) + dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, str(chart_dest_path))) + + return BuiltPackage( + dest_digest, + (BuiltHelmArtifact.create(chart_dest_path, chart.metadata),) + ) + + +def rules(): + return collect_rules() \ No newline at end of file diff --git a/src/python/pants/backend/helm/goals/package_test.py b/src/python/pants/backend/helm/goals/package_test.py new file mode 100644 index 00000000000..8941be1d288 --- /dev/null +++ b/src/python/pants/backend/helm/goals/package_test.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +from pathlib import PurePath + +import pytest +from pants.build_graph.address import Address +from pants.core.goals.package import BuiltPackage +from pants.core.util_rules import config_files, external_tool, stripped_source_files +from pants.engine.fs import Digest, DigestEntries +from pants.engine.rules import QueryRule, SubsystemRule +from pants.source.source_root import rules as source_root_rules +from pants.testutil.rule_runner import RuleRunner + +from pants.backend.helm.goals.package import HelmPackageFieldSet, BuiltHelmArtifact +from pants.backend.helm.goals import package +from pants.backend.helm.subsystems.helm import HelmSubsystem +from pants.backend.helm.util_rules import chart, tool, sources +from pants.backend.helm.target_types import HelmChartTarget +from pants.backend.helm.util_rules.chart import HelmChartMetadata +from pants.backend.helm.testutil import ( + HELM_CHART_FILE, + HELM_TEMPLATE_HELPERS_FILE, + HELM_VALUES_FILE, + K8S_SERVICE_FILE, +) + +@pytest.fixture +def rule_runner() -> RuleRunner: + return RuleRunner( + target_types=[HelmChartTarget], + rules=[ + *config_files.rules(), + *external_tool.rules(), + *tool.rules(), + *chart.rules(), + *package.rules(), + *stripped_source_files.rules(), + *source_root_rules(), + *sources.rules(), + SubsystemRule(HelmSubsystem), + QueryRule(BuiltPackage, [HelmPackageFieldSet]), + QueryRule(DigestEntries, (Digest,)), + ], + ) + +def test_helm_package(rule_runner: RuleRunner) -> None: + rule_runner.write_files( + { + "BUILD": "helm_chart(name='mychart')", + "Chart.yaml": HELM_CHART_FILE, + "values.yaml": HELM_VALUES_FILE, + "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, + "templates/service.yaml": K8S_SERVICE_FILE, + } + ) + + target = rule_runner.get_target(Address("", target_name="mychart")) + field_set = HelmPackageFieldSet.create(target) + + expected_metadata = HelmChartMetadata( + api_version="v2", + name="mychart", + version="0.1.0", + icon="https://www.example.com/icon.png", + description="A Helm chart for Kubernetes", + ) + expected_built_package = BuiltHelmArtifact.create(PurePath("./"), expected_metadata) + + result = rule_runner.request(BuiltPackage, [field_set]) + chart_entries = rule_runner.request(DigestEntries, [result.digest]) + + assert len(result.artifacts) == 1 + assert result.artifacts[0] == expected_built_package + + assert len(chart_entries) == 1 + assert chart_entries[0].path == "mychart-0.1.0.tgz" \ No newline at end of file From a621734ec33698e9cd8f70968ae553b1ede0f67a Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Wed, 9 Mar 2022 16:19:36 +0000 Subject: [PATCH 06/12] Test producing a Helm chart package --- .../pants/backend/helm/goals/package.py | 82 ++++++++++--------- .../pants/backend/helm/goals/package_test.py | 38 +++++---- src/python/pants/backend/helm/testutil.py | 8 +- .../pants/backend/helm/util_rules/chart.py | 8 ++ .../backend/helm/util_rules/chart_test.py | 2 - .../pants/backend/helm/util_rules/tool.py | 4 + 6 files changed, 79 insertions(+), 63 deletions(-) diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py index 3d34f6c15b0..180f562e329 100644 --- a/src/python/pants/backend/helm/goals/package.py +++ b/src/python/pants/backend/helm/goals/package.py @@ -4,36 +4,36 @@ from dataclasses import dataclass from pathlib import PurePath -from pants.build_graph.address import Address -from pants.core.goals.package import BuiltPackage, BuiltPackageArtifact, PackageFieldSet -from pants.engine.fs import AddPrefix, Digest, RemovePrefix, CreateDigest, Directory, MergeDigests -from pants.engine.process import Process, ProcessResult -from pants.engine.rules import Get, collect_rules, rule, MultiGet -from pants.engine.target import WrappedTarget -from pants.engine.unions import UnionRule -from pants.util.logging import LogLevel -from pants.backend.helm.util_rules.chart import HelmChartMetadata, HelmChartRequest, HelmChart from pants.backend.helm.target_types import HelmChartFieldSet, HelmChartOutputPathField +from pants.backend.helm.util_rules.chart import HelmChart, HelmChartMetadata, HelmChartRequest from pants.backend.helm.util_rules.tool import HelmProcess +from pants.core.goals.package import BuiltPackage, BuiltPackageArtifact, PackageFieldSet +from pants.engine.fs import AddPrefix, CreateDigest, Digest, Directory, MergeDigests, RemovePrefix, Snapshot +from pants.engine.process import ProcessResult +from pants.engine.rules import Get, MultiGet, collect_rules, rule +from pants.util.logging import LogLevel logger = logging.getLogger(__name__) + @dataclass(frozen=True) class BuiltHelmArtifact(BuiltPackageArtifact): name: str | None = None metadata: HelmChartMetadata | None = None @classmethod - def create(cls, path_to_dir: PurePath, metadata: HelmChartMetadata) -> BuiltHelmArtifact: - pckg_str = f"{metadata.name}-{metadata.version}" - path = PurePath(path_to_dir, f"{pckg_str}.tgz") + def create(cls, path_to_dir: PurePath, chart_metadata: HelmChartMetadata) -> BuiltHelmArtifact: + path = PurePath(path_to_dir, _helm_artifact_filename(chart_metadata)) return cls( - metadata=metadata, - name=pckg_str, + name=chart_metadata.artifact_name, + metadata=chart_metadata, relpath=str(path), - extra_log_lines=(f"Built Helm chart artifact: {pckg_str}",), + extra_log_lines=(f"Built Helm chart artifact: {path}",), ) +def _helm_artifact_filename(chart_metadata: HelmChartMetadata) -> str: + return f"{chart_metadata.artifact_name}.tgz" + @dataclass(frozen=True) class HelmPackageFieldSet(HelmChartFieldSet, PackageFieldSet): output_path: HelmChartOutputPathField @@ -41,34 +41,36 @@ class HelmPackageFieldSet(HelmChartFieldSet, PackageFieldSet): @rule(desc="Package Helm chart", level=LogLevel.DEBUG) async def run_helm_package(field_set: HelmPackageFieldSet) -> BuiltPackage: - output_dir = "__output_dir" - - chart, output_digest = await MultiGet( - Get(HelmChart, HelmChartRequest(field_set)), - Get(Digest, CreateDigest([Directory(output_dir)])) - ) - - input_digest = await Get(Digest, MergeDigests([chart.snapshot.digest, output_digest])) - - process_result = await Get( - ProcessResult, - HelmProcess( - argv=["package", chart.path], - input_digest=input_digest, - output_directories=(output_dir,), - description=f"Packaging Helm chart: {chart.metadata.name}" + output_dir = "__output_dir" + + chart, output_digest = await MultiGet( + Get(HelmChart, HelmChartRequest(field_set)), + Get(Digest, CreateDigest([Directory(output_dir)])), + ) + + input_digest = await Get(Digest, MergeDigests([chart.snapshot.digest, output_digest])) + + chart_output_path = PurePath(field_set.output_path.value_or_default(file_ending=None)) + process_output_path = PurePath(output_dir, chart_output_path) + process_output_file = process_output_path.joinpath(_helm_artifact_filename(chart.metadata)) + + process_result = await Get( + ProcessResult, + HelmProcess( + argv=["package", chart.path, "-d", output_dir], + input_digest=input_digest, + output_files=(str(process_output_file),), + description=f"Packaging Helm chart: {chart.metadata.name}", + ), ) - ) - chart_dest_path = PurePath(field_set.output_path.value_or_default(file_ending=None)) - stripped_output_digest = await Get(Digest, RemovePrefix(process_result.output_digest, output_dir)) - dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, str(chart_dest_path))) + stripped_output_digest = await Get( + Digest, RemovePrefix(process_result.output_digest, output_dir) + ) + dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, str(chart_output_path))) - return BuiltPackage( - dest_digest, - (BuiltHelmArtifact.create(chart_dest_path, chart.metadata),) - ) + return BuiltPackage(dest_digest, (BuiltHelmArtifact.create(chart_output_path, chart.metadata),)) def rules(): - return collect_rules() \ No newline at end of file + return collect_rules() diff --git a/src/python/pants/backend/helm/goals/package_test.py b/src/python/pants/backend/helm/goals/package_test.py index 8941be1d288..b0deb840c47 100644 --- a/src/python/pants/backend/helm/goals/package_test.py +++ b/src/python/pants/backend/helm/goals/package_test.py @@ -3,26 +3,27 @@ from pathlib import PurePath import pytest -from pants.build_graph.address import Address -from pants.core.goals.package import BuiltPackage -from pants.core.util_rules import config_files, external_tool, stripped_source_files -from pants.engine.fs import Digest, DigestEntries -from pants.engine.rules import QueryRule, SubsystemRule -from pants.source.source_root import rules as source_root_rules -from pants.testutil.rule_runner import RuleRunner -from pants.backend.helm.goals.package import HelmPackageFieldSet, BuiltHelmArtifact from pants.backend.helm.goals import package +from pants.backend.helm.goals.package import BuiltHelmArtifact, HelmPackageFieldSet from pants.backend.helm.subsystems.helm import HelmSubsystem -from pants.backend.helm.util_rules import chart, tool, sources from pants.backend.helm.target_types import HelmChartTarget -from pants.backend.helm.util_rules.chart import HelmChartMetadata from pants.backend.helm.testutil import ( - HELM_CHART_FILE, HELM_TEMPLATE_HELPERS_FILE, HELM_VALUES_FILE, K8S_SERVICE_FILE, + gen_chart_file, ) +from pants.backend.helm.util_rules import chart, sources, tool +from pants.backend.helm.util_rules.chart import HelmChartMetadata +from pants.build_graph.address import Address +from pants.core.goals.package import BuiltPackage +from pants.core.util_rules import config_files, external_tool, stripped_source_files +from pants.engine.fs import Digest, DigestEntries +from pants.engine.rules import QueryRule, SubsystemRule +from pants.source.source_root import rules as source_root_rules +from pants.testutil.rule_runner import RuleRunner + @pytest.fixture def rule_runner() -> RuleRunner: @@ -43,11 +44,15 @@ def rule_runner() -> RuleRunner: ], ) + def test_helm_package(rule_runner: RuleRunner) -> None: + chart_name = "foo" + chart_version = "0.1.0" + rule_runner.write_files( { "BUILD": "helm_chart(name='mychart')", - "Chart.yaml": HELM_CHART_FILE, + "Chart.yaml": gen_chart_file(chart_name, version=chart_version), "values.yaml": HELM_VALUES_FILE, "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, "templates/service.yaml": K8S_SERVICE_FILE, @@ -58,11 +63,8 @@ def test_helm_package(rule_runner: RuleRunner) -> None: field_set = HelmPackageFieldSet.create(target) expected_metadata = HelmChartMetadata( - api_version="v2", - name="mychart", - version="0.1.0", - icon="https://www.example.com/icon.png", - description="A Helm chart for Kubernetes", + name=chart_name, + version=chart_version, ) expected_built_package = BuiltHelmArtifact.create(PurePath("./"), expected_metadata) @@ -73,4 +75,4 @@ def test_helm_package(rule_runner: RuleRunner) -> None: assert result.artifacts[0] == expected_built_package assert len(chart_entries) == 1 - assert chart_entries[0].path == "mychart-0.1.0.tgz" \ No newline at end of file + assert chart_entries[0].path == f"{chart_name}-{chart_version}.tgz" diff --git a/src/python/pants/backend/helm/testutil.py b/src/python/pants/backend/helm/testutil.py index 634ab414b5b..77ef0e1afbc 100644 --- a/src/python/pants/backend/helm/testutil.py +++ b/src/python/pants/backend/helm/testutil.py @@ -5,26 +5,28 @@ from textwrap import dedent -from pants.backend.helm.util_rules.chart import ChartType +from pants.backend.helm.util_rules.chart import ChartType, DEFAULT_API_VERSION def gen_chart_file( name: str, *, version: str, + description: str | None = None, type: ChartType = ChartType.APPLICATION, - api_version: str = "v2", + api_version: str = DEFAULT_API_VERSION, icon: str | None = None, ) -> str: metadata_yaml = dedent( f"""\ apiVersion: {api_version} name: {name} - description: A Helm chart for Kubernetes version: {version} type: {type.value} """ ) + if description: + metadata_yaml += f"description: {description}\n" if icon: metadata_yaml += f"icon: {icon}\n" return metadata_yaml diff --git a/src/python/pants/backend/helm/util_rules/chart.py b/src/python/pants/backend/helm/util_rules/chart.py index 884e958f40b..64d05269874 100644 --- a/src/python/pants/backend/helm/util_rules/chart.py +++ b/src/python/pants/backend/helm/util_rules/chart.py @@ -116,6 +116,7 @@ def to_json_dict(self) -> dict[str, Any]: return d +<<<<<<< HEAD @dataclass(frozen=True) class HelmChartMaintainer: name: str @@ -136,6 +137,9 @@ def to_json_dict(self) -> dict[str, Any]: DEFAULT_API_VERSION = "v2" +======= +DEFAULT_API_VERSION = "v1" +>>>>>>> Test producing a Helm chart package @dataclass(frozen=True) @@ -191,6 +195,10 @@ def from_dict(cls, d: dict[str, Any]) -> HelmChartMetadata: def from_bytes(cls, content: bytes) -> HelmChartMetadata: return cls.from_dict(yaml.safe_load(content)) + @property + def artifact_name(self) -> str: + return f"{self.name}-{self.version}" + def to_dict(self) -> dict[str, Any]: d: dict[str, Any] = { "apiVersion": self.api_version, diff --git a/src/python/pants/backend/helm/util_rules/chart_test.py b/src/python/pants/backend/helm/util_rules/chart_test.py index 9bac7c0d72f..860cafe31a2 100644 --- a/src/python/pants/backend/helm/util_rules/chart_test.py +++ b/src/python/pants/backend/helm/util_rules/chart_test.py @@ -83,9 +83,7 @@ def test_collects_single_chart_sources( expected_metadata = HelmChartMetadata( name=name, version=version, - api_version="v2", icon=icon, - description="A Helm chart for Kubernetes", type=type, ) diff --git a/src/python/pants/backend/helm/util_rules/tool.py b/src/python/pants/backend/helm/util_rules/tool.py index 8dfbc32cb76..286d9a3664d 100644 --- a/src/python/pants/backend/helm/util_rules/tool.py +++ b/src/python/pants/backend/helm/util_rules/tool.py @@ -52,6 +52,7 @@ class HelmProcess: extra_immutable_input_digests: FrozenDict[str, Digest] cache_scope: ProcessCacheScope | None output_directories: tuple[str, ...] + output_files: tuple[str, ...] def __init__( self, @@ -61,6 +62,7 @@ def __init__( description: str, level: LogLevel = LogLevel.INFO, output_directories: Iterable[str] | None = None, + output_files: Iterable[str] | None = None, extra_env: Mapping[str, str] | None = None, extra_immutable_input_digests: Mapping[str, Digest] | None = None, cache_scope: ProcessCacheScope | None = None, @@ -70,6 +72,7 @@ def __init__( self.description = description self.level = level self.output_directories = tuple(output_directories or ()) + self.output_files = tuple(output_files or ()) self.extra_env = FrozenDict(extra_env or {}) self.extra_immutable_input_digests = FrozenDict(extra_immutable_input_digests or {}) self.cache_scope = cache_scope @@ -147,6 +150,7 @@ def helm_process(request: HelmProcess, helm_binary: HelmBinary) -> Process: description=request.description, level=request.level, output_directories=request.output_directories, + output_files=request.output_files, cache_scope=request.cache_scope or ProcessCacheScope.SUCCESSFUL, ) From 1b09516fd223a8dbf38755557914127b459d5b3b Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Mon, 14 Mar 2022 11:15:04 +0100 Subject: [PATCH 07/12] Rebase with latest changes from `helm_chart_support` branch --- src/python/pants/backend/helm/goals/package.py | 9 +++++++-- src/python/pants/backend/helm/goals/package_test.py | 3 +++ src/python/pants/backend/helm/testutil.py | 4 ++-- src/python/pants/backend/helm/util_rules/chart.py | 4 ---- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py index 180f562e329..2ca581cad02 100644 --- a/src/python/pants/backend/helm/goals/package.py +++ b/src/python/pants/backend/helm/goals/package.py @@ -1,3 +1,6 @@ +# Copyright 2022 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + from __future__ import annotations import logging @@ -8,7 +11,7 @@ from pants.backend.helm.util_rules.chart import HelmChart, HelmChartMetadata, HelmChartRequest from pants.backend.helm.util_rules.tool import HelmProcess from pants.core.goals.package import BuiltPackage, BuiltPackageArtifact, PackageFieldSet -from pants.engine.fs import AddPrefix, CreateDigest, Digest, Directory, MergeDigests, RemovePrefix, Snapshot +from pants.engine.fs import AddPrefix, CreateDigest, Digest, Directory, MergeDigests, RemovePrefix from pants.engine.process import ProcessResult from pants.engine.rules import Get, MultiGet, collect_rules, rule from pants.util.logging import LogLevel @@ -31,8 +34,10 @@ def create(cls, path_to_dir: PurePath, chart_metadata: HelmChartMetadata) -> Bui extra_log_lines=(f"Built Helm chart artifact: {path}",), ) + def _helm_artifact_filename(chart_metadata: HelmChartMetadata) -> str: - return f"{chart_metadata.artifact_name}.tgz" + return f"{chart_metadata.artifact_name}.tgz" + @dataclass(frozen=True) class HelmPackageFieldSet(HelmChartFieldSet, PackageFieldSet): diff --git a/src/python/pants/backend/helm/goals/package_test.py b/src/python/pants/backend/helm/goals/package_test.py index b0deb840c47..876d43874e0 100644 --- a/src/python/pants/backend/helm/goals/package_test.py +++ b/src/python/pants/backend/helm/goals/package_test.py @@ -1,3 +1,6 @@ +# Copyright 2022 Pants project contributors (see CONTRIBUTORS.md). +# Licensed under the Apache License, Version 2.0 (see LICENSE). + from __future__ import annotations from pathlib import PurePath diff --git a/src/python/pants/backend/helm/testutil.py b/src/python/pants/backend/helm/testutil.py index 77ef0e1afbc..75ff31eab8a 100644 --- a/src/python/pants/backend/helm/testutil.py +++ b/src/python/pants/backend/helm/testutil.py @@ -5,7 +5,7 @@ from textwrap import dedent -from pants.backend.helm.util_rules.chart import ChartType, DEFAULT_API_VERSION +from pants.backend.helm.util_rules.chart import DEFAULT_API_VERSION, ChartType def gen_chart_file( @@ -26,7 +26,7 @@ def gen_chart_file( """ ) if description: - metadata_yaml += f"description: {description}\n" + metadata_yaml += f"description: {description}\n" if icon: metadata_yaml += f"icon: {icon}\n" return metadata_yaml diff --git a/src/python/pants/backend/helm/util_rules/chart.py b/src/python/pants/backend/helm/util_rules/chart.py index 64d05269874..4f437ba6192 100644 --- a/src/python/pants/backend/helm/util_rules/chart.py +++ b/src/python/pants/backend/helm/util_rules/chart.py @@ -116,7 +116,6 @@ def to_json_dict(self) -> dict[str, Any]: return d -<<<<<<< HEAD @dataclass(frozen=True) class HelmChartMaintainer: name: str @@ -137,9 +136,6 @@ def to_json_dict(self) -> dict[str, Any]: DEFAULT_API_VERSION = "v2" -======= -DEFAULT_API_VERSION = "v1" ->>>>>>> Test producing a Helm chart package @dataclass(frozen=True) From 04f5a7b3857a01e76cacd62d5063166ad00f510c Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Wed, 16 Mar 2022 09:57:40 +0100 Subject: [PATCH 08/12] Verify Helm chart output_path is used as a folder --- .../backend/experimental/helm/register.py | 4 +- .../pants/backend/helm/goals/package.py | 32 +++++----- .../pants/backend/helm/goals/package_test.py | 61 +++++++++++++------ 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/python/pants/backend/experimental/helm/register.py b/src/python/pants/backend/experimental/helm/register.py index f49effe2147..977aae46b97 100644 --- a/src/python/pants/backend/experimental/helm/register.py +++ b/src/python/pants/backend/experimental/helm/register.py @@ -1,7 +1,7 @@ # Copyright 2022 Pants project contributors (see CONTRIBUTORS.md). # Licensed under the Apache License, Version 2.0 (see LICENSE). -from pants.backend.helm.goals import lint +from pants.backend.helm.goals import lint, package from pants.backend.helm.target_types import HelmChartTarget from pants.backend.helm.util_rules import chart, sources, tool @@ -11,4 +11,4 @@ def target_types(): def rules(): - return [*chart.rules(), *lint.rules(), *sources.rules(), *tool.rules()] + return [*chart.rules(), *lint.rules(), *package.rules(), *sources.rules(), *tool.rules()] diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py index 2ca581cad02..07ed083cdef 100644 --- a/src/python/pants/backend/helm/goals/package.py +++ b/src/python/pants/backend/helm/goals/package.py @@ -4,8 +4,8 @@ from __future__ import annotations import logging +import os from dataclasses import dataclass -from pathlib import PurePath from pants.backend.helm.target_types import HelmChartFieldSet, HelmChartOutputPathField from pants.backend.helm.util_rules.chart import HelmChart, HelmChartMetadata, HelmChartRequest @@ -25,12 +25,12 @@ class BuiltHelmArtifact(BuiltPackageArtifact): metadata: HelmChartMetadata | None = None @classmethod - def create(cls, path_to_dir: PurePath, chart_metadata: HelmChartMetadata) -> BuiltHelmArtifact: - path = PurePath(path_to_dir, _helm_artifact_filename(chart_metadata)) + def create(cls, path_to_dir: str, chart_metadata: HelmChartMetadata) -> BuiltHelmArtifact: + path = os.path.join(path_to_dir, _helm_artifact_filename(chart_metadata)) return cls( name=chart_metadata.artifact_name, metadata=chart_metadata, - relpath=str(path), + relpath=path, extra_log_lines=(f"Built Helm chart artifact: {path}",), ) @@ -46,35 +46,33 @@ class HelmPackageFieldSet(HelmChartFieldSet, PackageFieldSet): @rule(desc="Package Helm chart", level=LogLevel.DEBUG) async def run_helm_package(field_set: HelmPackageFieldSet) -> BuiltPackage: - output_dir = "__output_dir" + result_dir = "__out" - chart, output_digest = await MultiGet( + chart, result_digest = await MultiGet( Get(HelmChart, HelmChartRequest(field_set)), - Get(Digest, CreateDigest([Directory(output_dir)])), + Get(Digest, CreateDigest([Directory(result_dir)])), ) - input_digest = await Get(Digest, MergeDigests([chart.snapshot.digest, output_digest])) - - chart_output_path = PurePath(field_set.output_path.value_or_default(file_ending=None)) - process_output_path = PurePath(output_dir, chart_output_path) - process_output_file = process_output_path.joinpath(_helm_artifact_filename(chart.metadata)) + input_digest = await Get(Digest, MergeDigests([chart.snapshot.digest, result_digest])) + process_output_file = os.path.join(result_dir, _helm_artifact_filename(chart.metadata)) process_result = await Get( ProcessResult, HelmProcess( - argv=["package", chart.path, "-d", output_dir], + argv=["package", chart.path, "-d", result_dir], input_digest=input_digest, - output_files=(str(process_output_file),), + output_files=(process_output_file,), description=f"Packaging Helm chart: {chart.metadata.name}", ), ) stripped_output_digest = await Get( - Digest, RemovePrefix(process_result.output_digest, output_dir) + Digest, RemovePrefix(process_result.output_digest, result_dir) ) - dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, str(chart_output_path))) - return BuiltPackage(dest_digest, (BuiltHelmArtifact.create(chart_output_path, chart.metadata),)) + artifact_path = field_set.output_path.value_or_default(file_ending=None) + dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, artifact_path)) + return BuiltPackage(dest_digest, (BuiltHelmArtifact.create(artifact_path, chart.metadata),)) def rules(): diff --git a/src/python/pants/backend/helm/goals/package_test.py b/src/python/pants/backend/helm/goals/package_test.py index 876d43874e0..72f7e303afa 100644 --- a/src/python/pants/backend/helm/goals/package_test.py +++ b/src/python/pants/backend/helm/goals/package_test.py @@ -3,7 +3,7 @@ from __future__ import annotations -from pathlib import PurePath +import os import pytest @@ -22,7 +22,7 @@ from pants.build_graph.address import Address from pants.core.goals.package import BuiltPackage from pants.core.util_rules import config_files, external_tool, stripped_source_files -from pants.engine.fs import Digest, DigestEntries +from pants.engine.fs import Snapshot from pants.engine.rules import QueryRule, SubsystemRule from pants.source.source_root import rules as source_root_rules from pants.testutil.rule_runner import RuleRunner @@ -43,18 +43,40 @@ def rule_runner() -> RuleRunner: *sources.rules(), SubsystemRule(HelmSubsystem), QueryRule(BuiltPackage, [HelmPackageFieldSet]), - QueryRule(DigestEntries, (Digest,)), ], ) +def _assert_build_package( + rule_runner: RuleRunner, *, chart_name: str, chart_version: str, output_path: str = "" +) -> None: + target = rule_runner.get_target(Address("", target_name=chart_name)) + field_set = HelmPackageFieldSet.create(target) + + expected_metadata = HelmChartMetadata( + name=chart_name, + version=chart_version, + ) + expected_built_package = BuiltHelmArtifact.create(output_path, expected_metadata) + + result = rule_runner.request(BuiltPackage, [field_set]) + chart_snapshot = rule_runner.request(Snapshot, [result.digest]) + + assert len(result.artifacts) == 1 + assert result.artifacts[0] == expected_built_package + + if output_path != "": + assert chart_snapshot.dirs == (output_path,) + assert chart_snapshot.files == (os.path.join(output_path, f"{chart_name}-{chart_version}.tgz"),) + + def test_helm_package(rule_runner: RuleRunner) -> None: chart_name = "foo" chart_version = "0.1.0" rule_runner.write_files( { - "BUILD": "helm_chart(name='mychart')", + "BUILD": f"helm_chart(name='{chart_name}')", "Chart.yaml": gen_chart_file(chart_name, version=chart_version), "values.yaml": HELM_VALUES_FILE, "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, @@ -62,20 +84,25 @@ def test_helm_package(rule_runner: RuleRunner) -> None: } ) - target = rule_runner.get_target(Address("", target_name="mychart")) - field_set = HelmPackageFieldSet.create(target) + _assert_build_package(rule_runner, chart_name=chart_name, chart_version=chart_version) - expected_metadata = HelmChartMetadata( - name=chart_name, - version=chart_version, - ) - expected_built_package = BuiltHelmArtifact.create(PurePath("./"), expected_metadata) - result = rule_runner.request(BuiltPackage, [field_set]) - chart_entries = rule_runner.request(DigestEntries, [result.digest]) +def test_helm_package_with_custom_output_path(rule_runner: RuleRunner) -> None: + chart_name = "bar" + chart_version = "0.2.0" - assert len(result.artifacts) == 1 - assert result.artifacts[0] == expected_built_package + output_path = "charts" + + rule_runner.write_files( + { + "BUILD": f"""helm_chart(name="{chart_name}", output_path="{output_path}")""", + "Chart.yaml": gen_chart_file(chart_name, version=chart_version), + "values.yaml": HELM_VALUES_FILE, + "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, + "templates/service.yaml": K8S_SERVICE_FILE, + } + ) - assert len(chart_entries) == 1 - assert chart_entries[0].path == f"{chart_name}-{chart_version}.tgz" + _assert_build_package( + rule_runner, chart_name=chart_name, chart_version=chart_version, output_path=output_path + ) From 24da43d8b63ee10b98e2d53467b88d7503dd6d05 Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Wed, 16 Mar 2022 10:04:42 +0100 Subject: [PATCH 09/12] Use chart address in the process description --- src/python/pants/backend/helm/goals/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py index 07ed083cdef..ae3261d6d66 100644 --- a/src/python/pants/backend/helm/goals/package.py +++ b/src/python/pants/backend/helm/goals/package.py @@ -62,7 +62,7 @@ async def run_helm_package(field_set: HelmPackageFieldSet) -> BuiltPackage: argv=["package", chart.path, "-d", result_dir], input_digest=input_digest, output_files=(process_output_file,), - description=f"Packaging Helm chart: {chart.metadata.name}", + description=f"Packaging Helm chart: {field_set.address.spec_path}", ), ) From f1e04c60edb4b138f31c149b45cbf4a8a6412ea9 Mon Sep 17 00:00:00 2001 From: Antonio Alonso Dominguez Date: Thu, 17 Mar 2022 10:19:21 +0100 Subject: [PATCH 10/12] Simplify Helm package build and remove special case for `value_or_default` in `output_path` --- .../pants/backend/helm/goals/package.py | 45 ++++++++-------- .../pants/backend/helm/goals/package_test.py | 52 +++++++------------ src/python/pants/backend/helm/target_types.py | 27 +++++----- .../pants/backend/helm/util_rules/chart.py | 4 -- 4 files changed, 58 insertions(+), 70 deletions(-) diff --git a/src/python/pants/backend/helm/goals/package.py b/src/python/pants/backend/helm/goals/package.py index ae3261d6d66..67f61f30ebc 100644 --- a/src/python/pants/backend/helm/goals/package.py +++ b/src/python/pants/backend/helm/goals/package.py @@ -11,32 +11,25 @@ from pants.backend.helm.util_rules.chart import HelmChart, HelmChartMetadata, HelmChartRequest from pants.backend.helm.util_rules.tool import HelmProcess from pants.core.goals.package import BuiltPackage, BuiltPackageArtifact, PackageFieldSet -from pants.engine.fs import AddPrefix, CreateDigest, Digest, Directory, MergeDigests, RemovePrefix +from pants.engine.fs import ( + AddPrefix, + CreateDigest, + Digest, + Directory, + MergeDigests, + RemovePrefix, + Snapshot, +) from pants.engine.process import ProcessResult from pants.engine.rules import Get, MultiGet, collect_rules, rule +from pants.engine.unions import UnionRule from pants.util.logging import LogLevel logger = logging.getLogger(__name__) -@dataclass(frozen=True) -class BuiltHelmArtifact(BuiltPackageArtifact): - name: str | None = None - metadata: HelmChartMetadata | None = None - - @classmethod - def create(cls, path_to_dir: str, chart_metadata: HelmChartMetadata) -> BuiltHelmArtifact: - path = os.path.join(path_to_dir, _helm_artifact_filename(chart_metadata)) - return cls( - name=chart_metadata.artifact_name, - metadata=chart_metadata, - relpath=path, - extra_log_lines=(f"Built Helm chart artifact: {path}",), - ) - - def _helm_artifact_filename(chart_metadata: HelmChartMetadata) -> str: - return f"{chart_metadata.artifact_name}.tgz" + return f"{chart_metadata.name}-{chart_metadata.version}.tgz" @dataclass(frozen=True) @@ -70,10 +63,18 @@ async def run_helm_package(field_set: HelmPackageFieldSet) -> BuiltPackage: Digest, RemovePrefix(process_result.output_digest, result_dir) ) - artifact_path = field_set.output_path.value_or_default(file_ending=None) - dest_digest = await Get(Digest, AddPrefix(stripped_output_digest, artifact_path)) - return BuiltPackage(dest_digest, (BuiltHelmArtifact.create(artifact_path, chart.metadata),)) + final_snapshot = await Get( + Snapshot, + AddPrefix(stripped_output_digest, field_set.output_path.value_or_default(file_ending=None)), + ) + return BuiltPackage( + final_snapshot.digest, + artifacts=tuple( + BuiltPackageArtifact(file, extra_log_lines=(f"Built Helm chart artifact: {file}",)) + for file in final_snapshot.files + ), + ) def rules(): - return collect_rules() + return [*collect_rules(), UnionRule(PackageFieldSet, HelmPackageFieldSet)] diff --git a/src/python/pants/backend/helm/goals/package_test.py b/src/python/pants/backend/helm/goals/package_test.py index 72f7e303afa..867c8ecc735 100644 --- a/src/python/pants/backend/helm/goals/package_test.py +++ b/src/python/pants/backend/helm/goals/package_test.py @@ -8,7 +8,7 @@ import pytest from pants.backend.helm.goals import package -from pants.backend.helm.goals.package import BuiltHelmArtifact, HelmPackageFieldSet +from pants.backend.helm.goals.package import HelmPackageFieldSet from pants.backend.helm.subsystems.helm import HelmSubsystem from pants.backend.helm.target_types import HelmChartTarget from pants.backend.helm.testutil import ( @@ -18,11 +18,9 @@ gen_chart_file, ) from pants.backend.helm.util_rules import chart, sources, tool -from pants.backend.helm.util_rules.chart import HelmChartMetadata from pants.build_graph.address import Address from pants.core.goals.package import BuiltPackage from pants.core.util_rules import config_files, external_tool, stripped_source_files -from pants.engine.fs import Snapshot from pants.engine.rules import QueryRule, SubsystemRule from pants.source.source_root import rules as source_root_rules from pants.testutil.rule_runner import RuleRunner @@ -47,27 +45,19 @@ def rule_runner() -> RuleRunner: ) -def _assert_build_package( - rule_runner: RuleRunner, *, chart_name: str, chart_version: str, output_path: str = "" -) -> None: - target = rule_runner.get_target(Address("", target_name=chart_name)) - field_set = HelmPackageFieldSet.create(target) +def _assert_build_package(rule_runner: RuleRunner, *, chart_name: str, chart_version: str) -> None: + rule_runner.set_options(["--source-root-patterns=['src/*']"]) - expected_metadata = HelmChartMetadata( - name=chart_name, - version=chart_version, - ) - expected_built_package = BuiltHelmArtifact.create(output_path, expected_metadata) + target = rule_runner.get_target(Address(f"src/{chart_name}", target_name=chart_name)) + field_set = HelmPackageFieldSet.create(target) + dest_dir = field_set.output_path.value_or_default(file_ending=None) result = rule_runner.request(BuiltPackage, [field_set]) - chart_snapshot = rule_runner.request(Snapshot, [result.digest]) assert len(result.artifacts) == 1 - assert result.artifacts[0] == expected_built_package - - if output_path != "": - assert chart_snapshot.dirs == (output_path,) - assert chart_snapshot.files == (os.path.join(output_path, f"{chart_name}-{chart_version}.tgz"),) + assert result.artifacts[0].relpath == os.path.join( + dest_dir, f"{chart_name}-{chart_version}.tgz" + ) def test_helm_package(rule_runner: RuleRunner) -> None: @@ -76,11 +66,11 @@ def test_helm_package(rule_runner: RuleRunner) -> None: rule_runner.write_files( { - "BUILD": f"helm_chart(name='{chart_name}')", - "Chart.yaml": gen_chart_file(chart_name, version=chart_version), - "values.yaml": HELM_VALUES_FILE, - "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, - "templates/service.yaml": K8S_SERVICE_FILE, + f"src/{chart_name}/BUILD": f"helm_chart(name='{chart_name}')", + f"src/{chart_name}/Chart.yaml": gen_chart_file(chart_name, version=chart_version), + f"src/{chart_name}/values.yaml": HELM_VALUES_FILE, + f"src/{chart_name}/templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, + f"src/{chart_name}/templates/service.yaml": K8S_SERVICE_FILE, } ) @@ -95,14 +85,12 @@ def test_helm_package_with_custom_output_path(rule_runner: RuleRunner) -> None: rule_runner.write_files( { - "BUILD": f"""helm_chart(name="{chart_name}", output_path="{output_path}")""", - "Chart.yaml": gen_chart_file(chart_name, version=chart_version), - "values.yaml": HELM_VALUES_FILE, - "templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, - "templates/service.yaml": K8S_SERVICE_FILE, + f"src/{chart_name}/BUILD": f"""helm_chart(name="{chart_name}", output_path="{output_path}")""", + f"src/{chart_name}/Chart.yaml": gen_chart_file(chart_name, version=chart_version), + f"src/{chart_name}/values.yaml": HELM_VALUES_FILE, + f"src/{chart_name}/templates/_helpers.tpl": HELM_TEMPLATE_HELPERS_FILE, + f"src/{chart_name}/templates/service.yaml": K8S_SERVICE_FILE, } ) - _assert_build_package( - rule_runner, chart_name=chart_name, chart_version=chart_version, output_path=output_path - ) + _assert_build_package(rule_runner, chart_name=chart_name, chart_version=chart_version) diff --git a/src/python/pants/backend/helm/target_types.py b/src/python/pants/backend/helm/target_types.py index 0d6cd34db93..e99294190fa 100644 --- a/src/python/pants/backend/helm/target_types.py +++ b/src/python/pants/backend/helm/target_types.py @@ -3,9 +3,7 @@ from __future__ import annotations -import os from dataclasses import dataclass -from textwrap import dedent from pants.core.goals.package import OutputPathField from pants.engine.target import ( @@ -60,18 +58,23 @@ class HelmChartDependenciesField(Dependencies): class HelmChartOutputPathField(OutputPathField): - help = dedent( - """\ - The destination folder where the final packaged chart will be located.\n - The final package name will still follow Helm convention, this output path will only affect the destination folder where can be found. - """ + help = ( + "Where the built directory tree should be located.\n\n" + "If undefined, this will use the path to the BUILD file, " + "For example, `src/charts/mychart:mychart` would be " + "`src.charts.mychart/mychart/`.\n\n" + "Regardless of whether you use the default or set this field, the path will end with " + "Helms's file format of `-.tgz`, where " + "`chart_name` and `chart_version` are the values extracted from the Chart.yaml file. " + "So, using the default for this field, the target " + "`src/charts/mychart` might have a final path like " + "`src.charts.mychart/mychart-0.1.0.tgz`.\n\n" + f"When running `{bin_name()} package`, this path will be prefixed by `--distdir` (e.g. " + "`dist/`).\n\n" + "Warning: setting this value risks naming collisions with other package targets you may " + "have." ) - def value_or_default(self, *, file_ending: str | None) -> str: - if self.value: - return self.value - return os.path.join(self.address.spec_path.replace(os.sep, ".")) - class HelmChartLintStrictField(TriBoolField): alias = "lint_strict" diff --git a/src/python/pants/backend/helm/util_rules/chart.py b/src/python/pants/backend/helm/util_rules/chart.py index 4f437ba6192..884e958f40b 100644 --- a/src/python/pants/backend/helm/util_rules/chart.py +++ b/src/python/pants/backend/helm/util_rules/chart.py @@ -191,10 +191,6 @@ def from_dict(cls, d: dict[str, Any]) -> HelmChartMetadata: def from_bytes(cls, content: bytes) -> HelmChartMetadata: return cls.from_dict(yaml.safe_load(content)) - @property - def artifact_name(self) -> str: - return f"{self.name}-{self.version}" - def to_dict(self) -> dict[str, Any]: d: dict[str, Any] = { "apiVersion": self.api_version, From 38b01003f35e76f9e6b912ee69a62f3ddba1ff8e Mon Sep 17 00:00:00 2001 From: "A. Alonso Dominguez" <2269440+alonsodomin@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:07:03 +0100 Subject: [PATCH 11/12] Update src/python/pants/backend/helm/target_types.py Co-authored-by: Eric Arellano <14852634+Eric-Arellano@users.noreply.github.com> --- src/python/pants/backend/helm/target_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/pants/backend/helm/target_types.py b/src/python/pants/backend/helm/target_types.py index e99294190fa..7024bd0c495 100644 --- a/src/python/pants/backend/helm/target_types.py +++ b/src/python/pants/backend/helm/target_types.py @@ -67,8 +67,8 @@ class HelmChartOutputPathField(OutputPathField): "Helms's file format of `-.tgz`, where " "`chart_name` and `chart_version` are the values extracted from the Chart.yaml file. " "So, using the default for this field, the target " - "`src/charts/mychart` might have a final path like " - "`src.charts.mychart/mychart-0.1.0.tgz`.\n\n" + "`src/charts/mychart:tgt_name` might have a final path like " + "`src.charts.mychart/tgt_name/mychart-0.1.0.tgz`.\n\n" f"When running `{bin_name()} package`, this path will be prefixed by `--distdir` (e.g. " "`dist/`).\n\n" "Warning: setting this value risks naming collisions with other package targets you may " From b8ab4c3002d4df6c01f75fdfb8bd547fef354556 Mon Sep 17 00:00:00 2001 From: "A. Alonso Dominguez" <2269440+alonsodomin@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:07:10 +0100 Subject: [PATCH 12/12] Update src/python/pants/backend/helm/target_types.py Co-authored-by: Eric Arellano <14852634+Eric-Arellano@users.noreply.github.com> --- src/python/pants/backend/helm/target_types.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/pants/backend/helm/target_types.py b/src/python/pants/backend/helm/target_types.py index 7024bd0c495..3f90904d13d 100644 --- a/src/python/pants/backend/helm/target_types.py +++ b/src/python/pants/backend/helm/target_types.py @@ -61,8 +61,8 @@ class HelmChartOutputPathField(OutputPathField): help = ( "Where the built directory tree should be located.\n\n" "If undefined, this will use the path to the BUILD file, " - "For example, `src/charts/mychart:mychart` would be " - "`src.charts.mychart/mychart/`.\n\n" + "For example, `src/charts/mychart:tgt_name` would be " + "`src.charts.mychart/tgt_name/`.\n\n" "Regardless of whether you use the default or set this field, the path will end with " "Helms's file format of `-.tgz`, where " "`chart_name` and `chart_version` are the values extracted from the Chart.yaml file. "