Merge pull request #101613 from soltysh/drop_beta

Drop beta APIs from create command for PDBs and CronJobs

Kubernetes-commit: ae2df8aa37bdc50ae12c7e4818e0ddfe99f0f5ea
This commit is contained in:
Kubernetes Publisher 2021-05-25 03:48:22 -07:00
commit 5e58e6bc48
8 changed files with 44 additions and 237 deletions

6
Godeps/Godeps.json generated
View File

@ -976,11 +976,11 @@
},
{
"ImportPath": "k8s.io/api",
"Rev": "191e7be037d4"
"Rev": "a16591c7eddc"
},
{
"ImportPath": "k8s.io/apimachinery",
"Rev": "adc48d2d7eb5"
"Rev": "cfc896c115eb"
},
{
"ImportPath": "k8s.io/cli-runtime",
@ -988,7 +988,7 @@
},
{
"ImportPath": "k8s.io/client-go",
"Rev": "d1fa200aef5b"
"Rev": "39cb8cd8c11d"
},
{
"ImportPath": "k8s.io/code-generator",

12
go.mod
View File

@ -31,10 +31,10 @@ require (
github.com/stretchr/testify v1.7.0
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887
gopkg.in/yaml.v2 v2.4.0
k8s.io/api v0.0.0-20210521070909-191e7be037d4
k8s.io/apimachinery v0.0.0-20210521070659-adc48d2d7eb5
k8s.io/api v0.0.0-20210523150857-a16591c7eddc
k8s.io/apimachinery v0.0.0-20210521150646-cfc896c115eb
k8s.io/cli-runtime v0.0.0-20210521115311-5a5136b58165
k8s.io/client-go v0.0.0-20210521071212-d1fa200aef5b
k8s.io/client-go v0.0.0-20210524185628-39cb8cd8c11d
k8s.io/component-base v0.0.0-20210521071829-2a2fe9bbf92f
k8s.io/component-helpers v0.0.0-20210521071950-5ed6d3a5a2d5
k8s.io/klog/v2 v2.8.0
@ -47,10 +47,10 @@ require (
)
replace (
k8s.io/api => k8s.io/api v0.0.0-20210521070909-191e7be037d4
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210521070659-adc48d2d7eb5
k8s.io/api => k8s.io/api v0.0.0-20210523150857-a16591c7eddc
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20210521150646-cfc896c115eb
k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20210521115311-5a5136b58165
k8s.io/client-go => k8s.io/client-go v0.0.0-20210521071212-d1fa200aef5b
k8s.io/client-go => k8s.io/client-go v0.0.0-20210524185628-39cb8cd8c11d
k8s.io/code-generator => k8s.io/code-generator v0.0.0-20210521070450-0213807b44bf
k8s.io/component-base => k8s.io/component-base v0.0.0-20210521071829-2a2fe9bbf92f
k8s.io/component-helpers => k8s.io/component-helpers v0.0.0-20210521071950-5ed6d3a5a2d5

12
go.sum
View File

@ -669,14 +669,14 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.0.0-20210521070909-191e7be037d4 h1:qgCkzN01a1u8h5bYNgyqdKqGL+K19wvkp1JLOv3Oj2E=
k8s.io/api v0.0.0-20210521070909-191e7be037d4/go.mod h1:GfPTpPBzvUagWJY1n2kt8oncShcczHwc4trHJ+04pNE=
k8s.io/apimachinery v0.0.0-20210521070659-adc48d2d7eb5 h1:h4JFYCyQWf4U+jFWHXMZYkL9Drx9hLiBQbftQBMAfwU=
k8s.io/apimachinery v0.0.0-20210521070659-adc48d2d7eb5/go.mod h1:8Ay3sPKuJtD/dIjPSlQVgJeuW/8JmLTCqDeAv6NSCxU=
k8s.io/api v0.0.0-20210523150857-a16591c7eddc h1:MY1s8HL0z3c7g23mc5sawXXsIBL/kp89slIVNKz9mZ8=
k8s.io/api v0.0.0-20210523150857-a16591c7eddc/go.mod h1:OYWcx23Cf4qX54GQBQLeSSUlvOAvbgMucgB0TrADRHU=
k8s.io/apimachinery v0.0.0-20210521150646-cfc896c115eb h1:kxJH/Hf/+EnvbMiymbBbJ5nVuiQjcHZjfgI57rCtSDc=
k8s.io/apimachinery v0.0.0-20210521150646-cfc896c115eb/go.mod h1:8Ay3sPKuJtD/dIjPSlQVgJeuW/8JmLTCqDeAv6NSCxU=
k8s.io/cli-runtime v0.0.0-20210521115311-5a5136b58165 h1:B3PgG5/6tmoAUh4HewkSq2xRcCQI2Il+3KA08d95Cwc=
k8s.io/cli-runtime v0.0.0-20210521115311-5a5136b58165/go.mod h1:tqzSNRDj+3eMRmOZ7UzWmKClKQSho7TqHSJ4TSIIZhM=
k8s.io/client-go v0.0.0-20210521071212-d1fa200aef5b h1:mcl3yABrLVtYYWiFDkScO9n8op2wxzwEzReyjO4WEPY=
k8s.io/client-go v0.0.0-20210521071212-d1fa200aef5b/go.mod h1:fSZsfZrJMyBRs3783ddvdNtsZlZbJDL4O3F1ROhjdIY=
k8s.io/client-go v0.0.0-20210524185628-39cb8cd8c11d h1:3OFKvpkqCdzq+OHoMpZnEY8mW3Hnf4rW7W5ADPrbLLQ=
k8s.io/client-go v0.0.0-20210524185628-39cb8cd8c11d/go.mod h1:EWkJNCU4qOSWrtM+poIXCY937ArhI5w0ACG3zkw0qXE=
k8s.io/code-generator v0.0.0-20210521070450-0213807b44bf/go.mod h1:+I0Y7dLDIEgEJ8mo7J7cv/qF+opHxLfD1Ey7zbDmTIA=
k8s.io/component-base v0.0.0-20210521071829-2a2fe9bbf92f h1:5WGHsufGjyHFfwMXj0R/nilyN7HzOrb1XqGO6NErjDY=
k8s.io/component-base v0.0.0-20210521071829-2a2fe9bbf92f/go.mod h1:PLrHIJKBKJZB+zZsUAAQNbGrps/afIih9Oj/oqdQtsc=

View File

@ -23,14 +23,12 @@ import (
"github.com/spf13/cobra"
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/cli-runtime/pkg/resource"
batchv1client "k8s.io/client-go/kubernetes/typed/batch/v1"
batchv1beta1client "k8s.io/client-go/kubernetes/typed/batch/v1beta1"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/scheme"
"k8s.io/kubectl/pkg/util"
@ -64,7 +62,6 @@ type CreateCronJobOptions struct {
Namespace string
EnforceNamespace bool
ClientBeta batchv1beta1client.BatchV1beta1Interface
Client batchv1client.BatchV1Interface
DryRunStrategy cmdutil.DryRunStrategy
DryRunVerifier *resource.DryRunVerifier
@ -132,34 +129,10 @@ func (o *CreateCronJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, a
if err != nil {
return err
}
// TODO: drop this condition when beta disappears in 1.25
clientset, err := f.KubernetesClientSet()
o.Client, err = batchv1client.NewForConfig(clientConfig)
if err != nil {
return err
}
resources, err := clientset.Discovery().ServerResourcesForGroupVersion(batchv1.SchemeGroupVersion.String())
if err != nil {
return fmt.Errorf("failed to discover supported resources: %v", err)
}
found := false
for _, serverResource := range resources.APIResources {
if serverResource.Name == "cronjobs" {
found = true
break
}
}
if found {
o.Client, err = batchv1client.NewForConfig(clientConfig)
if err != nil {
return err
}
} else {
o.ClientBeta, err = batchv1beta1client.NewForConfig(clientConfig)
if err != nil {
return err
}
}
o.Namespace, o.EnforceNamespace, err = f.ToRawKubeConfigLoader().Namespace()
if err != nil {
@ -192,36 +165,8 @@ func (o *CreateCronJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, a
// Run performs the execution of 'create cronjob' sub command
func (o *CreateCronJobOptions) Run() error {
if o.Client != nil {
cronJob := o.createCronJob()
if err := util.CreateOrUpdateAnnotation(o.CreateAnnotation, cronJob, scheme.DefaultJSONEncoder()); err != nil {
return err
}
if o.DryRunStrategy != cmdutil.DryRunClient {
createOptions := metav1.CreateOptions{}
if o.FieldManager != "" {
createOptions.FieldManager = o.FieldManager
}
if o.DryRunStrategy == cmdutil.DryRunServer {
if err := o.DryRunVerifier.HasSupport(cronJob.GroupVersionKind()); err != nil {
return err
}
createOptions.DryRun = []string{metav1.DryRunAll}
}
var err error
cronJob, err = o.Client.CronJobs(o.Namespace).Create(context.TODO(), cronJob, createOptions)
if err != nil {
return fmt.Errorf("failed to create cronjob: %v", err)
}
}
return o.PrintObj(cronJob)
}
// TODO: drop this condition when beta disappears in 1.25
cronJobBeta := o.createCronJobBeta()
if err := util.CreateOrUpdateAnnotation(o.CreateAnnotation, cronJobBeta, scheme.DefaultJSONEncoder()); err != nil {
cronJob := o.createCronJob()
if err := util.CreateOrUpdateAnnotation(o.CreateAnnotation, cronJob, scheme.DefaultJSONEncoder()); err != nil {
return err
}
@ -231,55 +176,19 @@ func (o *CreateCronJobOptions) Run() error {
createOptions.FieldManager = o.FieldManager
}
if o.DryRunStrategy == cmdutil.DryRunServer {
if err := o.DryRunVerifier.HasSupport(cronJobBeta.GroupVersionKind()); err != nil {
if err := o.DryRunVerifier.HasSupport(cronJob.GroupVersionKind()); err != nil {
return err
}
createOptions.DryRun = []string{metav1.DryRunAll}
}
var err error
cronJobBeta, err = o.ClientBeta.CronJobs(o.Namespace).Create(context.TODO(), cronJobBeta, createOptions)
cronJob, err = o.Client.CronJobs(o.Namespace).Create(context.TODO(), cronJob, createOptions)
if err != nil {
return fmt.Errorf("failed to create cronjob: %v", err)
}
}
return o.PrintObj(cronJobBeta)
}
func (o *CreateCronJobOptions) createCronJobBeta() *batchv1beta1.CronJob {
cronjob := &batchv1beta1.CronJob{
TypeMeta: metav1.TypeMeta{APIVersion: batchv1beta1.SchemeGroupVersion.String(), Kind: "CronJob"},
ObjectMeta: metav1.ObjectMeta{
Name: o.Name,
},
Spec: batchv1beta1.CronJobSpec{
Schedule: o.Schedule,
JobTemplate: batchv1beta1.JobTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: o.Name,
},
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{
Name: o.Name,
Image: o.Image,
Command: o.Command,
},
},
RestartPolicy: corev1.RestartPolicy(o.Restart),
},
},
},
},
},
}
if o.EnforceNamespace {
cronjob.Namespace = o.Namespace
}
return cronjob
return o.PrintObj(cronJob)
}
func (o *CreateCronJobOptions) createCronJob() *batchv1.CronJob {

View File

@ -23,7 +23,6 @@ import (
"github.com/spf13/cobra"
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
@ -194,8 +193,6 @@ func (o *CreateJobOptions) Run() error {
switch obj := infos[0].Object.(type) {
case *batchv1.CronJob:
job = o.createJobFromCronJob(obj)
case *batchv1beta1.CronJob:
job = o.createJobFromCronJobV1Beta1(obj)
default:
return fmt.Errorf("unknown object type %T", obj)
}
@ -254,38 +251,6 @@ func (o *CreateJobOptions) createJob() *batchv1.Job {
return job
}
func (o *CreateJobOptions) createJobFromCronJobV1Beta1(cronJob *batchv1beta1.CronJob) *batchv1.Job {
annotations := make(map[string]string)
annotations["cronjob.kubernetes.io/instantiate"] = "manual"
for k, v := range cronJob.Spec.JobTemplate.Annotations {
annotations[k] = v
}
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{
Name: o.Name,
Annotations: annotations,
Labels: cronJob.Spec.JobTemplate.Labels,
OwnerReferences: []metav1.OwnerReference{
{
// TODO (soltysh): switch this to v1 in v1.22, when n-1 skew will be fulfilled
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},
},
},
Spec: cronJob.Spec.JobTemplate.Spec,
}
if o.EnforceNamespace {
job.Namespace = o.Namespace
}
return job
}
func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1.CronJob) *batchv1.Job {
annotations := make(map[string]string)
annotations["cronjob.kubernetes.io/instantiate"] = "manual"
@ -302,7 +267,7 @@ func (o *CreateJobOptions) createJobFromCronJob(cronJob *batchv1.CronJob) *batch
Labels: cronJob.Spec.JobTemplate.Labels,
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
APIVersion: batchv1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),

View File

@ -21,7 +21,6 @@ import (
"testing"
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
corev1 "k8s.io/api/core/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -135,72 +134,6 @@ func TestCreateJob(t *testing.T) {
}
}
func TestCreateJobFromCronJobV1Beta1(t *testing.T) {
jobName := "test-job"
cronJob := &batchv1beta1.CronJob{
Spec: batchv1beta1.CronJobSpec{
JobTemplate: batchv1beta1.JobTemplateSpec{
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{Image: "test-image"},
},
RestartPolicy: corev1.RestartPolicyNever,
},
},
},
},
},
}
tests := map[string]struct {
from *batchv1beta1.CronJob
expected *batchv1.Job
}{
"from CronJob": {
from: cronJob,
expected: &batchv1.Job{
TypeMeta: metav1.TypeMeta{APIVersion: batchv1.SchemeGroupVersion.String(), Kind: "Job"},
ObjectMeta: metav1.ObjectMeta{
Name: jobName,
Annotations: map[string]string{"cronjob.kubernetes.io/instantiate": "manual"},
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),
},
},
},
Spec: batchv1.JobSpec{
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{Image: "test-image"},
},
RestartPolicy: corev1.RestartPolicyNever,
},
},
},
},
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
o := &CreateJobOptions{
Name: jobName,
}
job := o.createJobFromCronJobV1Beta1(tc.from)
if !apiequality.Semantic.DeepEqual(job, tc.expected) {
t.Errorf("expected:\n%#v\ngot:\n%#v", tc.expected, job)
}
})
}
}
func TestCreateJobFromCronJob(t *testing.T) {
jobName := "test-job"
cronJob := &batchv1.CronJob{
@ -232,7 +165,7 @@ func TestCreateJobFromCronJob(t *testing.T) {
Annotations: map[string]string{"cronjob.kubernetes.io/instantiate": "manual"},
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: batchv1beta1.SchemeGroupVersion.String(),
APIVersion: batchv1.SchemeGroupVersion.String(),
Kind: "CronJob",
Name: cronJob.GetName(),
UID: cronJob.GetUID(),

View File

@ -23,13 +23,13 @@ import (
"github.com/spf13/cobra"
policyv1beta1 "k8s.io/api/policy/v1beta1"
policyv1 "k8s.io/api/policy/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/cli-runtime/pkg/genericclioptions"
resourcecli "k8s.io/cli-runtime/pkg/resource"
policyclient "k8s.io/client-go/kubernetes/typed/policy/v1beta1"
policyv1client "k8s.io/client-go/kubernetes/typed/policy/v1"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/scheme"
"k8s.io/kubectl/pkg/util"
@ -69,7 +69,7 @@ type PodDisruptionBudgetOpts struct {
Namespace string
EnforceNamespace bool
Client *policyclient.PolicyV1beta1Client
Client *policyv1client.PolicyV1Client
DryRunStrategy cmdutil.DryRunStrategy
DryRunVerifier *resourcecli.DryRunVerifier
@ -127,7 +127,7 @@ func (o *PodDisruptionBudgetOpts) Complete(f cmdutil.Factory, cmd *cobra.Command
if err != nil {
return err
}
o.Client, err = policyclient.NewForConfig(restConfig)
o.Client, err = policyv1client.NewForConfig(restConfig)
if err != nil {
return err
}
@ -230,15 +230,15 @@ func (o *PodDisruptionBudgetOpts) Run() error {
return o.PrintObj(podDisruptionBudget)
}
func (o *PodDisruptionBudgetOpts) createPodDisruptionBudgets() (*policyv1beta1.PodDisruptionBudget, error) {
func (o *PodDisruptionBudgetOpts) createPodDisruptionBudgets() (*policyv1.PodDisruptionBudget, error) {
namespace := ""
if o.EnforceNamespace {
namespace = o.Namespace
}
podDisruptionBudget := &policyv1beta1.PodDisruptionBudget{
podDisruptionBudget := &policyv1.PodDisruptionBudget{
TypeMeta: metav1.TypeMeta{
APIVersion: policyv1beta1.SchemeGroupVersion.String(),
APIVersion: policyv1.SchemeGroupVersion.String(),
Kind: "PodDisruptionBudget",
},
ObjectMeta: metav1.ObjectMeta{

View File

@ -19,7 +19,7 @@ package create
import (
"testing"
policyv1beta1 "k8s.io/api/policy/v1beta1"
policyv1 "k8s.io/api/policy/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
@ -137,7 +137,7 @@ func TestCreatePdb(t *testing.T) {
tests := map[string]struct {
options *PodDisruptionBudgetOpts
expected *policyv1beta1.PodDisruptionBudget
expected *policyv1.PodDisruptionBudget
}{
"test-valid-min-available-pods-number": {
options: &PodDisruptionBudgetOpts{
@ -145,15 +145,15 @@ func TestCreatePdb(t *testing.T) {
Selector: selectorOpts,
MinAvailable: podAmountNumber,
},
expected: &policyv1beta1.PodDisruptionBudget{
expected: &policyv1.PodDisruptionBudget{
TypeMeta: metav1.TypeMeta{
Kind: "PodDisruptionBudget",
APIVersion: "policy/v1beta1",
APIVersion: "policy/v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "my-pdb",
},
Spec: policyv1beta1.PodDisruptionBudgetSpec{
Spec: policyv1.PodDisruptionBudgetSpec{
Selector: selector,
MinAvailable: &minAvailableNumber,
},
@ -165,15 +165,15 @@ func TestCreatePdb(t *testing.T) {
Selector: selectorOpts,
MinAvailable: podAmountPercent,
},
expected: &policyv1beta1.PodDisruptionBudget{
expected: &policyv1.PodDisruptionBudget{
TypeMeta: metav1.TypeMeta{
Kind: "PodDisruptionBudget",
APIVersion: "policy/v1beta1",
APIVersion: "policy/v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "my-pdb",
},
Spec: policyv1beta1.PodDisruptionBudgetSpec{
Spec: policyv1.PodDisruptionBudgetSpec{
Selector: selector,
MinAvailable: &minAvailablePercent,
},
@ -185,15 +185,15 @@ func TestCreatePdb(t *testing.T) {
Selector: selectorOpts,
MinAvailable: podAmountNumber,
},
expected: &policyv1beta1.PodDisruptionBudget{
expected: &policyv1.PodDisruptionBudget{
TypeMeta: metav1.TypeMeta{
Kind: "PodDisruptionBudget",
APIVersion: "policy/v1beta1",
APIVersion: "policy/v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "my-pdb",
},
Spec: policyv1beta1.PodDisruptionBudgetSpec{
Spec: policyv1.PodDisruptionBudgetSpec{
Selector: selector,
MinAvailable: &minUnavailableNumber,
},
@ -205,15 +205,15 @@ func TestCreatePdb(t *testing.T) {
Selector: selectorOpts,
MinAvailable: podAmountPercent,
},
expected: &policyv1beta1.PodDisruptionBudget{
expected: &policyv1.PodDisruptionBudget{
TypeMeta: metav1.TypeMeta{
Kind: "PodDisruptionBudget",
APIVersion: "policy/v1beta1",
APIVersion: "policy/v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: "my-pdb",
},
Spec: policyv1beta1.PodDisruptionBudgetSpec{
Spec: policyv1.PodDisruptionBudgetSpec{
Selector: selector,
MinAvailable: &minUnavailablePercent,
},