diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index e5c2b71edd5..685cffa0907 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -915,6 +915,32 @@ __EOF__ set +o errexit } +# runs specific kubectl create tests +run_create_tests() { + set -o nounset + set -o errexit + + ### Create generic secret with explicit namespace + # Pre-condition: secret 'mysecret' does not exist + output_message=$(! kubectl get secrets mysecret 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${output_message}" 'secrets "mysecret" not found' + # Command + output_message=$(kubectl create "${kube_flags[@]}" secret generic mysecret --dry-run --from-literal=foo=bar -o jsonpath='{.metadata.namespace}' --namespace=user-specified) + # Post-condition: mysecret still not created since --dry-run was used + # Output from 'create' command should contain the specified --namespace value + failure_message=$(! kubectl get secrets mysecret 2>&1 "${kube_flags[@]}") + kube::test::if_has_string "${failure_message}" 'secrets "mysecret" not found' + kube::test::if_has_string "${output_message}" 'user-specified' + # Command + output_message=$(kubectl create "${kube_flags[@]}" secret generic mysecret --dry-run --from-literal=foo=bar -o jsonpath='{.metadata.namespace}') + # Post-condition: jsonpath for .metadata.namespace should be empty for object since --namespace was not explicitly specified + kube::test::if_empty_string "${output_message}" + + set +o nounset + set +o errexit +} + + # Runs tests related to kubectl apply. run_kubectl_apply_tests() { set -o nounset @@ -4568,6 +4594,14 @@ runTests() { record_command run_kubectl_get_tests fi + + ###################### + # Create # + ###################### + if kube::test::if_supports_resource "${secrets}" ; then + record_command run_create_tests + fi + ################## # Global timeout # ################## diff --git a/pkg/kubectl/cmd/create.go b/pkg/kubectl/cmd/create.go index 5ed32cb813f..61433deb608 100644 --- a/pkg/kubectl/cmd/create.go +++ b/pkg/kubectl/cmd/create.go @@ -23,7 +23,9 @@ import ( "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -242,7 +244,7 @@ type CreateSubcommandOptions struct { // RunCreateSubcommand executes a create subcommand using the specified options func RunCreateSubcommand(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, options *CreateSubcommandOptions) error { - namespace, _, err := f.DefaultNamespace() + namespace, nsOverriden, err := f.DefaultNamespace() if err != nil { return err } @@ -283,6 +285,10 @@ func RunCreateSubcommand(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, o if err != nil { return err } + } else { + if meta, err := meta.Accessor(obj); err == nil && nsOverriden { + meta.SetNamespace(namespace) + } } if useShortOutput := options.OutputFormat == "name"; useShortOutput || len(options.OutputFormat) == 0 {