Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dba8d60

Browse files
authored
Merge pull request kubernetes#87077 from soltysh/remove_run_generators
Remove kubectl run generators
2 parents cad4460 + 82f9777 commit dba8d60

File tree

17 files changed

+113
-2175
lines changed

17 files changed

+113
-2175
lines changed

staging/src/k8s.io/kubectl/pkg/cmd/run/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ go_test(
5959
"//staging/src/k8s.io/kubectl/pkg/cmd/delete:go_default_library",
6060
"//staging/src/k8s.io/kubectl/pkg/cmd/testing:go_default_library",
6161
"//staging/src/k8s.io/kubectl/pkg/cmd/util:go_default_library",
62+
"//staging/src/k8s.io/kubectl/pkg/generate/versioned:go_default_library",
6263
"//staging/src/k8s.io/kubectl/pkg/scheme:go_default_library",
6364
"//staging/src/k8s.io/kubectl/pkg/util/i18n:go_default_library",
6465
"//vendor/github.com/spf13/cobra:go_default_library",

staging/src/k8s.io/kubectl/pkg/cmd/run/run.go

+24-67
Original file line numberDiff line numberDiff line change
@@ -58,47 +58,35 @@ import (
5858
)
5959

6060
var (
61-
runLong = templates.LongDesc(i18n.T(`
62-
Create and run a particular image, possibly replicated.
63-
64-
Creates a deployment or job to manage the created container(s).`))
61+
runLong = templates.LongDesc(i18n.T(`Create and run a particular image in a pod.`))
6562

6663
runExample = templates.Examples(i18n.T(`
67-
# Start a single instance of nginx.
64+
# Start a nginx pod.
6865
kubectl run nginx --image=nginx
6966
70-
# Start a single instance of hazelcast and let the container expose port 5701 .
67+
# Start a hazelcast pod and let the container expose port 5701.
7168
kubectl run hazelcast --image=hazelcast/hazelcast --port=5701
7269
73-
# Start a single instance of hazelcast and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container.
70+
# Start a hazelcast pod and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container.
7471
kubectl run hazelcast --image=hazelcast/hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"
7572
76-
# Start a single instance of hazelcast and set labels "app=hazelcast" and "env=prod" in the container.
73+
# Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container.
7774
kubectl run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod"
7875
79-
# Start a replicated instance of nginx.
80-
kubectl run nginx --image=nginx --replicas=5
81-
8276
# Dry run. Print the corresponding API objects without creating them.
8377
kubectl run nginx --image=nginx --dry-run
8478
85-
# Start a single instance of nginx, but overload the spec of the deployment with a partial set of values parsed from JSON.
79+
# Start a nginx pod, but overload the spec with a partial set of values parsed from JSON.
8680
kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
8781
88-
# Start a pod of busybox and keep it in the foreground, don't restart it if it exits.
82+
# Start a busybox pod and keep it in the foreground, don't restart it if it exits.
8983
kubectl run -i -t busybox --image=busybox --restart=Never
9084
91-
# Start the nginx container using the default command, but use custom arguments (arg1 .. argN) for that command.
85+
# Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that command.
9286
kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN>
9387
94-
# Start the nginx container using a different command and custom arguments.
95-
kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>
96-
97-
# Start the perl container to compute π to 2000 places and print it out.
98-
kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
99-
100-
# Start the cron job to compute π to 2000 places and print it out every 5 minutes.
101-
kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'`))
88+
# Start the nginx pod using a different command and custom arguments.
89+
kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>`))
10290
)
10391

10492
const (
@@ -147,6 +135,8 @@ func NewRunOptions(streams genericclioptions.IOStreams) *RunOptions {
147135
DeleteFlags: delete.NewDeleteFlags("to use to replace the resource."),
148136
RecordFlags: genericclioptions.NewRecordFlags(),
149137

138+
Generator: generateversioned.RunPodV1GeneratorName,
139+
150140
Recorder: genericclioptions.NoopRecorder{},
151141

152142
IOStreams: streams,
@@ -157,7 +147,7 @@ func NewCmdRun(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Co
157147
o := NewRunOptions(streams)
158148

159149
cmd := &cobra.Command{
160-
Use: "run NAME --image=image [--env=\"key=value\"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]",
150+
Use: "run NAME --image=image [--env=\"key=value\"] [--port=port] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]",
161151
DisableFlagsInUseLine: true,
162152
Short: i18n.T("Run a particular image on the cluster"),
163153
Long: runLong,
@@ -181,15 +171,17 @@ func NewCmdRun(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Co
181171
func addRunFlags(cmd *cobra.Command, opt *RunOptions) {
182172
cmdutil.AddDryRunFlag(cmd)
183173
cmd.Flags().StringVar(&opt.Generator, "generator", opt.Generator, i18n.T("The name of the API generator to use, see http://kubernetes.io/docs/user-guide/kubectl-conventions/#generators for a list."))
174+
cmd.Flags().MarkDeprecated("generator", "has no effect and will be removed in the future.")
184175
cmd.Flags().StringVar(&opt.Image, "image", opt.Image, i18n.T("The image for the container to run."))
185176
cmd.MarkFlagRequired("image")
186177
cmd.Flags().String("image-pull-policy", "", i18n.T("The image pull policy for the container. If left empty, this value will not be specified by the client and defaulted by the server"))
187178
cmd.Flags().IntP("replicas", "r", 1, "Number of replicas to create for this container. Default is 1.")
179+
cmd.Flags().MarkDeprecated("replicas", "has no effect and will be removed in the future.")
188180
cmd.Flags().Bool("rm", false, "If true, delete resources created in this command for attached containers.")
189181
cmd.Flags().String("overrides", "", i18n.T("An inline JSON override for the generated object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field."))
190-
cmd.Flags().StringArray("env", []string{}, "Environment variables to set in the container")
191-
cmd.Flags().String("serviceaccount", "", "Service account to set in the pod spec")
192-
cmd.Flags().StringVar(&opt.Port, "port", opt.Port, i18n.T("The port that this container exposes. If --expose is true, this is also the port used by the service that is created."))
182+
cmd.Flags().StringArray("env", []string{}, "Environment variables to set in the container.")
183+
cmd.Flags().String("serviceaccount", "", "Service account to set in the pod spec.")
184+
cmd.Flags().StringVar(&opt.Port, "port", opt.Port, i18n.T("The port that this container exposes."))
193185
cmd.Flags().Int("hostport", -1, "The host port mapping for the container port. To demonstrate a single-machine container.")
194186
cmd.Flags().StringP("labels", "l", "", "Comma separated labels to apply to the pod(s). Will override previous values.")
195187
cmd.Flags().BoolVarP(&opt.Interactive, "stdin", "i", opt.Interactive, "Keep stdin open on the container(s) in the pod, even if nothing is attached.")
@@ -200,11 +192,14 @@ func addRunFlags(cmd *cobra.Command, opt *RunOptions) {
200192
cmd.Flags().Bool("command", false, "If true and extra arguments are present, use them as the 'command' field in the container, rather than the 'args' field which is the default.")
201193
cmd.Flags().String("requests", "", i18n.T("The resource requirement requests for this container. For example, 'cpu=100m,memory=256Mi'. Note that server side components may assign requests depending on the server configuration, such as limit ranges."))
202194
cmd.Flags().String("limits", "", i18n.T("The resource requirement limits for this container. For example, 'cpu=200m,memory=512Mi'. Note that server side components may assign limits depending on the server configuration, such as limit ranges."))
203-
cmd.Flags().BoolVar(&opt.Expose, "expose", opt.Expose, "If true, a public, external service is created for the container(s) which are run")
195+
cmd.Flags().BoolVar(&opt.Expose, "expose", opt.Expose, "If true, service is created for the container(s) which are run")
204196
cmd.Flags().String("service-generator", "service/v2", i18n.T("The name of the generator to use for creating a service. Only used if --expose is true"))
197+
cmd.Flags().MarkDeprecated("service-generator", "and will be removed in the future.")
205198
cmd.Flags().String("service-overrides", "", i18n.T("An inline JSON override for the generated service object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field. Only used if --expose is true."))
199+
cmd.Flags().MarkDeprecated("service-overrides", "and will be removed in the future.")
206200
cmd.Flags().BoolVar(&opt.Quiet, "quiet", opt.Quiet, "If true, suppress prompt messages.")
207201
cmd.Flags().StringVar(&opt.Schedule, "schedule", opt.Schedule, i18n.T("A schedule in the Cron format the job should be run with."))
202+
cmd.Flags().MarkDeprecated("schedule", "has no effect and will be removed in the future.")
208203
}
209204

210205
func (o *RunOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) error {
@@ -308,48 +303,10 @@ func (o *RunOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e
308303
return err
309304
}
310305

311-
clientset, err := f.KubernetesClientSet()
312-
if err != nil {
313-
return err
314-
}
315-
316-
generatorName := o.Generator
317-
if len(o.Schedule) != 0 && len(generatorName) == 0 {
318-
generatorName = generateversioned.CronJobV1Beta1GeneratorName
319-
}
320-
if len(generatorName) == 0 {
321-
switch restartPolicy {
322-
case corev1.RestartPolicyAlways:
323-
generatorName = generateversioned.DeploymentAppsV1GeneratorName
324-
case corev1.RestartPolicyOnFailure:
325-
generatorName = generateversioned.JobV1GeneratorName
326-
case corev1.RestartPolicyNever:
327-
generatorName = generateversioned.RunPodV1GeneratorName
328-
}
329-
330-
// Falling back because the generator was not provided and the default one could be unavailable.
331-
generatorNameTemp, err := generateversioned.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.ErrOut)
332-
if err != nil {
333-
return err
334-
}
335-
if generatorNameTemp != generatorName {
336-
cmdutil.Warning(o.ErrOut, generatorName, generatorNameTemp)
337-
} else {
338-
generatorName = generatorNameTemp
339-
}
340-
}
341-
342306
generators := generateversioned.GeneratorFn("run")
343-
generator, found := generators[generatorName]
307+
generator, found := generators[generateversioned.RunPodV1GeneratorName]
344308
if !found {
345-
return cmdutil.UsageErrorf(cmd, "generator %q not found", generatorName)
346-
}
347-
348-
// start deprecating all generators except for 'run-pod/v1' which will be
349-
// the only supported on a route to simple kubectl run which should mimic
350-
// docker run
351-
if generatorName != generateversioned.RunPodV1GeneratorName {
352-
fmt.Fprintf(o.ErrOut, "kubectl run --generator=%s is DEPRECATED and will be removed in a future version. Use kubectl run --generator=%s or kubectl create instead.\n", generatorName, generateversioned.RunPodV1GeneratorName)
309+
return cmdutil.UsageErrorf(cmd, "generator %q not found", o.Generator)
353310
}
354311

355312
names := generator.ParamNames()

staging/src/k8s.io/kubectl/pkg/cmd/run/run_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"k8s.io/kubectl/pkg/cmd/delete"
4040
cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
4141
cmdutil "k8s.io/kubectl/pkg/cmd/util"
42+
generateversioned "k8s.io/kubectl/pkg/generate/versioned"
4243
"k8s.io/kubectl/pkg/scheme"
4344
"k8s.io/kubectl/pkg/util/i18n"
4445
)
@@ -174,7 +175,7 @@ func TestRunArgsFollowDashRules(t *testing.T) {
174175
GroupVersion: corev1.SchemeGroupVersion,
175176
NegotiatedSerializer: ns,
176177
Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
177-
if req.URL.Path == "/namespaces/test/replicationcontrollers" {
178+
if req.URL.Path == "/namespaces/test/pods" {
178179
return &http.Response{StatusCode: http.StatusCreated, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, rc)}, nil
179180
}
180181
return &http.Response{
@@ -188,7 +189,6 @@ func TestRunArgsFollowDashRules(t *testing.T) {
188189

189190
cmd := NewCmdRun(tf, genericclioptions.NewTestIOStreamsDiscard())
190191
cmd.Flags().Set("image", "nginx")
191-
cmd.Flags().Set("generator", "run/v1")
192192

193193
printFlags := genericclioptions.NewPrintFlags("created").WithTypeSetter(scheme.Scheme)
194194
printer, err := printFlags.ToPrinter()
@@ -205,7 +205,7 @@ func TestRunArgsFollowDashRules(t *testing.T) {
205205
IOStreams: genericclioptions.NewTestIOStreamsDiscard(),
206206

207207
Image: "nginx",
208-
Generator: "run/v1",
208+
Generator: generateversioned.RunPodV1GeneratorName,
209209

210210
PrintObj: func(obj runtime.Object) error {
211211
return printer.PrintObj(obj, os.Stdout)

staging/src/k8s.io/kubectl/pkg/generate/versioned/BUILD

-9
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ go_library(
2929
"//staging/src/k8s.io/api/apps/v1:go_default_library",
3030
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library",
3131
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
32-
"//staging/src/k8s.io/api/batch/v1:go_default_library",
33-
"//staging/src/k8s.io/api/batch/v1beta1:go_default_library",
34-
"//staging/src/k8s.io/api/batch/v2alpha1:go_default_library",
3532
"//staging/src/k8s.io/api/core/v1:go_default_library",
3633
"//staging/src/k8s.io/api/extensions/v1beta1:go_default_library",
3734
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
@@ -77,18 +74,12 @@ go_test(
7774
embed = [":go_default_library"],
7875
deps = [
7976
"//staging/src/k8s.io/api/apps/v1:go_default_library",
80-
"//staging/src/k8s.io/api/apps/v1beta1:go_default_library",
8177
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
82-
"//staging/src/k8s.io/api/batch/v1:go_default_library",
83-
"//staging/src/k8s.io/api/batch/v1beta1:go_default_library",
84-
"//staging/src/k8s.io/api/batch/v2alpha1:go_default_library",
8578
"//staging/src/k8s.io/api/core/v1:go_default_library",
86-
"//staging/src/k8s.io/api/extensions/v1beta1:go_default_library",
8779
"//staging/src/k8s.io/api/policy/v1beta1:go_default_library",
8880
"//staging/src/k8s.io/api/rbac/v1:go_default_library",
8981
"//staging/src/k8s.io/api/rbac/v1beta1:go_default_library",
9082
"//staging/src/k8s.io/api/scheduling/v1:go_default_library",
91-
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
9283
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
9384
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
9485
"//staging/src/k8s.io/client-go/util/testing:go_default_library",

staging/src/k8s.io/kubectl/pkg/generate/versioned/generator.go

+1-67
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ import (
2222

2323
appsv1 "k8s.io/api/apps/v1"
2424
appsv1beta1 "k8s.io/api/apps/v1beta1"
25-
batchv1 "k8s.io/api/batch/v1"
26-
batchv1beta1 "k8s.io/api/batch/v1beta1"
27-
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
28-
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
2925
apierrors "k8s.io/apimachinery/pkg/api/errors"
3026
"k8s.io/apimachinery/pkg/runtime/schema"
3127
"k8s.io/client-go/discovery"
@@ -39,7 +35,6 @@ const (
3935
// TODO(sig-cli): Enforce consistent naming for generators here.
4036
// See discussion in https://github.com/kubernetes/kubernetes/issues/46237
4137
// before you add any more.
42-
RunV1GeneratorName = "run/v1"
4338
RunPodV1GeneratorName = "run-pod/v1"
4439
ServiceV1GeneratorName = "service/v1"
4540
ServiceV2GeneratorName = "service/v2"
@@ -49,15 +44,9 @@ const (
4944
ServiceExternalNameGeneratorV1Name = "service-externalname/v1"
5045
ServiceAccountV1GeneratorName = "serviceaccount/v1"
5146
HorizontalPodAutoscalerV1GeneratorName = "horizontalpodautoscaler/v1"
52-
DeploymentV1Beta1GeneratorName = "deployment/v1beta1"
53-
DeploymentAppsV1Beta1GeneratorName = "deployment/apps.v1beta1"
54-
DeploymentAppsV1GeneratorName = "deployment/apps.v1"
5547
DeploymentBasicV1Beta1GeneratorName = "deployment-basic/v1beta1"
5648
DeploymentBasicAppsV1Beta1GeneratorName = "deployment-basic/apps.v1beta1"
5749
DeploymentBasicAppsV1GeneratorName = "deployment-basic/apps.v1"
58-
JobV1GeneratorName = "job/v1"
59-
CronJobV2Alpha1GeneratorName = "cronjob/v2alpha1"
60-
CronJobV1Beta1GeneratorName = "cronjob/v1beta1"
6150
NamespaceV1GeneratorName = "namespace/v1"
6251
ResourceQuotaV1GeneratorName = "resourcequotas/v1"
6352
SecretV1GeneratorName = "secret/v1"
@@ -104,14 +93,7 @@ func DefaultGenerators(cmdName string) map[string]generate.Generator {
10493
generator = map[string]generate.Generator{}
10594
case "run":
10695
generator = map[string]generate.Generator{
107-
RunV1GeneratorName: BasicReplicationController{},
108-
RunPodV1GeneratorName: BasicPod{},
109-
DeploymentV1Beta1GeneratorName: DeploymentV1Beta1{},
110-
DeploymentAppsV1Beta1GeneratorName: DeploymentAppsV1Beta1{},
111-
DeploymentAppsV1GeneratorName: DeploymentAppsV1{},
112-
JobV1GeneratorName: JobV1{},
113-
CronJobV2Alpha1GeneratorName: CronJobV2Alpha1{},
114-
CronJobV1Beta1GeneratorName: CronJobV1Beta1{},
96+
RunPodV1GeneratorName: BasicPod{},
11597
}
11698
case "namespace":
11799
generator = map[string]generate.Generator{
@@ -150,30 +132,6 @@ func FallbackGeneratorNameIfNecessary(
150132
cmdErr io.Writer,
151133
) (string, error) {
152134
switch generatorName {
153-
case DeploymentAppsV1GeneratorName:
154-
hasResource, err := HasResource(discoveryClient, appsv1.SchemeGroupVersion.WithResource("deployments"))
155-
if err != nil {
156-
return "", err
157-
}
158-
if !hasResource {
159-
return FallbackGeneratorNameIfNecessary(DeploymentAppsV1Beta1GeneratorName, discoveryClient, cmdErr)
160-
}
161-
case DeploymentAppsV1Beta1GeneratorName:
162-
hasResource, err := HasResource(discoveryClient, appsv1beta1.SchemeGroupVersion.WithResource("deployments"))
163-
if err != nil {
164-
return "", err
165-
}
166-
if !hasResource {
167-
return FallbackGeneratorNameIfNecessary(DeploymentV1Beta1GeneratorName, discoveryClient, cmdErr)
168-
}
169-
case DeploymentV1Beta1GeneratorName:
170-
hasResource, err := HasResource(discoveryClient, extensionsv1beta1.SchemeGroupVersion.WithResource("deployments"))
171-
if err != nil {
172-
return "", err
173-
}
174-
if !hasResource {
175-
return RunV1GeneratorName, nil
176-
}
177135
case DeploymentBasicAppsV1GeneratorName:
178136
hasResource, err := HasResource(discoveryClient, appsv1.SchemeGroupVersion.WithResource("deployments"))
179137
if err != nil {
@@ -190,30 +148,6 @@ func FallbackGeneratorNameIfNecessary(
190148
if !hasResource {
191149
return DeploymentBasicV1Beta1GeneratorName, nil
192150
}
193-
case JobV1GeneratorName:
194-
hasResource, err := HasResource(discoveryClient, batchv1.SchemeGroupVersion.WithResource("jobs"))
195-
if err != nil {
196-
return "", err
197-
}
198-
if !hasResource {
199-
return RunPodV1GeneratorName, nil
200-
}
201-
case CronJobV1Beta1GeneratorName:
202-
hasResource, err := HasResource(discoveryClient, batchv1beta1.SchemeGroupVersion.WithResource("cronjobs"))
203-
if err != nil {
204-
return "", err
205-
}
206-
if !hasResource {
207-
return FallbackGeneratorNameIfNecessary(CronJobV2Alpha1GeneratorName, discoveryClient, cmdErr)
208-
}
209-
case CronJobV2Alpha1GeneratorName:
210-
hasResource, err := HasResource(discoveryClient, batchv2alpha1.SchemeGroupVersion.WithResource("cronjobs"))
211-
if err != nil {
212-
return "", err
213-
}
214-
if !hasResource {
215-
return JobV1GeneratorName, nil
216-
}
217151
}
218152
return generatorName, nil
219153
}

0 commit comments

Comments
 (0)