(kubectl certificates): Remove certificates/v1beta1 client usage

certificates/v1beta1 was deprecated in 1.19 and we can safely clear it's
dependencies in `kubectl certificates` command.

Kubernetes-commit: 48b8ee0d3ba40a19d40a7404f890031fe22bc111
This commit is contained in:
Arda Güçlü 2022-08-24 09:17:05 +03:00 committed by Kubernetes Publisher
parent 6a94e99926
commit e5d52f2374
2 changed files with 13 additions and 109 deletions

View File

@ -24,7 +24,6 @@ import (
"github.com/spf13/cobra"
certificatesv1 "k8s.io/api/certificates/v1"
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -34,7 +33,6 @@ import (
"k8s.io/cli-runtime/pkg/printers"
"k8s.io/cli-runtime/pkg/resource"
v1 "k8s.io/client-go/kubernetes/typed/certificates/v1"
"k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/scheme"
"k8s.io/kubectl/pkg/util/i18n"
@ -69,9 +67,8 @@ type CertificateOptions struct {
csrNames []string
outputStyle string
certificatesV1Client v1.CertificatesV1Interface
certificatesV1Beta1Client v1beta1.CertificatesV1beta1Interface
builder *resource.Builder
certificatesV1Client v1.CertificatesV1Interface
builder *resource.Builder
genericclioptions.IOStreams
}
@ -110,11 +107,6 @@ func (o *CertificateOptions) Complete(restClientGetter genericclioptions.RESTCli
return err
}
o.certificatesV1Beta1Client, err = v1beta1.NewForConfig(clientConfig)
if err != nil {
return err
}
return nil
}
@ -242,14 +234,9 @@ func (o *CertificateOptions) modifyCertificateCondition(builder *resource.Builde
}
var csr runtime.Object
// get a typed object
// first try v1
csr, err = o.certificatesV1Client.CertificateSigningRequests().Get(context.TODO(), obj.GetName(), metav1.GetOptions{})
if apierrors.IsNotFound(err) {
// fall back to v1beta1
csr, err = o.certificatesV1Beta1Client.CertificateSigningRequests().Get(context.TODO(), obj.GetName(), metav1.GetOptions{})
}
if apierrors.IsNotFound(err) {
return fmt.Errorf("could not find v1 or v1beta1 version of %s: %v", obj.GetName(), err)
return fmt.Errorf("could not find v1 version of %s: %v", obj.GetName(), err)
}
if err != nil {
return err
@ -260,14 +247,12 @@ func (o *CertificateOptions) modifyCertificateCondition(builder *resource.Builde
return err
}
if !hasCondition || force {
switch modifiedCSR := modifiedCSR.(type) {
case *certificatesv1.CertificateSigningRequest:
_, err = o.certificatesV1Client.CertificateSigningRequests().UpdateApproval(context.TODO(), modifiedCSR.Name, modifiedCSR, metav1.UpdateOptions{})
case *certificatesv1beta1.CertificateSigningRequest:
_, err = o.certificatesV1Beta1Client.CertificateSigningRequests().UpdateApproval(context.TODO(), modifiedCSR, metav1.UpdateOptions{})
default:
return fmt.Errorf("can only handle certificates.k8s.io CertificateSigningRequest objects, got %T", modifiedCSR)
if mCSR, ok := modifiedCSR.(*certificatesv1.CertificateSigningRequest); ok {
_, err = o.certificatesV1Client.CertificateSigningRequests().UpdateApproval(context.TODO(), mCSR.Name, mCSR, metav1.UpdateOptions{})
} else {
return fmt.Errorf("can only handle certificates.k8s.io CertificateSigningRequest objects, got %T", mCSR)
}
if apierrors.IsConflict(err) && i < 10 {
if err := info.Get(); err != nil {
return err
@ -291,9 +276,8 @@ func (o *CertificateOptions) modifyCertificateCondition(builder *resource.Builde
}
func addConditionIfNeeded(mustNotHaveConditionType, conditionType, reason, message string) func(runtime.Object) (runtime.Object, bool, error) {
return func(csr runtime.Object) (runtime.Object, bool, error) {
switch csr := csr.(type) {
case *certificatesv1.CertificateSigningRequest:
return func(obj runtime.Object) (runtime.Object, bool, error) {
if csr, ok := obj.(*certificatesv1.CertificateSigningRequest); ok {
var alreadyHasCondition bool
for _, c := range csr.Status.Conditions {
if string(c.Type) == mustNotHaveConditionType {
@ -314,30 +298,7 @@ func addConditionIfNeeded(mustNotHaveConditionType, conditionType, reason, messa
LastUpdateTime: metav1.Now(),
})
return csr, false, nil
case *certificatesv1beta1.CertificateSigningRequest:
var alreadyHasCondition bool
for _, c := range csr.Status.Conditions {
if string(c.Type) == mustNotHaveConditionType {
return nil, false, fmt.Errorf("certificate signing request %q is already %s", csr.Name, c.Type)
}
if string(c.Type) == conditionType {
alreadyHasCondition = true
}
}
if alreadyHasCondition {
return csr, true, nil
}
csr.Status.Conditions = append(csr.Status.Conditions, certificatesv1beta1.CertificateSigningRequestCondition{
Type: certificatesv1beta1.RequestConditionType(conditionType),
Status: corev1.ConditionTrue,
Reason: reason,
Message: message,
LastUpdateTime: metav1.Now(),
})
return csr, false, nil
default:
} else {
return csr, false, nil
}
}

View File

@ -27,7 +27,6 @@ import (
"github.com/spf13/cobra"
certificatesv1 "k8s.io/api/certificates/v1"
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/cli-runtime/pkg/genericclioptions"
@ -63,20 +62,7 @@ func TestCertificates(t *testing.T) {
expectOutput: `approved`,
},
{
name: "approve existing, no v1",
nov1: true,
command: "approve",
args: []string{"certificatesigningrequests.v1beta1.certificates.k8s.io/existing"},
expectActions: []string{
`GET /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing`, // unstructured get
`GET /apis/certificates.k8s.io/v1/certificatesigningrequests/existing`, // typed get, 404
`GET /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing`, // typed get fallback
`PUT /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing/approval`,
},
expectOutput: `approved`,
},
{
name: "approve existing, no v1 or v1beta1",
name: "approve existing, no v1",
nov1: true,
nov1beta1: true,
command: "approve",
@ -133,20 +119,7 @@ func TestCertificates(t *testing.T) {
expectOutput: `denied`,
},
{
name: "deny existing, no v1",
nov1: true,
command: "deny",
args: []string{"certificatesigningrequests.v1beta1.certificates.k8s.io/existing"},
expectActions: []string{
`GET /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing`, // unstructured get
`GET /apis/certificates.k8s.io/v1/certificatesigningrequests/existing`, // typed get, 404
`GET /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing`, // typed get fallback
`PUT /apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing/approval`,
},
expectOutput: `denied`,
},
{
name: "deny existing, no v1 or v1beta1",
name: "deny existing, no v1",
nov1: true,
nov1beta1: true,
command: "deny",
@ -202,32 +175,18 @@ func TestCertificates(t *testing.T) {
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "existing"},
}
existingV1beta1 := &certificatesv1beta1.CertificateSigningRequest{
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1beta1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "existing"},
}
approvedV1 := &certificatesv1.CertificateSigningRequest{
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "approved"},
Status: certificatesv1.CertificateSigningRequestStatus{Conditions: []certificatesv1.CertificateSigningRequestCondition{{Type: certificatesv1.CertificateApproved}}},
}
approvedV1beta1 := &certificatesv1beta1.CertificateSigningRequest{
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1beta1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "existing"},
Status: certificatesv1beta1.CertificateSigningRequestStatus{Conditions: []certificatesv1beta1.CertificateSigningRequestCondition{{Type: certificatesv1beta1.CertificateApproved}}},
}
deniedV1 := &certificatesv1.CertificateSigningRequest{
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "denied"},
Status: certificatesv1.CertificateSigningRequestStatus{Conditions: []certificatesv1.CertificateSigningRequestCondition{{Type: certificatesv1.CertificateDenied}}},
}
deniedV1beta1 := &certificatesv1beta1.CertificateSigningRequest{
TypeMeta: metav1.TypeMeta{APIVersion: "certificates.k8s.io/v1beta1", Kind: "CertificateSigningRequest"},
ObjectMeta: metav1.ObjectMeta{Name: "denied"},
Status: certificatesv1beta1.CertificateSigningRequestStatus{Conditions: []certificatesv1beta1.CertificateSigningRequestCondition{{Type: certificatesv1beta1.CertificateDenied}}},
}
actions := []string{}
fakeClient := fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
@ -235,40 +194,24 @@ func TestCertificates(t *testing.T) {
switch p, m := req.URL.Path, req.Method; {
case tc.nov1 && strings.HasPrefix(p, "/apis/certificates.k8s.io/v1/"):
return &http.Response{StatusCode: http.StatusNotFound, Body: ioutil.NopCloser(bytes.NewBuffer([]byte{}))}, nil
case tc.nov1beta1 && strings.HasPrefix(p, "/apis/certificates.k8s.io/v1beta1/"):
return &http.Response{StatusCode: http.StatusNotFound, Body: ioutil.NopCloser(bytes.NewBuffer([]byte{}))}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/missing" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusNotFound}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/missing" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusNotFound}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/existing" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, existingV1)}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/existing/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, existingV1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, existingV1beta1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/existing/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, existingV1beta1)}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/approved" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, approvedV1)}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/approved/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, approvedV1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/approved" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, approvedV1beta1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/approved/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, approvedV1beta1)}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/denied" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, deniedV1)}, nil
case p == "/apis/certificates.k8s.io/v1/certificatesigningrequests/denied/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, deniedV1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/denied" && m == http.MethodGet:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, deniedV1beta1)}, nil
case p == "/apis/certificates.k8s.io/v1beta1/certificatesigningrequests/denied/approval" && m == http.MethodPut:
return &http.Response{StatusCode: http.StatusOK, Header: cmdtesting.DefaultHeader(), Body: cmdtesting.ObjBody(codec, deniedV1beta1)}, nil
default:
t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)