Skip to content

Commit 58a1f52

Browse files
Merge pull request #17517 from liggitt/dc-scale
Automatic merge from submit-queue. Fix deployment config scale subresource 3.6 and 3.7 shipped with the /apis/apps.openshift.io/deploymentconfigs/scale subresource returning apps.openshift.io/v1 Scale objects This is a non-standard Scale object that the HPA will never be able to make use of. The intent was to continue send the same thing as /oapi/v1/deploymentconfigs/scale: extensions/v1beta1 Scale objects This PR fixes the groupified API to send/receive the correct type. It also updates the UpdateScale() client method to send extensions/v1beta1 Scale objects
2 parents d1e9479 + f698138 commit 58a1f52

File tree

10 files changed

+109
-35
lines changed

10 files changed

+109
-35
lines changed

api/swagger-spec/openshift-openapi-spec.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -19461,8 +19461,8 @@
1946119461
},
1946219462
"x-kubernetes-action": "get",
1946319463
"x-kubernetes-group-version-kind": {
19464-
"group": "apps.openshift.io",
19465-
"version": "v1",
19464+
"group": "extensions",
19465+
"version": "v1beta1",
1946619466
"kind": "Scale"
1946719467
}
1946819468
},
@@ -19506,8 +19506,8 @@
1950619506
},
1950719507
"x-kubernetes-action": "put",
1950819508
"x-kubernetes-group-version-kind": {
19509-
"group": "apps.openshift.io",
19510-
"version": "v1",
19509+
"group": "extensions",
19510+
"version": "v1beta1",
1951119511
"kind": "Scale"
1951219512
}
1951319513
},
@@ -19553,8 +19553,8 @@
1955319553
},
1955419554
"x-kubernetes-action": "patch",
1955519555
"x-kubernetes-group-version-kind": {
19556-
"group": "apps.openshift.io",
19557-
"version": "v1",
19556+
"group": "extensions",
19557+
"version": "v1beta1",
1955819558
"kind": "Scale"
1955919559
}
1956019560
},

pkg/apps/apis/apps/types.go

