From 1b8e98051989d6f1c5cb5abaa80e50fde669dc08 Mon Sep 17 00:00:00 2001
From: Hidde Beydals <hello@hidde.co>
Date: Mon, 14 Dec 2020 17:18:01 +0100
Subject: [PATCH] Make resource selector args case insensitive

So that `<kind>/<name>` flags can be supplied as:

* `secret/foo`
* `Secret/foo`
* `SeCrEt/foo`

But result in: `Secret/foo`.

Signed-off-by: Hidde Beydals <hello@hidde.co>
---
 internal/flags/helm_chart_source.go         | 8 +++++---
 internal/flags/helm_chart_source_test.go    | 1 +
 internal/flags/helm_release_values.go       | 5 +++--
 internal/flags/helm_release_values_test.go  | 1 +
 internal/flags/kustomization_source.go      | 8 +++++---
 internal/flags/kustomization_source_test.go | 1 +
 internal/utils/utils.go                     | 9 +++++++++
 7 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/internal/flags/helm_chart_source.go b/internal/flags/helm_chart_source.go
index 5055c75b..f367e43b 100644
--- a/internal/flags/helm_chart_source.go
+++ b/internal/flags/helm_chart_source.go
@@ -20,8 +20,9 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/fluxcd/flux2/internal/utils"
 	sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
+
+	"github.com/fluxcd/flux2/internal/utils"
 )
 
 var supportedHelmChartSourceKinds = []string{sourcev1.HelmRepositoryKind, sourcev1.GitRepositoryKind, sourcev1.BucketKind}
