Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add context and options to scale client #88599

Merged
merged 1 commit into from Mar 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/controller/disruption/disruption.go
Expand Up @@ -292,7 +292,7 @@ func (dc *DisruptionController) getScaleController(controllerRef *metav1.OwnerRe
}
gr := mapping.Resource.GroupResource()

scale, err := dc.scaleNamespacer.Scales(namespace).Get(gr, controllerRef.Name)
scale, err := dc.scaleNamespacer.Scales(namespace).Get(context.TODO(), gr, controllerRef.Name, metav1.GetOptions{})
if err != nil {
if errors.IsNotFound(err) {
return nil, nil
Expand Down
4 changes: 2 additions & 2 deletions pkg/controller/podautoscaler/horizontal.go
Expand Up @@ -648,7 +648,7 @@ func (a *HorizontalController) reconcileAutoscaler(hpav1Shared *autoscalingv1.Ho

if rescale {
scale.Spec.Replicas = desiredReplicas
_, err = a.scaleNamespacer.Scales(hpa.Namespace).Update(targetGR, scale)
_, err = a.scaleNamespacer.Scales(hpa.Namespace).Update(context.TODO(), targetGR, scale, metav1.UpdateOptions{})
if err != nil {
a.eventRecorder.Eventf(hpa, v1.EventTypeWarning, "FailedRescale", "New size: %d; reason: %s; error: %v", desiredReplicas, rescaleReason, err.Error())
setCondition(hpa, autoscalingv2.AbleToScale, v1.ConditionFalse, "FailedUpdateScale", "the HPA controller was unable to update the target scale: %v", err)
Expand Down Expand Up @@ -1050,7 +1050,7 @@ func (a *HorizontalController) scaleForResourceMappings(namespace, name string,
var firstErr error
for i, mapping := range mappings {
targetGR := mapping.Resource.GroupResource()
scale, err := a.scaleNamespacer.Scales(namespace).Get(targetGR, name)
scale, err := a.scaleNamespacer.Scales(namespace).Get(context.TODO(), targetGR, name, metav1.GetOptions{})
if err == nil {
return scale, targetGR, nil
}
Expand Down
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package integration

import (
"context"
"fmt"
"math"
"reflect"
Expand Down Expand Up @@ -328,7 +329,7 @@ func TestScaleSubresource(t *testing.T) {
}

// get the scale object
gottenScale, err := scaleClient.Scales("not-the-default").Get(groupResource, "foo")
gottenScale, err := scaleClient.Scales("not-the-default").Get(context.TODO(), groupResource, "foo", metav1.GetOptions{})
if err != nil {
t.Fatal(err)
}
Expand All @@ -349,7 +350,7 @@ func TestScaleSubresource(t *testing.T) {
// check that spec is updated, but status is not
gottenScale.Spec.Replicas = 5
gottenScale.Status.Selector = "baz"
updatedScale, err := scaleClient.Scales("not-the-default").Update(groupResource, gottenScale)
updatedScale, err := scaleClient.Scales("not-the-default").Update(context.TODO(), groupResource, gottenScale, metav1.UpdateOptions{})
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -842,7 +843,7 @@ func TestSubresourcePatch(t *testing.T) {
}

// Scale.Spec.Replicas = 7 but Scale.Status.Replicas should remain 0
gottenScale, err := scaleClient.Scales("not-the-default").Get(groupResource, "foo")
gottenScale, err := scaleClient.Scales("not-the-default").Get(context.TODO(), groupResource, "foo", metav1.GetOptions{})
if err != nil {
t.Fatal(err)
}
Expand Down
1 change: 1 addition & 0 deletions staging/src/k8s.io/client-go/scale/BUILD
Expand Up @@ -14,6 +14,7 @@ go_library(
deps = [
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
Expand Down
24 changes: 18 additions & 6 deletions staging/src/k8s.io/client-go/scale/client.go
Expand Up @@ -21,6 +21,7 @@ import (
"fmt"

autoscaling "k8s.io/api/autoscaling/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
serializer "k8s.io/apimachinery/pkg/runtime/serializer"
Expand All @@ -31,6 +32,14 @@ import (

var scaleConverter = NewScaleConverter()
var codecs = serializer.NewCodecFactory(scaleConverter.Scheme())
var parameterScheme = runtime.NewScheme()
var dynamicParameterCodec = runtime.NewParameterCodec(parameterScheme)

var versionV1 = schema.GroupVersion{Version: "v1"}

func init() {
metav1.AddToGroupVersion(parameterScheme, versionV1)
}

// scaleClient is an implementation of ScalesGetter
// which makes use of a RESTMapper and a generic REST
Expand Down Expand Up @@ -138,7 +147,7 @@ func (c *scaleClient) Scales(namespace string) ScaleInterface {
}
}

func (c *namespacedScaleClient) Get(resource schema.GroupResource, name string) (*autoscaling.Scale, error) {
func (c *namespacedScaleClient) Get(ctx context.Context, resource schema.GroupResource, name string, opts metav1.GetOptions) (*autoscaling.Scale, error) {
// Currently, a /scale endpoint can return different scale types.
// Until we have support for the alternative API representations proposal,
// we need to deal with accepting different API versions.
Expand All @@ -155,15 +164,16 @@ func (c *namespacedScaleClient) Get(resource schema.GroupResource, name string)
Resource(gvr.Resource).
Name(name).
SubResource("scale").
Do(context.TODO())
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
Do(ctx)
if err := result.Error(); err != nil {
return nil, err
}

return convertToScale(&result)
}

func (c *namespacedScaleClient) Update(resource schema.GroupResource, scale *autoscaling.Scale) (*autoscaling.Scale, error) {
func (c *namespacedScaleClient) Update(ctx context.Context, resource schema.GroupResource, scale *autoscaling.Scale, opts metav1.UpdateOptions) (*autoscaling.Scale, error) {
path, gvr, err := c.client.pathAndVersionFor(resource)
if err != nil {
return nil, fmt.Errorf("unable to get client for %s: %v", resource.String(), err)
Expand Down Expand Up @@ -196,8 +206,9 @@ func (c *namespacedScaleClient) Update(resource schema.GroupResource, scale *aut
Resource(gvr.Resource).
Name(scale.Name).
SubResource("scale").
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
Body(scaleUpdateBytes).
Do(context.TODO())
Do(ctx)
if err := result.Error(); err != nil {
// propagate "raw" error from the API
// this allows callers to interpret underlying Reason field
Expand All @@ -208,16 +219,17 @@ func (c *namespacedScaleClient) Update(resource schema.GroupResource, scale *aut
return convertToScale(&result)
}

func (c *namespacedScaleClient) Patch(gvr schema.GroupVersionResource, name string, pt types.PatchType, data []byte) (*autoscaling.Scale, error) {
func (c *namespacedScaleClient) Patch(ctx context.Context, gvr schema.GroupVersionResource, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions) (*autoscaling.Scale, error) {
groupVersion := gvr.GroupVersion()
result := c.client.clientBase.Patch(pt).
AbsPath(c.client.apiPathFor(groupVersion)).
NamespaceIfScoped(c.namespace, c.namespace != "").
Resource(gvr.Resource).
Name(name).
SubResource("scale").
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
Body(data).
Do(context.TODO())
Do(ctx)
if err := result.Error(); err != nil {
return nil, err
}
Expand Down
9 changes: 5 additions & 4 deletions staging/src/k8s.io/client-go/scale/client_test.go
Expand Up @@ -18,6 +18,7 @@ package scale

import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
Expand Down Expand Up @@ -273,7 +274,7 @@ func TestGetScale(t *testing.T) {
}

for _, groupResource := range groupResources {
scale, err := scaleClient.Scales("default").Get(groupResource, "foo")
scale, err := scaleClient.Scales("default").Get(context.TODO(), groupResource, "foo", metav1.GetOptions{})
if !assert.NoError(t, err, "should have been able to fetch a scale for %s", groupResource.String()) {
continue
}
Expand Down Expand Up @@ -301,7 +302,7 @@ func TestUpdateScale(t *testing.T) {
}

for _, groupResource := range groupResources {
scale, err := scaleClient.Scales("default").Update(groupResource, expectedScale)
scale, err := scaleClient.Scales("default").Update(context.TODO(), groupResource, expectedScale, metav1.UpdateOptions{})
if !assert.NoError(t, err, "should have been able to fetch a scale for %s", groupResource.String()) {
continue
}
Expand Down Expand Up @@ -344,7 +345,7 @@ func TestPatchScale(t *testing.T) {

patch := []byte(`{"spec":{"replicas":5}}`)
for _, gvr := range gvrs {
scale, err := scaleClient.Scales("default").Patch(gvr, "foo", types.MergePatchType, patch)
scale, err := scaleClient.Scales("default").Patch(context.TODO(), gvr, "foo", types.MergePatchType, patch, metav1.PatchOptions{})
if !assert.NoError(t, err, "should have been able to fetch a scale for %s", gvr.String()) {
continue
}
Expand All @@ -354,7 +355,7 @@ func TestPatchScale(t *testing.T) {

patch = []byte(`[{"op":"replace","path":"/spec/replicas","value":5}]`)
for _, gvr := range gvrs {
scale, err := scaleClient.Scales("default").Patch(gvr, "foo", types.JSONPatchType, patch)
scale, err := scaleClient.Scales("default").Patch(context.TODO(), gvr, "foo", types.JSONPatchType, patch, metav1.PatchOptions{})
if !assert.NoError(t, err, "should have been able to fetch a scale for %s", gvr.String()) {
continue
}
Expand Down
1 change: 1 addition & 0 deletions staging/src/k8s.io/client-go/scale/fake/BUILD
Expand Up @@ -8,6 +8,7 @@ go_library(
visibility = ["//visibility:public"],
deps = [
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//staging/src/k8s.io/client-go/scale:go_default_library",
Expand Down
9 changes: 6 additions & 3 deletions staging/src/k8s.io/client-go/scale/fake/client.go
Expand Up @@ -20,7 +20,10 @@ limitations under the License.
package fake

import (
"context"

autoscalingapi "k8s.io/api/autoscaling/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/scale"
Expand All @@ -44,7 +47,7 @@ type fakeNamespacedScaleClient struct {
fake *testing.Fake
}

func (f *fakeNamespacedScaleClient) Get(resource schema.GroupResource, name string) (*autoscalingapi.Scale, error) {
func (f *fakeNamespacedScaleClient) Get(ctx context.Context, resource schema.GroupResource, name string, opts metav1.GetOptions) (*autoscalingapi.Scale, error) {
obj, err := f.fake.
Invokes(testing.NewGetSubresourceAction(resource.WithVersion(""), f.namespace, "scale", name), &autoscalingapi.Scale{})

Expand All @@ -55,7 +58,7 @@ func (f *fakeNamespacedScaleClient) Get(resource schema.GroupResource, name stri
return obj.(*autoscalingapi.Scale), err
}

func (f *fakeNamespacedScaleClient) Update(resource schema.GroupResource, scale *autoscalingapi.Scale) (*autoscalingapi.Scale, error) {
func (f *fakeNamespacedScaleClient) Update(ctx context.Context, resource schema.GroupResource, scale *autoscalingapi.Scale, opts metav1.UpdateOptions) (*autoscalingapi.Scale, error) {
obj, err := f.fake.
Invokes(testing.NewUpdateSubresourceAction(resource.WithVersion(""), f.namespace, "scale", scale), &autoscalingapi.Scale{})

Expand All @@ -66,7 +69,7 @@ func (f *fakeNamespacedScaleClient) Update(resource schema.GroupResource, scale
return obj.(*autoscalingapi.Scale), err
}

func (f *fakeNamespacedScaleClient) Patch(gvr schema.GroupVersionResource, name string, pt types.PatchType, patch []byte) (*autoscalingapi.Scale, error) {
func (f *fakeNamespacedScaleClient) Patch(ctx context.Context, gvr schema.GroupVersionResource, name string, pt types.PatchType, patch []byte, opts metav1.PatchOptions) (*autoscalingapi.Scale, error) {
obj, err := f.fake.
Invokes(testing.NewPatchSubresourceAction(gvr, f.namespace, name, pt, patch, "scale"), &autoscalingapi.Scale{})

Expand Down
9 changes: 6 additions & 3 deletions staging/src/k8s.io/client-go/scale/interfaces.go
Expand Up @@ -17,7 +17,10 @@ limitations under the License.
package scale

import (
"context"

autoscalingapi "k8s.io/api/autoscaling/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
)
Expand All @@ -34,11 +37,11 @@ type ScalesGetter interface {
// the scale subresource.
type ScaleInterface interface {
// Get fetches the scale of the given scalable resource.
Get(resource schema.GroupResource, name string) (*autoscalingapi.Scale, error)
Get(ctx context.Context, resource schema.GroupResource, name string, opts metav1.GetOptions) (*autoscalingapi.Scale, error)

// Update updates the scale of the given scalable resource.
Update(resource schema.GroupResource, scale *autoscalingapi.Scale) (*autoscalingapi.Scale, error)
Update(ctx context.Context, resource schema.GroupResource, scale *autoscalingapi.Scale, opts metav1.UpdateOptions) (*autoscalingapi.Scale, error)

// Patch patches the scale of the given scalable resource.
Patch(gvr schema.GroupVersionResource, name string, pt types.PatchType, data []byte) (*autoscalingapi.Scale, error)
Patch(ctx context.Context, gvr schema.GroupVersionResource, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions) (*autoscalingapi.Scale, error)
}
1 change: 1 addition & 0 deletions staging/src/k8s.io/kubectl/pkg/scale/BUILD
Expand Up @@ -9,6 +9,7 @@ go_library(
deps = [
"//staging/src/k8s.io/api/autoscaling/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
Expand Down
10 changes: 6 additions & 4 deletions staging/src/k8s.io/kubectl/pkg/scale/scale.go
Expand Up @@ -17,12 +17,14 @@ limitations under the License.
package scale

import (
"context"
"fmt"
"strconv"
"time"

autoscalingv1 "k8s.io/api/autoscaling/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
Expand Down Expand Up @@ -115,23 +117,23 @@ var _ Scaler = &genericScaler{}
// ScaleSimple updates a scale of a given resource. It returns the resourceVersion of the scale if the update was successful.
func (s *genericScaler) ScaleSimple(namespace, name string, preconditions *ScalePrecondition, newSize uint, gvr schema.GroupVersionResource) (updatedResourceVersion string, err error) {
if preconditions != nil {
scale, err := s.scaleNamespacer.Scales(namespace).Get(gvr.GroupResource(), name)
scale, err := s.scaleNamespacer.Scales(namespace).Get(context.TODO(), gvr.GroupResource(), name, metav1.GetOptions{})
if err != nil {
return "", err
}
if err = preconditions.validate(scale); err != nil {
return "", err
}
scale.Spec.Replicas = int32(newSize)
updatedScale, err := s.scaleNamespacer.Scales(namespace).Update(gvr.GroupResource(), scale)
updatedScale, err := s.scaleNamespacer.Scales(namespace).Update(context.TODO(), gvr.GroupResource(), scale, metav1.UpdateOptions{})
if err != nil {
return "", err
}
return updatedScale.ResourceVersion, nil
}

patch := []byte(fmt.Sprintf(`{"spec":{"replicas":%d}}`, newSize))
updatedScale, err := s.scaleNamespacer.Scales(namespace).Patch(gvr, name, types.MergePatchType, patch)
updatedScale, err := s.scaleNamespacer.Scales(namespace).Patch(context.TODO(), gvr, name, types.MergePatchType, patch, metav1.PatchOptions{})
if err != nil {
return "", err
}
Expand Down Expand Up @@ -159,7 +161,7 @@ func (s *genericScaler) Scale(namespace, resourceName string, newSize uint, prec
// count for a scale (Spec) equals its updated replicas count (Status)
func scaleHasDesiredReplicas(sClient scaleclient.ScalesGetter, gr schema.GroupResource, resourceName string, namespace string, desiredReplicas int32) wait.ConditionFunc {
return func() (bool, error) {
actualScale, err := sClient.Scales(namespace).Get(gr, resourceName)
actualScale, err := sClient.Scales(namespace).Get(context.TODO(), gr, resourceName, metav1.GetOptions{})
if err != nil {
return false, err
}
Expand Down