-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ const (
138138
// +genclient:method=Instantiate,verb=create,subresource=instantiate,input=DeploymentRequest
139139
// +genclient:method=Rollback,verb=create,subresource=rollback,input=DeploymentConfigRollback
140140
// +genclient:method=GetScale,verb=get,subresource=scale,result=k8s.io/kubernetes/pkg/apis/extensions/v1beta1.Scale
141-
// +genclient:method=UpdateScale,verb=update,subresource=scale,input=k8s.io/kubernetes/pkg/apis/extensions/v1beta1.Scale,result=k8s.io/kubernetes/pkg/apis/extensions/v1beta1.Scale
142141
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
143142

144143
// DeploymentConfig represents a configuration for a single deployment (represented as a

pkg/apps/apiserver/apiserver.go

+7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
genericapiserver "k8s.io/apiserver/pkg/server"
1313
restclient "k8s.io/client-go/rest"
1414
kapi "k8s.io/kubernetes/pkg/api"
15+
v1beta1extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
1516
kclientsetexternal "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
1617
kclientsetinternal "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
1718
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
@@ -84,6 +85,12 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
8485
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(appsapiv1.GroupName, c.Registry, c.Scheme, parameterCodec, c.Codecs)
8586
apiGroupInfo.GroupMeta.GroupVersion = appsapiv1.SchemeGroupVersion
8687
apiGroupInfo.VersionedResourcesStorageMap[appsapiv1.SchemeGroupVersion.Version] = v1Storage
88+
89+
if apiGroupInfo.SubresourceGroupVersionKind == nil {
90+
apiGroupInfo.SubresourceGroupVersionKind = map[string]schema.GroupVersionKind{}
91+
}
92+
apiGroupInfo.SubresourceGroupVersionKind["deploymentconfigs/scale"] = v1beta1extensions.SchemeGroupVersion.WithKind("Scale")
93+
8794
if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
8895
return nil, err
8996
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package scheme
2+
3+
import (
4+
extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
5+
)
6+
7+
func init() {
8+
// Needed for GetScale/UpdateScale
9+
extensionsv1beta1.AddToScheme(Scheme)
10+
}

pkg/apps/generated/internalclientset/typed/apps/internalversion/deploymentconfig.go

-15
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ type DeploymentConfigInterface interface {
3030
Instantiate(deploymentConfigName string, deploymentRequest *apps.DeploymentRequest) (*apps.DeploymentConfig, error)
3131
Rollback(deploymentConfigName string, deploymentConfigRollback *apps.DeploymentConfigRollback) (*apps.DeploymentConfig, error)
3232
GetScale(deploymentConfigName string, options v1.GetOptions) (*v1beta1.Scale, error)
33-
UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (*v1beta1.Scale, error)
3433

3534
DeploymentConfigExpansion
3635
}
@@ -202,17 +201,3 @@ func (c *deploymentConfigs) GetScale(deploymentConfigName string, options v1.Get
202201
Into(result)
203202
return
204203
}
205-
206-
// UpdateScale takes the top resource name and the representation of a scale and updates it. Returns the server's representation of the scale, and an error, if there is any.
207-
func (c *deploymentConfigs) UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (result *v1beta1.Scale, err error) {
208-
result = &v1beta1.Scale{}
209-
err = c.client.Put().
210-
Namespace(c.ns).
211-
Resource("deploymentconfigs").
212-
Name(deploymentConfigName).
213-
SubResource("scale").
214-
Body(scale).
215-
Do().
216-
Into(result)
217-
return
218-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package internalversion
2+
3+
import (
4+
"k8s.io/apimachinery/pkg/runtime"
5+
kapi "k8s.io/kubernetes/pkg/api"
6+
v1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
7+
)
8+
9+
type DeploymentConfigExpansion interface {
10+
UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (result *v1beta1.Scale, err error)
11+
}
12+
13+
var scaleCodec = kapi.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion)
14+
15+
// UpdateScale takes the top resource name and the representation of a scale and updates it. Returns the server's representation of the scale, and an error, if there is any.
16+
func (c *deploymentConfigs) UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (result *v1beta1.Scale, err error) {
17+
// FIXME: make non-homogenous subresource GV client generation work
18+
data, err := runtime.Encode(scaleCodec, scale)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
result = &v1beta1.Scale{}
24+
err = c.client.Put().
25+
Namespace(c.ns).
26+
Resource("deploymentconfigs").
27+
Name(deploymentConfigName).
28+
SubResource("scale").
29+
Body(data).
30+
Do().
31+
Into(result)
32+
return
33+
}

pkg/apps/generated/internalclientset/typed/apps/internalversion/fake/fake_deploymentconfig.go

-11
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,3 @@ func (c *FakeDeploymentConfigs) GetScale(deploymentConfigName string, options v1
154154
}
155155
return obj.(*v1beta1.Scale), err
156156
}
157-
158-
// UpdateScale takes the representation of a scale and updates it. Returns the server's representation of the scale, and an error, if there is any.
159-
func (c *FakeDeploymentConfigs) UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (result *v1beta1.Scale, err error) {
160-
obj, err := c.Fake.
161-
Invokes(testing.NewUpdateSubresourceAction(deploymentconfigsResource, "scale", c.ns, scale), &v1beta1.Scale{})
162-
163-
if obj == nil {
164-
return nil, err
165-
}
166-
return obj.(*v1beta1.Scale), err
167-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package fake
2+
3+
import (
4+
testing "k8s.io/client-go/testing"
5+
v1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
6+
)
7+
8+
// UpdateScale takes the representation of a scale and updates it. Returns the server's representation of the scale, and an error, if t
9+
func (c *FakeDeploymentConfigs) UpdateScale(deploymentConfigName string, scale *v1beta1.Scale) (result *v1beta1.Scale, err error) {
10+
obj, err := c.Fake.
11+
Invokes(testing.NewUpdateSubresourceAction(deploymentconfigsResource, "scale", c.ns, scale), &v1beta1.Scale{})
12+
13+
if obj == nil {
14+
return nil, err
15+
}
16+
return obj.(*v1beta1.Scale), err
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
package internalversion
2-
3-
type DeploymentConfigExpansion interface{}

test/integration/deploy_scale_test.go

+36
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package integration
22

33
import (
4+
"fmt"
45
"testing"
56
"time"
67

78
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
810
"k8s.io/apimachinery/pkg/util/wait"
911
extensionsv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
1012

@@ -49,6 +51,40 @@ func TestDeployScale(t *testing.T) {
4951
}
5052
generation := dc.Generation
5153

54+
{
55+
// Get scale subresource
56+
legacyPath := fmt.Sprintf("/oapi/v1/namespaces/%s/deploymentconfigs/%s/scale", dc.Namespace, dc.Name)
57+
legacyScale := &unstructured.Unstructured{}
58+
if err := adminAppsClient.AppsClient.RESTClient().Get().AbsPath(legacyPath).Do().Into(legacyScale); err != nil {
59+
t.Fatal(err)
60+
}
61+
// Ensure correct type
62+
if legacyScale.GetAPIVersion() != "extensions/v1beta1" {
63+
t.Fatalf("Expected extensions/v1beta1, got %v", legacyScale.GetAPIVersion())
64+
}
65+
// Ensure we can submit the same type back
66+
if err := adminAppsClient.AppsClient.RESTClient().Put().AbsPath(legacyPath).Body(legacyScale).Do().Error(); err != nil {
67+
t.Fatal(err)
68+
}
69+
}
70+
71+
{
72+
// Get scale subresource
73+
scalePath := fmt.Sprintf("/apis/apps.openshift.io/v1/namespaces/%s/deploymentconfigs/%s/scale", dc.Namespace, dc.Name)
74+
scale := &unstructured.Unstructured{}
75+
if err := adminAppsClient.AppsClient.RESTClient().Get().AbsPath(scalePath).Do().Into(scale); err != nil {
76+
t.Fatal(err)
77+
}
78+
// Ensure correct type
79+
if scale.GetAPIVersion() != "extensions/v1beta1" {
80+
t.Fatalf("Expected extensions/v1beta1, got %v", scale.GetAPIVersion())
81+
}
82+
// Ensure we can submit the same type back
83+
if err := adminAppsClient.AppsClient.RESTClient().Put().AbsPath(scalePath).Body(scale).Do().Error(); err != nil {
84+
t.Fatal(err)
85+
}
86+
}
87+
5288
condition := func() (bool, error) {
5389
config, err := adminAppsClient.DeploymentConfigs(namespace).Get(dc.Name, metav1.GetOptions{})
5490
if err != nil {

0 commit comments

Comments
 (0)