Skip to content

Commit 2539912

Browse files
committed
Stop setting SelfLink in kube-apiserver.
1 parent d159ae3 commit 2539912

File tree

10 files changed

+80
-47
lines changed

10 files changed

+80
-47
lines changed

staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ import (
3535
"k8s.io/apimachinery/pkg/types"
3636
"k8s.io/apimachinery/pkg/util/wait"
3737
"k8s.io/apimachinery/pkg/watch"
38+
"k8s.io/apiserver/pkg/features"
39+
utilfeature "k8s.io/apiserver/pkg/util/feature"
3840
"k8s.io/client-go/dynamic"
41+
featuregatetesting "k8s.io/component-base/featuregate/testing"
3942
)
4043

4144
func TestServerUp(t *testing.T) {
@@ -624,6 +627,8 @@ func TestSameNameDiffNamespace(t *testing.T) {
624627
}
625628

626629
func TestSelfLink(t *testing.T) {
630+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemoveSelfLink, false)()
631+
627632
tearDown, apiExtensionClient, dynamicClient, err := fixtures.StartDefaultServerWithClients(t)
628633
if err != nil {
629634
t.Fatal(err)

staging/src/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3232
"k8s.io/apimachinery/pkg/runtime/schema"
3333
"k8s.io/apimachinery/pkg/types"
34+
"k8s.io/apiserver/pkg/features"
35+
utilfeature "k8s.io/apiserver/pkg/util/feature"
3436
"k8s.io/client-go/dynamic"
3537

3638
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
@@ -340,10 +342,12 @@ func TestScaleSubresource(t *testing.T) {
340342
t.Fatalf("Scale.Status.Selector: expected: %v, got: %v", "bar", gottenScale.Status.Selector)
341343
}
342344

343-
// check self link
344-
expectedSelfLink := fmt.Sprintf("/apis/mygroup.example.com/%s/namespaces/not-the-default/noxus/foo/scale", v.Name)
345-
if gottenScale.GetSelfLink() != expectedSelfLink {
346-
t.Fatalf("Scale.Metadata.SelfLink: expected: %v, got: %v", expectedSelfLink, gottenScale.GetSelfLink())
345+
if !utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) {
346+
// check self link
347+
expectedSelfLink := fmt.Sprintf("/apis/mygroup.example.com/%s/namespaces/not-the-default/noxus/foo/scale", v.Name)
348+
if gottenScale.GetSelfLink() != expectedSelfLink {
349+
t.Fatalf("Scale.Metadata.SelfLink: expected: %v, got: %v", expectedSelfLink, gottenScale.GetSelfLink())
350+
}
347351
}
348352

349353
// update the scale object

staging/src/k8s.io/apiserver/pkg/endpoints/apiserver_test.go

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,9 +1144,8 @@ func TestList(t *testing.T) {
11441144
t.Logf("%d: body: %s", i, string(body))
11451145
continue
11461146
}
1147-
// TODO: future, restore get links
1148-
if !selfLinker.called {
1149-
t.Errorf("%d: never set self link", i)
1147+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
1148+
t.Errorf("%d: unexpected selfLinker.called: %v", i, selfLinker.called)
11501149
}
11511150
if !simpleStorage.namespacePresent {
11521151
t.Errorf("%d: namespace not set", i)
@@ -1279,9 +1278,8 @@ func TestListCompression(t *testing.T) {
12791278
t.Logf("%d: body: %s", i, string(body))
12801279
continue
12811280
}
1282-
// TODO: future, restore get links
1283-
if !selfLinker.called {
1284-
t.Errorf("%d: never set self link", i)
1281+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
1282+
t.Errorf("%d: unexpected selfLinker.called: %v", i, selfLinker.called)
12851283
}
12861284
if !simpleStorage.namespacePresent {
12871285
t.Errorf("%d: namespace not set", i)
@@ -1399,12 +1397,14 @@ func TestNonEmptyList(t *testing.T) {
13991397
if listOut.Items[0].Other != simpleStorage.list[0].Other {
14001398
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0], string(body))
14011399
}
1402-
if listOut.SelfLink != "/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/simple" {
1403-
t.Errorf("unexpected list self link: %#v", listOut)
1404-
}
1405-
expectedSelfLink := "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/other/simple/something"
1406-
if listOut.Items[0].ObjectMeta.SelfLink != expectedSelfLink {
1407-
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0].ObjectMeta.SelfLink, expectedSelfLink)
1400+
if !utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) {
1401+
if listOut.SelfLink != "/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/simple" {
1402+
t.Errorf("unexpected list self link: %#v", listOut)
1403+
}
1404+
expectedSelfLink := "/" + prefix + "/" + testGroupVersion.Group + "/" + testGroupVersion.Version + "/namespaces/other/simple/something"
1405+
if listOut.Items[0].ObjectMeta.SelfLink != expectedSelfLink {
1406+
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0].ObjectMeta.SelfLink, expectedSelfLink)
1407+
}
14081408
}
14091409
}
14101410

