diff --git a/cmd/flux/create.go b/cmd/flux/create.go index 758a2f54e8e8171ab8369bad6315b4cde96b952e..9aed0c43f9933830192da48c904b43bf205d4a75 100644 --- a/cmd/flux/create.go +++ b/cmd/flux/create.go @@ -19,6 +19,7 @@ package main import ( "context" "fmt" + "regexp" "strings" "time" @@ -51,6 +52,18 @@ func init() { createCmd.PersistentFlags().BoolVar(&createArgs.export, "export", false, "export in YAML format to stdout") createCmd.PersistentFlags().StringSliceVar(&createArgs.labels, "label", nil, "set labels on the resource (can specify multiple labels with commas: label1=value1,label2=value2)") + createCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("name is required") + } + + name := args[0] + if !validateObjectName(name) { + return fmt.Errorf("name '%s' is invalid, it should adhere to standard defined in RFC 1123, the name can only contain alphanumeric characters or '-'", name) + } + + return nil + } rootCmd.AddCommand(createCmd) } @@ -150,3 +163,8 @@ func parseLabels() (map[string]string, error) { return result, nil } + +func validateObjectName(name string) bool { + r := regexp.MustCompile("^[a-z0-9]([a-z0-9\\-]){0,61}[a-z0-9]$") + return r.MatchString(name) +} diff --git a/cmd/flux/create_alert.go b/cmd/flux/create_alert.go index 0a5ea93aae8b016b47f3cacfaacaca89b50d18f1..7f9968b8e958d0756bce499af90dc6245764a485 100644 --- a/cmd/flux/create_alert.go +++ b/cmd/flux/create_alert.go @@ -63,9 +63,6 @@ func init() { } func createAlertCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("Alert name is required") - } name := args[0] if alertArgs.providerRef == "" { diff --git a/cmd/flux/create_alertprovider.go b/cmd/flux/create_alertprovider.go index 7d5bf640958bd096d7b88b2ecc0b8dda02127c36..2663482c5144446e0269b867be3ae96ed8ffdb65 100644 --- a/cmd/flux/create_alertprovider.go +++ b/cmd/flux/create_alertprovider.go @@ -73,9 +73,6 @@ func init() { } func createAlertProviderCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("Provider name is required") - } name := args[0] if alertProviderArgs.alertType == "" { diff --git a/cmd/flux/create_helmrelease.go b/cmd/flux/create_helmrelease.go index 2072c720e99492b6a0fe73b0d0d79919259d702e..d8f37cc59f2188348e91aae8e9ac7303ac58c217 100644 --- a/cmd/flux/create_helmrelease.go +++ b/cmd/flux/create_helmrelease.go @@ -139,9 +139,6 @@ func init() { } func createHelmReleaseCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("HelmRelease name is required") - } name := args[0] if helmReleaseArgs.chart == "" { diff --git a/cmd/flux/create_image_policy.go b/cmd/flux/create_image_policy.go index 05cb5c142c3b478a7f5b24dc975491de80c04947..b9d8eb1a0e2708c95b91795bb9b37d88576717d4 100644 --- a/cmd/flux/create_image_policy.go +++ b/cmd/flux/create_image_policy.go @@ -84,9 +84,6 @@ func (obj imagePolicyAdapter) getObservedGeneration() int64 { } func createImagePolicyRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("ImagePolicy name is required") - } objectName := args[0] if imagePolicyArgs.imageRef == "" { diff --git a/cmd/flux/create_image_repository.go b/cmd/flux/create_image_repository.go index b5ffdcb83286cbf25afb539e974f53c6f63aa5ec..140658f3ce26ddb02db73711de6ab78a3046372a 100644 --- a/cmd/flux/create_image_repository.go +++ b/cmd/flux/create_image_repository.go @@ -83,9 +83,6 @@ func init() { } func createImageRepositoryRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("ImageRepository name is required") - } objectName := args[0] if imageRepoArgs.image == "" { diff --git a/cmd/flux/create_image_update.go b/cmd/flux/create_image_update.go index f1b7e2cad825a9ac164a5ffc2490e607036c76ad..a67f6bc341fad4f34003858a67ee9899c3deb0a0 100644 --- a/cmd/flux/create_image_update.go +++ b/cmd/flux/create_image_update.go @@ -94,9 +94,6 @@ func init() { } func createImageUpdateRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("ImageUpdateAutomation name is required") - } objectName := args[0] if imageUpdateArgs.gitRepoName == "" { diff --git a/cmd/flux/create_kustomization.go b/cmd/flux/create_kustomization.go index d523374dc87dc5d77354b0b3fe8400368994c8ba..4d0ebb99e0129e7f78ab8a156aa26c9e0cb03ea1 100644 --- a/cmd/flux/create_kustomization.go +++ b/cmd/flux/create_kustomization.go @@ -119,9 +119,6 @@ func NewKustomizationFlags() kustomizationFlags { } func createKsCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("Kustomization name is required") - } name := args[0] if kustomizationArgs.path == "" { diff --git a/cmd/flux/create_receiver.go b/cmd/flux/create_receiver.go index d6004dc1b754547bfb4b15173c811d0d5f07e279..6533f17374ded84b35a1092d2fe61575b8fc3789 100644 --- a/cmd/flux/create_receiver.go +++ b/cmd/flux/create_receiver.go @@ -67,9 +67,6 @@ func init() { } func createReceiverCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("Receiver name is required") - } name := args[0] if receiverArgs.receiverType == "" { diff --git a/cmd/flux/create_secret_git.go b/cmd/flux/create_secret_git.go index 769c25269f849033011177502c696d3dab04ccad..0effc1b52ec4bb1e9b60f8151eb2cb0f3be0bb62 100644 --- a/cmd/flux/create_secret_git.go +++ b/cmd/flux/create_secret_git.go @@ -112,9 +112,6 @@ func NewSecretGitFlags() secretGitFlags { } func createSecretGitCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("secret name is required") - } name := args[0] if secretGitArgs.url == "" { return fmt.Errorf("url is required") diff --git a/cmd/flux/create_secret_git_test.go b/cmd/flux/create_secret_git_test.go index 01a3e9291c9fcabdaf4dfbd78f8fb098db7bbd55..16ff400a90657f23ae36928f2a96b593bcddb978 100644 --- a/cmd/flux/create_secret_git_test.go +++ b/cmd/flux/create_secret_git_test.go @@ -13,7 +13,7 @@ func TestCreateGitSecret(t *testing.T) { { name: "no args", args: "create secret git", - assert: assertError("secret name is required"), + assert: assertError("name is required"), }, { name: "basic secret", diff --git a/cmd/flux/create_secret_helm.go b/cmd/flux/create_secret_helm.go index 8f9df1b544341d8954a664d0934a61a13daa8c91..80a7ce9d959a233c7de2ab45d102c751485f6724 100644 --- a/cmd/flux/create_secret_helm.go +++ b/cmd/flux/create_secret_helm.go @@ -18,7 +18,6 @@ package main import ( "context" - "fmt" "github.com/spf13/cobra" corev1 "k8s.io/api/core/v1" @@ -68,9 +67,6 @@ func init() { } func createSecretHelmCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("secret name is required") - } name := args[0] labels, err := parseLabels() diff --git a/cmd/flux/create_secret_helm_test.go b/cmd/flux/create_secret_helm_test.go index 04c96dbb5b2737281627971207348e2567fcfc00..fe0bc0c941789cc3524fb780103190ca7ded0b88 100644 --- a/cmd/flux/create_secret_helm_test.go +++ b/cmd/flux/create_secret_helm_test.go @@ -12,7 +12,7 @@ func TestCreateHelmSecret(t *testing.T) { }{ { args: "create secret helm", - assert: assertError("secret name is required"), + assert: assertError("name is required"), }, { args: "create secret helm helm-secret --username=my-username --password=my-password --namespace=my-namespace --export", diff --git a/cmd/flux/create_secret_tls.go b/cmd/flux/create_secret_tls.go index a308066e405017ccad8f1e6f2d335d4bfe5deee1..b89a26010274f588d3378b028e4fb95573e53653 100644 --- a/cmd/flux/create_secret_tls.go +++ b/cmd/flux/create_secret_tls.go @@ -18,7 +18,6 @@ package main import ( "context" - "fmt" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -67,9 +66,6 @@ func init() { } func createSecretTLSCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("secret name is required") - } name := args[0] labels, err := parseLabels() diff --git a/cmd/flux/create_secret_tls_test.go b/cmd/flux/create_secret_tls_test.go index 8085c584d507cda62ac9e9c8e53ff160a0d26648..31d4920046f15d31a57f1593b6fe700d174206f9 100644 --- a/cmd/flux/create_secret_tls_test.go +++ b/cmd/flux/create_secret_tls_test.go @@ -12,7 +12,7 @@ func TestCreateTlsSecretNoArgs(t *testing.T) { }{ { args: "create secret tls", - assert: assertError("secret name is required"), + assert: assertError("name is required"), }, { args: "create secret tls certs --namespace=my-namespace --cert-file=./testdata/create_secret/tls/test-cert.pem --key-file=./testdata/create_secret/tls/test-key.pem --export", diff --git a/cmd/flux/create_source_bucket.go b/cmd/flux/create_source_bucket.go index 50858c5bdd867aebb5988304ab5fe9cb339a27f9..31279799f27308fdde5b3cd4948cf78684782a69 100644 --- a/cmd/flux/create_source_bucket.go +++ b/cmd/flux/create_source_bucket.go @@ -93,9 +93,6 @@ func NewSourceBucketFlags() sourceBucketFlags { } func createSourceBucketCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("Bucket source name is required") - } name := args[0] if sourceBucketArgs.name == "" { diff --git a/cmd/flux/create_source_git.go b/cmd/flux/create_source_git.go index 17a928b6dc776596b16e40a0fe0b4888a58b16fd..2f13dd9cf57ae21601adcfd83e0149cdec341f48 100644 --- a/cmd/flux/create_source_git.go +++ b/cmd/flux/create_source_git.go @@ -150,9 +150,6 @@ func newSourceGitFlags() sourceGitFlags { } func createSourceGitCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("GitRepository source name is required") - } name := args[0] if sourceGitArgs.url == "" { diff --git a/cmd/flux/create_source_git_test.go b/cmd/flux/create_source_git_test.go index 1b391bce16ba9df26bbdd80dcefc90247d0506e9..73c1724a91b3657f365fcdd0cbf5f004fb64bf22 100644 --- a/cmd/flux/create_source_git_test.go +++ b/cmd/flux/create_source_git_test.go @@ -96,7 +96,7 @@ func TestCreateSourceGit(t *testing.T) { { "NoArgs", "create source git", - assertError("GitRepository source name is required"), + assertError("name is required"), nil, }, { "Succeeded", diff --git a/cmd/flux/create_source_helm.go b/cmd/flux/create_source_helm.go index 81b5a05fa112a20c53a674f1d27a9bb43e2d447d..2d3f251354ad89ab1b709f654cd47c8f0fa546c7 100644 --- a/cmd/flux/create_source_helm.go +++ b/cmd/flux/create_source_helm.go @@ -91,9 +91,6 @@ func init() { } func createSourceHelmCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("HelmRepository source name is required") - } name := args[0] if sourceHelmArgs.url == "" { diff --git a/cmd/flux/create_tenant.go b/cmd/flux/create_tenant.go index 88b8eda6521c9adb5224d5aa793ae9adc1485a9c..4ac8eb9688046c89cccfd0fb787982f0c82ae4c0 100644 --- a/cmd/flux/create_tenant.go +++ b/cmd/flux/create_tenant.go @@ -70,9 +70,6 @@ func init() { } func createTenantCmdRun(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return fmt.Errorf("tenant name is required") - } tenant := args[0] if err := validation.IsQualifiedName(tenant); len(err) > 0 { return fmt.Errorf("invalid tenant name '%s': %v", tenant, err) diff --git a/cmd/flux/create_test.go b/cmd/flux/create_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ee38fe5051986793e09666ce1baf1442771100cf --- /dev/null +++ b/cmd/flux/create_test.go @@ -0,0 +1,55 @@ +package main + +import ( + "testing" + + "k8s.io/apimachinery/pkg/util/rand" +) + +func Test_validateObjectName(t *testing.T) { + tests := []struct { + name string + valid bool + }{ + { + name: "flux-system", + valid: true, + }, + { + name: "-flux-system", + valid: false, + }, + { + name: "-flux-system-", + valid: false, + }, + { + name: "third.first", + valid: false, + }, + { + name: "THirdfirst", + valid: false, + }, + { + name: "THirdfirst", + valid: false, + }, + { + name: rand.String(63), + valid: true, + }, + { + name: rand.String(64), + valid: false, + }, + } + + for _, tt := range tests { + valid := validateObjectName(tt.name) + if valid != tt.valid { + t.Errorf("expected name %q to return %t for validateObjectName func but got %t", + tt.name, tt.valid, valid) + } + } +}