Merge pull request #90502 from zhouya0/fix_dry_run_client_ignore_namespace

Fix kubectl create --dryrun client ignore namespace
This commit is contained in:
Kubernetes Prow Robot 2020-05-19 20:34:59 -07:00 committed by GitHub
commit 850fddb492
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 56 additions and 34 deletions

View File

@ -96,7 +96,7 @@ type namespacedClientConfig struct {
} }
func (c *namespacedClientConfig) Namespace() (string, bool, error) { 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) { func (c *namespacedClientConfig) RawConfig() (clientcmdapi.Config, error) {

View File

@ -58,12 +58,13 @@ type CreateCronJobOptions struct {
Command []string Command []string
Restart string Restart string
Namespace string Namespace string
Client batchv1beta1client.BatchV1beta1Interface EnforceNamespace bool
DryRunStrategy cmdutil.DryRunStrategy Client batchv1beta1client.BatchV1beta1Interface
DryRunVerifier *resource.DryRunVerifier DryRunStrategy cmdutil.DryRunStrategy
Builder *resource.Builder DryRunVerifier *resource.DryRunVerifier
FieldManager string Builder *resource.Builder
FieldManager string
genericclioptions.IOStreams genericclioptions.IOStreams
} }
@ -126,7 +127,7 @@ func (o *CreateCronJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, a
return err return err
} }
o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace()
if err != nil { if err != nil {
return err return err
} }
@ -193,7 +194,7 @@ func (o *CreateCronJobOptions) Run() error {
} }
func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob { func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob {
return &batchv1beta1.CronJob{ cronjob := &batchv1beta1.CronJob{
TypeMeta: metav1.TypeMeta{APIVersion: batchv1beta1.SchemeGroupVersion.String(), Kind: "CronJob"}, TypeMeta: metav1.TypeMeta{APIVersion: batchv1beta1.SchemeGroupVersion.String(), Kind: "CronJob"},
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: o.Name, Name: o.Name,
@ -221,4 +222,8 @@ func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob {
}, },
}, },
} }
if o.EnforceNamespace {
cronjob.Namespace = o.Namespace
}
return cronjob
} }

View File

@ -62,12 +62,13 @@ type CreateJobOptions struct {
From string From string
Command []string Command []string
Namespace string Namespace string
Client batchv1client.BatchV1Interface EnforceNamespace bool
DryRunStrategy cmdutil.DryRunStrategy Client batchv1client.BatchV1Interface
DryRunVerifier *resource.DryRunVerifier DryRunStrategy cmdutil.DryRunStrategy
Builder *resource.Builder DryRunVerifier *resource.DryRunVerifier
FieldManager string Builder *resource.Builder
FieldManager string
genericclioptions.IOStreams genericclioptions.IOStreams
} }
@ -126,7 +127,7 @@ func (o *CreateJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
return err return err
} }
o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace()
if err != nil { if err != nil {
return err return err
} }
@ -222,7 +223,7 @@ func (o *CreateJobOptions) Run() error {
} }
func (o *CreateJobOptions) createJob() *batchv1.Job { 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 // this is ok because we know exactly how we want to be serialized
TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"},
ObjectMeta: metav1.ObjectMeta{ 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 { func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *batchv1.Job {
@ -252,7 +257,7 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *
annotations[k] = v annotations[k] = v
} }
return &batchv1.Job{ job := &batchv1.Job{
// this is ok because we know exactly how we want to be serialized // this is ok because we know exactly how we want to be serialized
TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"}, TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"},
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -270,4 +275,8 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1beta1.CronJob) *
}, },
Spec: cronJob.Spec.JobTemplate.Spec, Spec: cronJob.Spec.JobTemplate.Spec,
} }
if o.EnforceNamespace {
job.Namespace = o.Namespace
}
return job
} }

View File

