mirror of https://github.com/k3s-io/k3s
Merge pull request #50890 from zjj2wry/fix-todo-fallback
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.. remove todo(#42787)Add fallback for cronjobs, and move some useful funct… …ion to cmdutil **What this PR does / why we need it**: remove todo relation with #42787 **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```pull/6/head
commit
f0b0659c11
|
@ -106,10 +106,8 @@ go_library(
|
||||||
"//vendor/github.com/renstrom/dedent:go_default_library",
|
"//vendor/github.com/renstrom/dedent:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
"//vendor/k8s.io/api/apps/v1beta1:go_default_library",
|
|
||||||
"//vendor/k8s.io/api/batch/v1:go_default_library",
|
"//vendor/k8s.io/api/batch/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
|
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
@ -134,7 +132,6 @@ go_library(
|
||||||
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/discovery:go_default_library",
|
|
||||||
"//vendor/k8s.io/client-go/rest:go_default_library",
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
|
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/portforward:go_default_library",
|
"//vendor/k8s.io/client-go/tools/portforward:go_default_library",
|
||||||
|
|
|
@ -22,8 +22,6 @@ import (
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
|
@ -63,35 +61,6 @@ func NewCmdCreateDeployment(f cmdutil.Factory, cmdOut, cmdErr io.Writer) *cobra.
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallbackGeneratorNameIfNecessary returns the name of the old generator
|
|
||||||
// (v1beta1) if server does not support apps/v1beta1 deployments. Otherwise, the
|
|
||||||
// generator string is returned unchanged.
|
|
||||||
//
|
|
||||||
// If the generator name is changed, print a warning message to let the user
|
|
||||||
// know.
|
|
||||||
func fallbackGeneratorNameIfNecessary(
|
|
||||||
generatorName string,
|
|
||||||
resourcesList []*metav1.APIResourceList,
|
|
||||||
cmdErr io.Writer,
|
|
||||||
) string {
|
|
||||||
|
|
||||||
if generatorName == cmdutil.DeploymentBasicAppsV1Beta1GeneratorName &&
|
|
||||||
!contains(resourcesList, appsv1beta1.SchemeGroupVersion.WithResource("deployments")) {
|
|
||||||
|
|
||||||
fmt.Fprintf(cmdErr,
|
|
||||||
"WARNING: New deployments generator %q specified, "+
|
|
||||||
"but apps/v1beta1.Deployments are not available. "+
|
|
||||||
"Falling back to %q.\n",
|
|
||||||
cmdutil.DeploymentBasicAppsV1Beta1GeneratorName,
|
|
||||||
cmdutil.DeploymentBasicV1Beta1GeneratorName,
|
|
||||||
)
|
|
||||||
|
|
||||||
return cmdutil.DeploymentBasicV1Beta1GeneratorName
|
|
||||||
}
|
|
||||||
|
|
||||||
return generatorName
|
|
||||||
}
|
|
||||||
|
|
||||||
// generatorFromName returns the appropriate StructuredGenerator based on the
|
// generatorFromName returns the appropriate StructuredGenerator based on the
|
||||||
// generatorName. If the generatorName is unrecognized, then return (nil,
|
// generatorName. If the generatorName is unrecognized, then return (nil,
|
||||||
// false).
|
// false).
|
||||||
|
@ -150,7 +119,7 @@ func createDeployment(f cmdutil.Factory, cmdOut, cmdErr io.Writer,
|
||||||
|
|
||||||
// It is possible we have to modify the user-provided generator name if
|
// It is possible we have to modify the user-provided generator name if
|
||||||
// the server does not have support for the requested generator.
|
// the server does not have support for the requested generator.
|
||||||
generatorName = fallbackGeneratorNameIfNecessary(generatorName, resourcesList, cmdErr)
|
generatorName = cmdutil.FallbackGeneratorNameIfNecessary(generatorName, resourcesList, cmdErr)
|
||||||
|
|
||||||
imageNames := cmdutil.GetFlagStringSlice(cmd, "image")
|
imageNames := cmdutil.GetFlagStringSlice(cmd, "image")
|
||||||
generator, ok := generatorFromName(generatorName, imageNames, deploymentName)
|
generator, ok := generatorFromName(generatorName, imageNames, deploymentName)
|
||||||
|
|
|
@ -25,15 +25,12 @@ import (
|
||||||
|
|
||||||
batchv1 "k8s.io/api/batch/v1"
|
batchv1 "k8s.io/api/batch/v1"
|
||||||
batchv1beta1 "k8s.io/api/batch/v1beta1"
|
batchv1beta1 "k8s.io/api/batch/v1beta1"
|
||||||
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
|
|
||||||
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
"k8s.io/client-go/discovery"
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
|
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
|
||||||
conditions "k8s.io/kubernetes/pkg/client/unversioned"
|
conditions "k8s.io/kubernetes/pkg/client/unversioned"
|
||||||
|
@ -226,7 +223,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
|
||||||
generatorName := cmdutil.GetFlagString(cmd, "generator")
|
generatorName := cmdutil.GetFlagString(cmd, "generator")
|
||||||
schedule := cmdutil.GetFlagString(cmd, "schedule")
|
schedule := cmdutil.GetFlagString(cmd, "schedule")
|
||||||
if len(schedule) != 0 && len(generatorName) == 0 {
|
if len(schedule) != 0 && len(generatorName) == 0 {
|
||||||
if contains(resourcesList, batchv1beta1.SchemeGroupVersion.WithResource("cronjobs")) {
|
if cmdutil.Contains(resourcesList, batchv1beta1.SchemeGroupVersion.WithResource("cronjobs")) {
|
||||||
generatorName = cmdutil.CronJobV1Beta1GeneratorName
|
generatorName = cmdutil.CronJobV1Beta1GeneratorName
|
||||||
} else {
|
} else {
|
||||||
generatorName = cmdutil.CronJobV2Alpha1GeneratorName
|
generatorName = cmdutil.CronJobV2Alpha1GeneratorName
|
||||||
|
@ -237,13 +234,13 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
|
||||||
case api.RestartPolicyAlways:
|
case api.RestartPolicyAlways:
|
||||||
// TODO: we need to deprecate this along with extensions/v1beta1.Deployments
|
// TODO: we need to deprecate this along with extensions/v1beta1.Deployments
|
||||||
// in favor of the new generator for apps/v1beta1.Deployments
|
// in favor of the new generator for apps/v1beta1.Deployments
|
||||||
if contains(resourcesList, extensionsv1beta1.SchemeGroupVersion.WithResource("deployments")) {
|
if cmdutil.Contains(resourcesList, extensionsv1beta1.SchemeGroupVersion.WithResource("deployments")) {
|
||||||
generatorName = cmdutil.DeploymentV1Beta1GeneratorName
|
generatorName = cmdutil.DeploymentV1Beta1GeneratorName
|
||||||
} else {
|
} else {
|
||||||
generatorName = cmdutil.RunV1GeneratorName
|
generatorName = cmdutil.RunV1GeneratorName
|
||||||
}
|
}
|
||||||
case api.RestartPolicyOnFailure:
|
case api.RestartPolicyOnFailure:
|
||||||
if contains(resourcesList, batchv1.SchemeGroupVersion.WithResource("jobs")) {
|
if cmdutil.Contains(resourcesList, batchv1.SchemeGroupVersion.WithResource("jobs")) {
|
||||||
generatorName = cmdutil.JobV1GeneratorName
|
generatorName = cmdutil.JobV1GeneratorName
|
||||||
} else {
|
} else {
|
||||||
generatorName = cmdutil.RunPodV1GeneratorName
|
generatorName = cmdutil.RunPodV1GeneratorName
|
||||||
|
@ -253,13 +250,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this should be removed alongside with extensions/v1beta1 depployments generator
|
generatorName = cmdutil.FallbackGeneratorNameIfNecessary(generatorName, resourcesList, cmdErr)
|
||||||
generatorName = fallbackGeneratorNameIfNecessary(generatorName, resourcesList, cmdErr)
|
|
||||||
|
|
||||||
if generatorName == cmdutil.CronJobV2Alpha1GeneratorName &&
|
|
||||||
!contains(resourcesList, batchv2alpha1.SchemeGroupVersion.WithResource("cronjobs")) {
|
|
||||||
return fmt.Errorf("CronJob generator specified, but batch/v2alpha1.CronJobs are not available")
|
|
||||||
}
|
|
||||||
|
|
||||||
generators := f.Generators("run")
|
generators := f.Generators("run")
|
||||||
generator, found := generators[generatorName]
|
generator, found := generators[generatorName]
|
||||||
|
@ -407,14 +398,6 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO turn this into reusable method checking available resources
|
|
||||||
func contains(resourcesList []*metav1.APIResourceList, resource schema.GroupVersionResource) bool {
|
|
||||||
resources := discovery.FilteredBy(discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool {
|
|
||||||
return resource.GroupVersion().String() == gv && resource.Resource == r.Name
|
|
||||||
}), resourcesList)
|
|
||||||
return len(resources) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// waitForPod watches the given pod until the exitCondition is true
|
// waitForPod watches the given pod until the exitCondition is true
|
||||||
func waitForPod(podClient coreclient.PodsGetter, ns, name string, exitCondition watch.ConditionFunc) (*api.Pod, error) {
|
func waitForPod(podClient coreclient.PodsGetter, ns, name string, exitCondition watch.ConditionFunc) (*api.Pod, error) {
|
||||||
w, err := podClient.Pods(ns).Watch(metav1.SingleObject(metav1.ObjectMeta{Name: name}))
|
w, err := podClient.Pods(ns).Watch(metav1.SingleObject(metav1.ObjectMeta{Name: name}))
|
||||||
|
|
|
@ -47,6 +47,8 @@ go_library(
|
||||||
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
|
"//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
|
"//vendor/k8s.io/api/apps/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
|
|
|
@ -32,7 +32,10 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
|
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
||||||
|
batchv2alpha1 "k8s.io/api/batch/v2alpha1"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||||
|
@ -571,6 +574,50 @@ func DefaultGenerators(cmdName string) map[string]kubectl.Generator {
|
||||||
return generator
|
return generator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fallbackGeneratorNameIfNecessary returns the name of the old generator
|
||||||
|
// if server does not support new generator. Otherwise, the
|
||||||
|
// generator string is returned unchanged.
|
||||||
|
//
|
||||||
|
// If the generator name is changed, print a warning message to let the user
|
||||||
|
// know.
|
||||||
|
func FallbackGeneratorNameIfNecessary(
|
||||||
|
generatorName string,
|
||||||
|
resourcesList []*metav1.APIResourceList,
|
||||||
|
cmdErr io.Writer,
|
||||||
|
) string {
|
||||||
|
switch generatorName {
|
||||||
|
case DeploymentBasicAppsV1Beta1GeneratorName:
|
||||||
|
if !Contains(resourcesList, appsv1beta1.SchemeGroupVersion.WithResource("deployments")) {
|
||||||
|
warning(cmdErr, DeploymentBasicAppsV1Beta1GeneratorName, DeploymentBasicV1Beta1GeneratorName)
|
||||||
|
|
||||||
|
return DeploymentBasicV1Beta1GeneratorName
|
||||||
|
}
|
||||||
|
case CronJobV2Alpha1GeneratorName:
|
||||||
|
if !Contains(resourcesList, batchv2alpha1.SchemeGroupVersion.WithResource("cronjobs")) {
|
||||||
|
warning(cmdErr, CronJobV2Alpha1GeneratorName, JobV1GeneratorName)
|
||||||
|
|
||||||
|
return JobV1GeneratorName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return generatorName
|
||||||
|
}
|
||||||
|
|
||||||
|
func warning(cmdErr io.Writer, newGeneratorName, oldGeneratorName string) {
|
||||||
|
fmt.Fprintf(cmdErr, "WARNING: New deployments generator %q specified, "+
|
||||||
|
"but it isn't available. "+
|
||||||
|
"Falling back to %q.\n",
|
||||||
|
newGeneratorName,
|
||||||
|
oldGeneratorName,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Contains(resourcesList []*metav1.APIResourceList, resource schema.GroupVersionResource) bool {
|
||||||
|
resources := discovery.FilteredBy(discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool {
|
||||||
|
return resource.GroupVersion().String() == gv && resource.Resource == r.Name
|
||||||
|
}), resourcesList)
|
||||||
|
return len(resources) != 0
|
||||||
|
}
|
||||||
|
|
||||||
func (f *ring0Factory) Generators(cmdName string) map[string]kubectl.Generator {
|
func (f *ring0Factory) Generators(cmdName string) map[string]kubectl.Generator {
|
||||||
return DefaultGenerators(cmdName)
|
return DefaultGenerators(cmdName)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue