Skip to content

Commit

Permalink
Add multiple tests for secret name validation
Browse files Browse the repository at this point in the history
Signed-off-by: Vivek Singh <vivekkmr45@yahoo.in>
  • Loading branch information
viveksyngh committed Feb 8, 2019
1 parent 89e1b81 commit 008f37c
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 25 deletions.
21 changes: 11 additions & 10 deletions commands/secret_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,12 @@ func preRunSecretCreate(cmd *cobra.Command, args []string) error {
return fmt.Errorf("please provide secret using only one option from --from-literal, --from-file and STDIN")
}

err := validateSecretName(args[0])
isValid, err := validateSecretName(args[0])
if !isValid {
return err
}

return err
return nil
}

func runSecretCreate(cmd *cobra.Command, args []string) error {
Expand Down Expand Up @@ -108,22 +111,20 @@ func readSecretFromFile(secretFile string) (string, error) {
return string(fileData), err
}

//kubectl create secret generic my_secret --from-literal=my_secret=my_secret
//The Secret "my_secret" is invalid: metadata.name: Invalid value: "my_secret": a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

// Kubernetes DNS-1123 Subdomain Regex
// https://github.com/kubernetes/kubernetes/blob/6902f3112d98eb6bd0894886ff9cd3fbd03a7f79/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L131
const (
dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*"
dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
dns1123SubdomainFmt string = dns1123LabelFmt + "(\\." + dns1123LabelFmt + ")*"
invalidSecretNameMessage string = `ERROR: invalid secret name: %s, secret name must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (regex used for validation is %s)`
)

func validateSecretName(secretName string) error {
func validateSecretName(secretName string) (bool, error) {
var dns1123SubdomainRegexp = regexp.MustCompile("^" + dns1123SubdomainFmt + "$")

if !dns1123SubdomainRegexp.MatchString(secretName) {
return fmt.Errorf(`ERROR: invalid secret name: %s, secret name must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (regex used for validation is %s)`, secretName, dns1123SubdomainRegexp)
return false, fmt.Errorf(invalidSecretNameMessage, secretName, dns1123SubdomainRegexp)
}

return nil
return true, nil
}
59 changes: 44 additions & 15 deletions commands/secret_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package commands

import (
"fmt"
"net/http"
"os"
"regexp"
Expand Down Expand Up @@ -107,23 +108,51 @@ func Test_SecretCreateFromLiteral(t *testing.T) {
}
}

func Test_validateSecretName_Valid(t *testing.T) {
secretName := "api-key-secret"
err := validateSecretName(secretName)
if err != nil {
t.Errorf("Returned error for valid secret: %s", err.Error())
}
}
func Test_validateSecretName(t *testing.T) {
var dns1123SubdomainRegexp = regexp.MustCompile("^" + dns1123SubdomainFmt + "$")

func Test_validateSecretName_Invalid(t *testing.T) {
secretName := "api_key_@secret"
err := validateSecretName(secretName)
if err == nil {
t.Errorf("Did not return error")
testcases := []struct {
Name string
SecretName string
Err error
}{
{
Name: "Valid secret with hyphen",
SecretName: "api-key-secret",
Err: nil,
},
{
Name: "Valid secret without hyphen",
SecretName: "apikeysecret",
Err: nil,
},
{
Name: "Valid secret with hyphen and number",
SecretName: "api-key-secret-123",
Err: nil,
},
{
Name: "Invalid secret name",
SecretName: "api_key_@secret",
Err: fmt.Errorf(invalidSecretNameMessage, "api_key_@secret", dns1123SubdomainRegexp),
},
{
Name: "Invalid secret name with number",
SecretName: "12api_key_secret",
Err: fmt.Errorf(invalidSecretNameMessage, "12api_key_secret", dns1123SubdomainRegexp),
},
}

errMessage := err.Error()
if found, err := regexp.MatchString(`(?m:`+secretName+`)`, errMessage); err != nil || !found {
t.Fatalf("Output is not as expected:\nExpected:\n%s\n Got:\n%s", `(?m:`+secretName+`)`, errMessage)
for _, test := range testcases {
isValid, err := validateSecretName(test.SecretName)
if isValid {
if err != nil {
t.Errorf("testcase %s failed, returned error for valid secret %s", test.Name, test.SecretName)
}
} else {
if err.Error() != test.Err.Error() {
t.Errorf("testcase %s failed, expected: %s, got: %s", test.Name, test.Err.Error(), err.Error())
}
}
}
}

0 comments on commit 008f37c

Please sign in to comment.