@ -127,14 +127,15 @@ type CreateRoleOptions struct {
Resources []ResourceOptions Resources []ResourceOptions
ResourceNames []string ResourceNames []string
DryRunStrategy cmdutil.DryRunStrategy DryRunStrategy cmdutil.DryRunStrategy
DryRunVerifier *resource.DryRunVerifier DryRunVerifier *resource.DryRunVerifier
OutputFormat string OutputFormat string
Namespace string Namespace string
Client clientgorbacv1.RbacV1Interface EnforceNamespace bool
Mapper meta.RESTMapper Client clientgorbacv1.RbacV1Interface
PrintObj func(obj runtime.Object) error Mapper meta.RESTMapper
FieldManager string PrintObj func(obj runtime.Object) error
FieldManager string
genericclioptions.IOStreams genericclioptions.IOStreams
} }
@ -263,7 +264,7 @@ func (o *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
return printer.PrintObj(obj, o.Out) return printer.PrintObj(obj, o.Out)
} }
o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace() o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace()
if err != nil { if err != nil {
return err return err
} }
@ -352,6 +353,9 @@ func (o *CreateRoleOptions) RunCreateRole() error {
return err return err
} }
role.Rules = rules role.Rules = rules
if o.EnforceNamespace {
role.Namespace = o.Namespace
}
// Create role. // Create role.
if o.DryRunStrategy != cmdutil.DryRunClient { if o.DryRunStrategy != cmdutil.DryRunClient {

View File

@ -33,8 +33,8 @@ import (
func TestCreateRole(t *testing.T) { func TestCreateRole(t *testing.T) {
roleName := "my-role" roleName := "my-role"
testNameSpace := "test"
tf := cmdtesting.NewTestFactory().WithNamespace("test") tf := cmdtesting.NewTestFactory().WithNamespace(testNameSpace)
defer tf.Cleanup() defer tf.Cleanup()
tf.Client = &fake.RESTClient{} tf.Client = &fake.RESTClient{}
@ -52,7 +52,8 @@ func TestCreateRole(t *testing.T) {
expectedRole: &rbac.Role{ expectedRole: &rbac.Role{
TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"},
ObjectMeta: v1.ObjectMeta{ ObjectMeta: v1.ObjectMeta{
Name: roleName, Name: roleName,
Namespace: testNameSpace,
}, },
Rules: []rbac.PolicyRule{ Rules: []rbac.PolicyRule{
{ {
@ -70,7 +71,8 @@ func TestCreateRole(t *testing.T) {
expectedRole: &rbac.Role{ expectedRole: &rbac.Role{
TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"},
ObjectMeta: v1.ObjectMeta{ ObjectMeta: v1.ObjectMeta{
Name: roleName, Name: roleName,
Namespace: testNameSpace,
}, },
Rules: []rbac.PolicyRule{ Rules: []rbac.PolicyRule{
{ {
@ -88,7 +90,8 @@ func TestCreateRole(t *testing.T) {
expectedRole: &rbac.Role{ expectedRole: &rbac.Role{
TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"},
ObjectMeta: v1.ObjectMeta{ ObjectMeta: v1.ObjectMeta{
Name: roleName, Name: roleName,
Namespace: testNameSpace,
}, },
Rules: []rbac.PolicyRule{ Rules: []rbac.PolicyRule{
{ {
@ -106,7 +109,8 @@ func TestCreateRole(t *testing.T) {
expectedRole: &rbac.Role{ expectedRole: &rbac.Role{
TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"}, TypeMeta: v1.TypeMeta{APIVersion: "rbac.authorization.k8s.io/v1", Kind: "Role"},
ObjectMeta: v1.ObjectMeta{ ObjectMeta: v1.ObjectMeta{
Name: roleName, Name: roleName,
Namespace: testNameSpace,
}, },
Rules: []rbac.PolicyRule{ Rules: []rbac.PolicyRule{
{ {

View File

@ -79,7 +79,7 @@ func TestSetEnvLocal(t *testing.T) {
} }
func TestSetEnvLocalNamespace(t *testing.T) { func TestSetEnvLocalNamespace(t *testing.T) {
tf := cmdtesting.NewTestFactory().WithNamespace("test") tf := cmdtesting.NewTestFactory()
defer tf.Cleanup() defer tf.Cleanup()
tf.Client = &fake.RESTClient{ tf.Client = &fake.RESTClient{