@@ -1449,16 +1449,20 @@ func TestSelfLinkSkipsEmptyName(t *testing.T) {
14491449
if listOut.Items[0].Other != simpleStorage.list[0].Other {
14501450
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0], string(body))
14511451
}
1452-
if listOut.SelfLink != "/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/simple" {
1453-
t.Errorf("unexpected list self link: %#v", listOut)
1454-
}
1455-
expectedSelfLink := ""
1456-
if listOut.Items[0].ObjectMeta.SelfLink != expectedSelfLink {
1457-
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0].ObjectMeta.SelfLink, expectedSelfLink)
1452+
if !utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) {
1453+
if listOut.SelfLink != "/"+prefix+"/"+testGroupVersion.Group+"/"+testGroupVersion.Version+"/simple" {
1454+
t.Errorf("unexpected list self link: %#v", listOut)
1455+
}
1456+
expectedSelfLink := ""
1457+
if listOut.Items[0].ObjectMeta.SelfLink != expectedSelfLink {
1458+
t.Errorf("Unexpected data: %#v, %s", listOut.Items[0].ObjectMeta.SelfLink, expectedSelfLink)
1459+
}
14581460
}
14591461
}
14601462

14611463
func TestRootSelfLink(t *testing.T) {
1464+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemoveSelfLink, false)()
1465+
14621466
storage := map[string]rest.Storage{}
14631467
simpleStorage := GetWithOptionsRootRESTStorage{
14641468
SimpleTypedStorage: &SimpleTypedStorage{
@@ -1596,8 +1600,8 @@ func TestExport(t *testing.T) {
15961600
t.Errorf("Expected: exported, saw: %s", itemOut.Other)
15971601
}
15981602

1599-
if !selfLinker.called {
1600-
t.Errorf("Never set self link")
1603+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
1604+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
16011605
}
16021606
}
16031607

@@ -1635,8 +1639,8 @@ func TestGet(t *testing.T) {
16351639
if itemOut.Name != simpleStorage.item.Name {
16361640
t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
16371641
}
1638-
if !selfLinker.called {
1639-
t.Errorf("Never set self link")
1642+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
1643+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
16401644
}
16411645
}
16421646

@@ -1715,6 +1719,7 @@ func BenchmarkGetNoCompression(b *testing.B) {
17151719
}
17161720
b.StopTimer()
17171721
}
1722+
17181723
func TestGetCompression(t *testing.T) {
17191724
storage := map[string]rest.Storage{}
17201725
simpleStorage := SimpleRESTStorage{
@@ -1781,8 +1786,8 @@ func TestGetCompression(t *testing.T) {
17811786
if itemOut.Name != simpleStorage.item.Name {
17821787
t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
17831788
}
1784-
if !selfLinker.called {
1785-
t.Errorf("Never set self link")
1789+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
1790+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
17861791
}
17871792
}
17881793
}
@@ -2762,8 +2767,8 @@ func TestGetAlternateSelfLink(t *testing.T) {
27622767
if itemOut.Name != simpleStorage.item.Name {
27632768
t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
27642769
}
2765-
if !selfLinker.called {
2766-
t.Errorf("Never set self link")
2770+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
2771+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
27672772
}
27682773
}
27692774

@@ -2800,8 +2805,8 @@ func TestGetNamespaceSelfLink(t *testing.T) {
28002805
if itemOut.Name != simpleStorage.item.Name {
28012806
t.Errorf("Unexpected data: %#v, expected %#v (%s)", itemOut, simpleStorage.item, string(body))
28022807
}
2803-
if !selfLinker.called {
2804-
t.Errorf("Never set self link")
2808+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
2809+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
28052810
}
28062811
}
28072812

@@ -3342,8 +3347,8 @@ func TestUpdate(t *testing.T) {
33423347
if simpleStorage.updated == nil || simpleStorage.updated.Name != item.Name {
33433348
t.Errorf("Unexpected update value %#v, expected %#v.", simpleStorage.updated, item)
33443349
}
3345-
if !selfLinker.called {
3346-
t.Errorf("Never set self link")
3350+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
3351+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
33473352
}
33483353
}
33493354

@@ -4010,8 +4015,8 @@ func TestCreate(t *testing.T) {
40104015
if response.StatusCode != http.StatusCreated {
40114016
t.Errorf("Unexpected status: %d, Expected: %d, %#v", response.StatusCode, http.StatusOK, response)
40124017
}
4013-
if !selfLinker.called {
4014-
t.Errorf("Never set self link")
4018+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
4019+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
40154020
}
40164021
}
40174022

@@ -4080,8 +4085,8 @@ func TestCreateYAML(t *testing.T) {
40804085
if response.StatusCode != http.StatusCreated {
40814086
t.Errorf("Unexpected status: %d, Expected: %d, %#v", response.StatusCode, http.StatusOK, response)
40824087
}
4083-
if !selfLinker.called {
4084-
t.Errorf("Never set self link")
4088+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
4089+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
40854090
}
40864091
}
40874092

@@ -4140,8 +4145,8 @@ func TestCreateInNamespace(t *testing.T) {
41404145
if response.StatusCode != http.StatusCreated {
41414146
t.Errorf("Unexpected status: %d, Expected: %d, %#v", response.StatusCode, http.StatusOK, response)
41424147
}
4143-
if !selfLinker.called {
4144-
t.Errorf("Never set self link")
4148+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
4149+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
41454150
}
41464151
}
41474152

staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,12 @@ func checkName(obj runtime.Object, name, namespace string, namer ScopeNamer) err
328328
// interfaces
329329
func setObjectSelfLink(ctx context.Context, obj runtime.Object, req *http.Request, namer ScopeNamer) error {
330330
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) {
331+
// Ensure that for empty lists we don't return <nil> items.
332+
if meta.IsListType(obj) && meta.LenList(obj) == 0 {
333+
if err := meta.SetList(obj, []runtime.Object{}); err != nil {
334+
return err
335+
}
336+
}
331337
return nil
332338
}
333339

staging/src/k8s.io/apiserver/pkg/endpoints/patchhandler_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import (
2525

2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
genericapitesting "k8s.io/apiserver/pkg/endpoints/testing"
28+
"k8s.io/apiserver/pkg/features"
2829
"k8s.io/apiserver/pkg/registry/rest"
30+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2931
)
3032

3133
func TestPatch(t *testing.T) {
@@ -67,8 +69,8 @@ func TestPatch(t *testing.T) {
6769
if simpleStorage.updated == nil || simpleStorage.updated.Labels["foo"] != "bar" {
6870
t.Errorf("Unexpected update value %#v, expected %#v.", simpleStorage.updated, item)
6971
}
70-
if !selfLinker.called {
71-
t.Errorf("Never set self link")
72+
if utilfeature.DefaultFeatureGate.Enabled(features.RemoveSelfLink) == selfLinker.called {
73+
t.Errorf("unexpected selfLinker.called: %v", selfLinker.called)
7274
}
7375
}
7476

staging/src/k8s.io/apiserver/pkg/features/kube_features.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
159159
StorageVersionHash: {Default: true, PreRelease: featuregate.Beta},
160160
WatchBookmark: {Default: true, PreRelease: featuregate.GA, LockToDefault: true},
161161
APIPriorityAndFairness: {Default: false, PreRelease: featuregate.Alpha},
162-
RemoveSelfLink: {Default: false, PreRelease: featuregate.Alpha},
162+
RemoveSelfLink: {Default: true, PreRelease: featuregate.Beta},
163163
SelectorIndex: {Default: true, PreRelease: featuregate.Beta},
164164
WarningHeaders: {Default: true, PreRelease: featuregate.Beta},
165165
}

test/e2e/apimachinery/table_conversion.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ var _ = SIGDescribe("Servers with support for Table transformation", func() {
111111
framework.ExpectNoError(err, "failed to get pod templates in Table form in namespace: %s", ns)
112112
framework.ExpectEqual(len(pagedTable.Rows), 2)
113113
framework.ExpectNotEqual(pagedTable.ResourceVersion, "")
114-
framework.ExpectNotEqual(pagedTable.SelfLink, "")
115114
framework.ExpectNotEqual(pagedTable.Continue, "")
116115
framework.ExpectEqual(pagedTable.Rows[0].Cells[0], "template-0000")
117116
framework.ExpectEqual(pagedTable.Rows[1].Cells[0], "template-0001")
@@ -138,7 +137,6 @@ var _ = SIGDescribe("Servers with support for Table transformation", func() {
138137
framework.ExpectEqual(len(table.Rows[0].Cells), len(table.ColumnDefinitions))
139138
framework.ExpectEqual(table.ColumnDefinitions[0].Name, "Name")
140139
framework.ExpectNotEqual(table.ResourceVersion, "")
141-
framework.ExpectNotEqual(table.SelfLink, "")
142140

143141
out := printTable(table)
144142
gomega.Expect(out).To(gomega.MatchRegexp("^NAME\\s"))

test/integration/apiserver/apply/apply_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,11 +686,16 @@ func TestApplyManagedFields(t *testing.T) {
686686
t.Fatalf("Failed to marshal object: %v", err)
687687
}
688688

689+
selfLink := ""
690+
if !utilfeature.DefaultFeatureGate.Enabled(genericfeatures.RemoveSelfLink) {
691+
selfLink = `
692+
"selfLink": "` + accessor.GetSelfLink() + `",`
693+
}
694+
689695
expected := []byte(`{
690696
"metadata": {
691697
"name": "test-cm",
692-
"namespace": "default",
693-
"selfLink": "` + accessor.GetSelfLink() + `",
698+
"namespace": "default",` + selfLink + `
694699
"uid": "` + string(accessor.GetUID()) + `",
695700
"resourceVersion": "` + accessor.GetResourceVersion() + `",
696701
"creationTimestamp": "` + accessor.GetCreationTimestamp().UTC().Format(time.RFC3339) + `",

test/integration/client/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@ go_test(
3030
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
3131
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
3232
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
33+
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
34+
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
3335
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
3436
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
3537
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
3638
"//staging/src/k8s.io/client-go/transport:go_default_library",
3739
"//staging/src/k8s.io/client-go/util/cert:go_default_library",
40+
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
3841
"//staging/src/k8s.io/component-base/version:go_default_library",
3942
"//test/integration/framework:go_default_library",
4043
"//test/utils:go_default_library",

test/integration/client/client_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ import (
3636
"k8s.io/apimachinery/pkg/types"
3737
"k8s.io/apimachinery/pkg/util/wait"
3838
"k8s.io/apimachinery/pkg/watch"
39+
"k8s.io/apiserver/pkg/features"
40+
utilfeature "k8s.io/apiserver/pkg/util/feature"
3941
clientset "k8s.io/client-go/kubernetes"
42+
featuregatetesting "k8s.io/component-base/featuregate/testing"
4043

4144
"k8s.io/component-base/version"
4245
kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing"
@@ -790,6 +793,8 @@ func runSelfLinkTestOnNamespace(t *testing.T, c clientset.Interface, namespace s
790793
}
791794

792795
func TestSelfLinkOnNamespace(t *testing.T) {
796+
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemoveSelfLink, false)()
797+
793798
result := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins", "ServiceAccount"}, framework.SharedEtcd())
794799
defer result.TearDownFn()
795800

0 commit comments

Comments
 (0)