@@ -48,13 +49,14 @@ func (s *HelmChartSource) Set(str string) error {
 	if sourceKind == "" || sourceName == "" {
 		return fmt.Errorf("invalid helm chart source '%s', must be in format <kind>/<name>", str)
 	}
-	if !utils.ContainsItemString(supportedHelmChartSourceKinds, sourceKind) {
+	cleanSourceKind, ok := utils.ContainsEqualFoldItemString(supportedHelmChartSourceKinds, sourceKind)
+	if !ok {
 		return fmt.Errorf("source kind '%s' is not supported, must be one of: %s",
 			sourceKind, strings.Join(supportedHelmChartSourceKinds, ", "))
 	}
 
 	s.Name = sourceName
-	s.Kind = sourceKind
+	s.Kind = cleanSourceKind
 
 	return nil
 }
diff --git a/internal/flags/helm_chart_source_test.go b/internal/flags/helm_chart_source_test.go
index 298f3553..b484c983 100644
--- a/internal/flags/helm_chart_source_test.go
+++ b/internal/flags/helm_chart_source_test.go
@@ -31,6 +31,7 @@ func TestHelmChartSource_Set(t *testing.T) {
 		expectErr bool
 	}{
 		{"supported", fmt.Sprintf("%s/foo", sourcev1.HelmRepositoryKind), fmt.Sprintf("%s/foo", sourcev1.HelmRepositoryKind), false},
+		{"lower case kind", "helmrepository/foo", fmt.Sprintf("%s/foo", sourcev1.HelmRepositoryKind), false},
 		{"unsupported", "Unsupported/kind", "", true},
 		{"invalid format", sourcev1.HelmRepositoryKind, "", true},
 		{"missing name", fmt.Sprintf("%s/", sourcev1.HelmRepositoryKind), "", true},
diff --git a/internal/flags/helm_release_values.go b/internal/flags/helm_release_values.go
index 84509c67..62035be8 100644
--- a/internal/flags/helm_release_values.go
+++ b/internal/flags/helm_release_values.go
@@ -47,13 +47,14 @@ func (v *HelmReleaseValuesFrom) Set(str string) error {
 	if sourceKind == "" {
 		return fmt.Errorf("invalid Kubernetes object reference '%s', must be in format <kind>/<name>", str)
 	}
-	if !utils.ContainsItemString(supportedHelmReleaseValuesFromKinds, sourceKind) {
+	cleanSourceKind, ok := utils.ContainsEqualFoldItemString(supportedHelmReleaseValuesFromKinds, sourceKind)
+	if !ok {
 		return fmt.Errorf("reference kind '%s' is not supported, must be one of: %s",
 			sourceKind, strings.Join(supportedHelmReleaseValuesFromKinds, ", "))
 	}
 
 	v.Name = sourceName
-	v.Kind = sourceKind
+	v.Kind = cleanSourceKind
 
 	return nil
 }
diff --git a/internal/flags/helm_release_values_test.go b/internal/flags/helm_release_values_test.go
index 4b18b847..f6fc28e4 100644
--- a/internal/flags/helm_release_values_test.go
+++ b/internal/flags/helm_release_values_test.go
@@ -28,6 +28,7 @@ func TestHelmReleaseValuesFrom_Set(t *testing.T) {
 		expectErr bool
 	}{
 		{"supported", "Secret/foo", "Secret/foo", false},
+		{"lower case kind", "secret/foo", "Secret/foo", false},
 		{"unsupported", "Unsupported/kind", "", true},
 		{"invalid format", "Secret", "", true},
 		{"empty", "", "", true},
diff --git a/internal/flags/kustomization_source.go b/internal/flags/kustomization_source.go
index 109132b2..3b66ca70 100644
--- a/internal/flags/kustomization_source.go
+++ b/internal/flags/kustomization_source.go
@@ -20,8 +20,9 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/fluxcd/flux2/internal/utils"
 	sourcev1 "github.com/fluxcd/source-controller/api/v1beta1"
+
+	"github.com/fluxcd/flux2/internal/utils"
 )
 
 var supportedKustomizationSourceKinds = []string{sourcev1.GitRepositoryKind, sourcev1.BucketKind}
@@ -54,13 +55,14 @@ func (s *KustomizationSource) Set(str string) error {
 		}
 		sourceKind = sourcev1.GitRepositoryKind
 	}
-	if !utils.ContainsItemString(supportedKustomizationSourceKinds, sourceKind) {
+	cleanSourceKind, ok := utils.ContainsEqualFoldItemString(supportedKustomizationSourceKinds, sourceKind)
+	if !ok {
 		return fmt.Errorf("source kind '%s' is not supported, must be one of: %s",
 			sourceKind, strings.Join(supportedKustomizationSourceKinds, ", "))
 	}
 
 	s.Name = sourceName
-	s.Kind = sourceKind
+	s.Kind = cleanSourceKind
 
 	return nil
 }
diff --git a/internal/flags/kustomization_source_test.go b/internal/flags/kustomization_source_test.go
index 09106137..b2950218 100644
--- a/internal/flags/kustomization_source_test.go
+++ b/internal/flags/kustomization_source_test.go
@@ -32,6 +32,7 @@ func TestKustomizationSource_Set(t *testing.T) {
 	}{
 		{"supported", fmt.Sprintf("%s/foo", sourcev1.GitRepositoryKind), fmt.Sprintf("%s/foo", sourcev1.GitRepositoryKind), false},
 		{"default kind", "foo", fmt.Sprintf("%s/foo", sourcev1.GitRepositoryKind), false},
+		{"lower case kind", "gitrepository/foo", fmt.Sprintf("%s/foo", sourcev1.GitRepositoryKind), false},
 		{"unsupported", "Unsupported/kind", "", true},
 		{"missing name", fmt.Sprintf("%s/", sourcev1.GitRepositoryKind), "", true},
 		{"empty", "", "", true},
diff --git a/internal/utils/utils.go b/internal/utils/utils.go
index 91b9011c..47e1a401 100644
--- a/internal/utils/utils.go
+++ b/internal/utils/utils.go
@@ -230,6 +230,15 @@ func ContainsItemString(s []string, e string) bool {
 	return false
 }
 
+func ContainsEqualFoldItemString(s []string, e string) (string, bool) {
+	for _, a := range s {
+		if strings.EqualFold(a, e) {
+			return a, true
+		}
+	}
+	return "", false
+}
+
 func ParseObjectKindName(input string) (string, string) {
 	kind := ""
 	name := input
-- 
GitLab