Skip to content

Commit 3abd0e8

Browse files
validate helm_release.name in ModifyPlan
1 parent b539eaf commit 3abd0e8

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

helm/resource_helm_release.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"net/url"
1212
"os"
1313
pathpkg "path"
14+
"regexp"
1415
"strings"
1516
"time"
1617

@@ -1665,6 +1666,8 @@ func checkChartDependencies(ctx context.Context, model *HelmReleaseModel, c *cha
16651666
return false, diags
16661667
}
16671668

1669+
var helmReleaseNameRegexp = regexp.MustCompile(`^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$`)
1670+
16681671
func (r *HelmRelease) ModifyPlan(ctx context.Context, req resource.ModifyPlanRequest, resp *resource.ModifyPlanResponse) {
16691672
if req.Plan.Raw.IsNull() {
16701673
// resource is being destroyed
@@ -1675,6 +1678,20 @@ func (r *HelmRelease) ModifyPlan(ctx context.Context, req resource.ModifyPlanReq
16751678
if resp.Diagnostics.HasError() {
16761679
return
16771680
}
1681+
if !plan.Name.IsNull() {
1682+
name := plan.Name.ValueString()
1683+
if !helmReleaseNameRegexp.MatchString(name) {
1684+
resp.Diagnostics.AddError(
1685+
"Invalid Helm Release Name",
1686+
fmt.Sprintf(
1687+
"Release name %q is invalid. Must match regex %s and be no longer than 53 characters.",
1688+
name,
1689+
helmReleaseNameRegexp.String(),
1690+
),
1691+
)
1692+
return
1693+
}
1694+
}
16781695
var state *HelmReleaseModel
16791696
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
16801697
if resp.Diagnostics.HasError() {

helm/resource_helm_release_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,29 @@ func TestAccResourceRelease_createNamespace(t *testing.T) {
823823
},
824824
})
825825
}
826+
func TestAccResourceRelease_invalidReleaseName(t *testing.T) {
827+
invalidNames := []string{
828+
"invalid_helm_release_name",
829+
"ThisHelmRelease",
830+
}
831+
namespace := createRandomNamespace(t)
832+
defer deleteNamespace(t, namespace)
833+
834+
for index, name := range invalidNames {
835+
t.Run(fmt.Sprintf("invalid_name_%d", index), func(t *testing.T) {
836+
resource.Test(t, resource.TestCase{
837+
ProtoV6ProviderFactories: protoV6ProviderFactories(),
838+
Steps: []resource.TestStep{
839+
{
840+
Config: testAccHelmReleaseConfigInvalidName(testResourceName, namespace, name),
841+
PlanOnly: true,
842+
ExpectError: regexp.MustCompile(`Invalid Helm Release Name`),
843+
},
844+
},
845+
})
846+
})
847+
}
848+
}
826849

827850
func TestAccResourceRelease_LocalVersion(t *testing.T) {
828851
// NOTE this test confirms that the user is warned if their configured
@@ -894,6 +917,17 @@ func testAccHelmReleaseConfigBasic(resource, ns, name, version string) string {
894917
`, resource, name, ns, testRepositoryURL, version)
895918
}
896919

920+
func testAccHelmReleaseConfigInvalidName(resource, ns, name string) string {
921+
return fmt.Sprintf(`
922+
resource "helm_release" "%s" {
923+
name = %q
924+
namespace = %q
925+
repository = %q
926+
chart = "test-chart"
927+
}
928+
`, resource, name, ns, testRepositoryURL)
929+
}
930+
897931
func testAccHelmReleaseConfig_set_wo(resource, ns, name, version string) string {
898932
return fmt.Sprintf(`
899933
resource "helm_release" "%s" {

0 commit comments

Comments
 (0)