diff --git a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go index 64e9a688330..ff986b027f4 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go +++ b/staging/src/k8s.io/cli-runtime/pkg/genericclioptions/config_flags_fake.go @@ -96,7 +96,7 @@ type namespacedClientConfig struct { } func (c *namespacedClientConfig) Namespace() (string, bool, error) { - return c.namespace, false, nil + return c.namespace, len(c.namespace) > 0, nil } func (c *namespacedClientConfig) RawConfig() (clientcmdapi.Config, error) { diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_cronjob.go b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_cronjob.go index 9447813c7a8..77fc62a5265 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_cronjob.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_cronjob.go @@ -58,12 +58,13 @@ type CreateCronJobOptions struct { Command []string Restart string - Namespace string - Client batchv1beta1client.BatchV1beta1Interface - DryRunStrategy cmdutil.DryRunStrategy - DryRunVerifier *resource.DryRunVerifier - Builder *resource.Builder - FieldManager string + Namespace string + EnforceNamespace bool + Client batchv1beta1client.BatchV1beta1Interface + DryRunStrategy cmdutil.DryRunStrategy + DryRunVerifier *resource.DryRunVerifier + Builder *resource.Builder + FieldManager string genericclioptions.IOStreams } @@ -126,7 +127,7 @@ func (o *CreateCronJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, a return err } - o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() + o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace() if err != nil { return err } @@ -193,7 +194,7 @@ func (o *CreateCronJobOptions) Run() error { } func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob { - return &batchv1beta1.CronJob{ + cronjob := &batchv1beta1.CronJob{ TypeMeta: metav1.TypeMeta{APIVersion: batchv1beta1.SchemeGroupVersion.String(), Kind: "CronJob"}, ObjectMeta: metav1.ObjectMeta{ Name: o.Name, @@ -221,4 +222,8 @@ func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob { }, }, } + if o.EnforceNamespace { + cronjob.Namespace = o.Namespace + } + return cronjob } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_job.go b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_job.go index c58bb2e3b4b..a1604c9435c 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_job.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_job.go @@ -62,12 +62,13 @@ type CreateJobOptions struct { From string Command []string - Namespace string - Client batchv1client.BatchV1Interface - DryRunStrategy cmdutil.DryRunStrategy - DryRunVerifier *resource.DryRunVerifier - Builder *resource.Builder - FieldManager string + Namespace string + EnforceNamespace bool + Client batchv1client.BatchV1Interface + DryRunStrategy cmdutil.DryRunStrategy + DryRunVerifier *resource.DryRunVerifier + Builder *resource.Builder + FieldManager string genericclioptions.IOStreams } @@ -126,7 +127,7 @@ func (o *CreateJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args return err } - o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() + o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace() if err != nil { return err } @@ -222,7 +223,7 @@ func (o *CreateJobOptions) Run() error { } func (o *CreateJobOptions) createJob() *batchv1.Job { - return &batchv1.Job{ + job := &batchv1.Job{ // this is ok because we know exactly how we want to be serialized TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, ObjectMeta: metav1.ObjectMeta{ @@ -243,6 +244,10 @@ func (o *CreateJobOptions) createJob() *batchv1.Job { }, }, } + if o.EnforceNamespace { + job.Namespace = o.Namespace + } + return job } func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *batchv1.Job { @@ -252,7 +257,7 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) * annotations[k] = v } - return &batchv1.Job{ + job := &batchv1.Job{ // this is ok because we know exactly how we want to be serialized TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, ObjectMeta: metav1.ObjectMeta{ @@ -270,4 +275,8 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) * }, Spec: cronJob.Spec.JobTemplate.Spec, } + if o.EnforceNamespace { + job.Namespace = o.Namespace + } + return job } diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role.go b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role.go index 12db67d8e6a..7cd6a1978dd 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role.go @@ -127,14 +127,15 @@ type CreateRoleOptions struct { Resources []ResourceOptions ResourceNames []string - DryRunStrategy cmdutil.DryRunStrategy - DryRunVerifier *resource.DryRunVerifier - OutputFormat string - Namespace string - Client clientgorbacv1.RbacV1Interface - Mapper meta.RESTMapper - PrintObj func(obj runtime.Object) error - FieldManager string + DryRunStrategy cmdutil.DryRunStrategy + DryRunVerifier *resource.DryRunVerifier + OutputFormat string + Namespace string + EnforceNamespace bool + Client clientgorbacv1.RbacV1Interface + Mapper meta.RESTMapper + PrintObj func(obj runtime.Object) error + FieldManager string genericclioptions.IOStreams } @@ -263,7 +264,7 @@ func (o *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args return printer.PrintObj(obj, o.Out) } - o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() + o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace() if err != nil { return err } @@ -352,6 +353,9 @@ func (o *CreateRoleOptions) RunCreateRole() error { return err } role.Rules = rules + if o.EnforceNamespace { + role.Namespace = o.Namespace + } // Create role. if o.DryRunStrategy != cmdutil.DryRunClient { diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role_test.go index 5136120f108..330bb170f0f 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/create/create_role_test.go @@ -33,8 +33,8 @@ import ( func TestCreateRole(t *testing.T) { roleName := "my-role" - - tf := cmdtesting.NewTestFactory().WithNamespace("test") + testNameSpace := "test" + tf := cmdtesting.NewTestFactory().WithNamespace(testNameSpace) defer tf.Cleanup() tf.Client = &fake.RESTClient{} @@ -52,7 +52,8 @@ func TestCreateRole(t *testing.T) { expectedRole: &rbac.Role{ TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, ObjectMeta: v1.ObjectMeta{ - Name: roleName, + Name: roleName, + Namespace: testNameSpace, }, Rules: []rbac.PolicyRule{ { @@ -70,7 +71,8 @@ func TestCreateRole(t *testing.T) { expectedRole: &rbac.Role{ TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, ObjectMeta: v1.ObjectMeta{ - Name: roleName, + Name: roleName, + Namespace: testNameSpace, }, Rules: []rbac.PolicyRule{ { @@ -88,7 +90,8 @@ func TestCreateRole(t *testing.T) { expectedRole: &rbac.Role{ TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, ObjectMeta: v1.ObjectMeta{ - Name: roleName, + Name: roleName, + Namespace: testNameSpace, }, Rules: []rbac.PolicyRule{ { @@ -106,7 +109,8 @@ func TestCreateRole(t *testing.T) { expectedRole: &rbac.Role{ TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, ObjectMeta: v1.ObjectMeta{ - Name: roleName, + Name: roleName, + Namespace: testNameSpace, }, Rules: []rbac.PolicyRule{ { diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/set/set_env_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/set/set_env_test.go index a9d1d9e69ae..ba610207b52 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/set/set_env_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/set/set_env_test.go @@ -79,7 +79,7 @@ func TestSetEnvLocal(t *testing.T) { } func TestSetEnvLocalNamespace(t *testing.T) { - tf := cmdtesting.NewTestFactory().WithNamespace("test") + tf := cmdtesting.NewTestFactory() defer tf.Cleanup() tf.Client = &fake.RESTClient{