Compare commits

..

8 Commits

Author SHA1 Message Date
Kubernetes Publisher
2ed1d94182 Update dependencies to v0.23.7 tag 2022-05-26 00:54:32 +00:00
Kubernetes Publisher
a475c28713 Merge pull request #108791 from aojea/cherry-pick-108772
Cherry pick 108772

Kubernetes-commit: 05a09629ab8207a870c9178b0f5694aa92919d92
2022-03-31 09:19:36 +00:00
Kubernetes Publisher
8041ba924b Merge pull request #109159 from wojtek-t/automated-cherry-pick-of-#109137-upstream-release-1.23
Automated cherry pick of #109137 upstream release 1.23

Kubernetes-commit: 4f9c753bf05d1c353fe96eba1e06aeafc58259c8
2022-03-31 05:22:55 +00:00
Michael Bolot
0c2c708257 Addresses the issue which caused #109115
Kubernetes-commit: 814ae980477ab06f8dbe13ae4c4318110e6922f6
2022-03-29 12:35:13 -05:00
Wojciech Tyczyński
9b9e45fc6d Add test for indexer with multiple values
Kubernetes-commit: 6ba5a0bc38306b713723281d4e54d257e2936890
2022-03-30 08:52:10 +02:00
Kubernetes Publisher
ad6be0fa0b sync: initially remove files BUILD */BUILD BUILD.bazel */BUILD.bazel Gopkg.toml */.gitattributes 2022-03-25 17:27:50 +00:00
Antonio Ojea
a26f2df3da client-go: update generated
Kubernetes-commit: f628706339c120c19d28ccfa7b1a580516be1d1a
2022-03-17 16:03:10 +01:00
Antonio Ojea
b6f49c1554 default kubernetes agent for generated clients
Set default kubernetes agent if empty

Kubernetes-commit: 3de44bd759a34f6fead9fe7254b5204684b99de8
2022-03-17 13:19:43 +01:00
7 changed files with 178 additions and 17 deletions

8
go.mod
View File

@@ -30,8 +30,8 @@ require (
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac
google.golang.org/protobuf v1.27.1
k8s.io/api v0.23.4
k8s.io/apimachinery v0.23.4
k8s.io/api v0.23.7
k8s.io/apimachinery v0.23.7
k8s.io/klog/v2 v2.30.0
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65
k8s.io/utils v0.0.0-20211116205334-6203023598ed
@@ -40,6 +40,6 @@ require (
)
replace (
k8s.io/api => k8s.io/api v0.23.4
k8s.io/apimachinery => k8s.io/apimachinery v0.23.4
k8s.io/api => k8s.io/api v0.23.7
k8s.io/apimachinery => k8s.io/apimachinery v0.23.7
)

8
go.sum
View File

@@ -610,10 +610,10 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
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=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.23.4 h1:85gnfXQOWbJa1SiWGpE9EEtHs0UVvDyIsSMpEtl2D4E=
k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI=
k8s.io/apimachinery v0.23.4 h1:fhnuMd/xUL3Cjfl64j5ULKZ1/J9n8NuQEgNL+WXWfdM=
k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
k8s.io/api v0.23.7 h1:UxFan6t0yTTgEKffoEEXUcLdhzAXf/yqTaz/XU7stzg=
k8s.io/api v0.23.7/go.mod h1:Jn7OvVwrE77fPvtdXjEAjfS6KR5l4oTW8CfksHgZBUw=
k8s.io/apimachinery v0.23.7 h1:IV0+rdF4U+8j7FY6jTw394JsISeHYNAQ7pblZyFfyvw=
k8s.io/apimachinery v0.23.7/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=

View File

@@ -413,6 +413,10 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface {
func NewForConfig(c *rest.Config) (*Clientset, error) {
configShallowCopy := *c
if configShallowCopy.UserAgent == "" {
configShallowCopy.UserAgent = rest.DefaultKubernetesUserAgent()
}
// share the transport between all clients
httpClient, err := rest.HTTPClientFor(&configShallowCopy)
if err != nil {

View File

@@ -0,0 +1,88 @@
/*
Copyright 2022 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package kubernetes_test
import (
"context"
"net/http"
"net/http/httptest"
"testing"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
)
func TestClientUserAgent(t *testing.T) {
tests := []struct {
name string
userAgent string
expect string
}{
{
name: "empty",
expect: rest.DefaultKubernetesUserAgent(),
},
{
name: "custom",
userAgent: "test-agent",
expect: "test-agent",
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
userAgent := r.Header.Get("User-Agent")
if userAgent != tc.expect {
t.Errorf("User Agent expected: %s got: %s", tc.expect, userAgent)
http.Error(w, "Unexpected user agent", http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write([]byte("{}"))
}))
ts.Start()
defer ts.Close()
gv := v1.SchemeGroupVersion
config := &rest.Config{
Host: ts.URL,
}
config.GroupVersion = &gv
config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
config.UserAgent = tc.userAgent
config.ContentType = "application/json"
client, err := kubernetes.NewForConfig(config)
if err != nil {
t.Fatalf("failed to create REST client: %v", err)
}
_, err = client.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
if err != nil {
t.Error(err)
}
_, err = client.CoreV1().Secrets("").List(context.TODO(), metav1.ListOptions{})
if err != nil {
t.Error(err)
}
})
}
}

View File

@@ -1 +0,0 @@
base.go export-subst

View File

@@ -284,18 +284,15 @@ func (c *threadSafeMap) updateIndices(oldObj interface{}, newObj interface{}, ke
c.indices[name] = index
}
if len(indexValues) == 1 && len(oldIndexValues) == 1 && indexValues[0] == oldIndexValues[0] {
// We optimize for the most common case where indexFunc returns a single value which has not been changed
continue
}
for _, value := range oldIndexValues {
// We optimize for the most common case where index returns a single value.
if len(indexValues) == 1 && value == indexValues[0] {
continue
}
c.deleteKeyFromIndex(key, value, index)
}
for _, value := range indexValues {
// We optimize for the most common case where index returns a single value.
if len(oldIndexValues) == 1 && value == oldIndexValues[0] {
continue
}
c.addKeyToIndex(key, value, index)
}
}

View File

@@ -18,7 +18,11 @@ package cache
import (
"fmt"
"strings"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert"
)
func TestThreadSafeStoreDeleteRemovesEmptySetsFromIndex(t *testing.T) {
@@ -92,6 +96,75 @@ func TestThreadSafeStoreAddKeepsNonEmptySetPostDeleteFromIndex(t *testing.T) {
}
}
func TestThreadSafeStoreIndexingFunctionsWithMultipleValues(t *testing.T) {
testIndexer := "testIndexer"
indexers := Indexers{
testIndexer: func(obj interface{}) ([]string, error) {
return strings.Split(obj.(string), ","), nil
},
}
indices := Indices{}
store := NewThreadSafeStore(indexers, indices).(*threadSafeMap)
store.Add("key1", "foo")
store.Add("key2", "bar")
assert := assert.New(t)
compare := func(key string, expected []string) error {
values := store.indices[testIndexer][key].List()
if cmp.Equal(values, expected) {
return nil
}
return fmt.Errorf("unexpected index for key %s, diff=%s", key, cmp.Diff(values, expected))
}
assert.NoError(compare("foo", []string{"key1"}))
assert.NoError(compare("bar", []string{"key2"}))
store.Update("key2", "foo,bar")
assert.NoError(compare("foo", []string{"key1", "key2"}))
assert.NoError(compare("bar", []string{"key2"}))
store.Update("key1", "foo,bar")
assert.NoError(compare("foo", []string{"key1", "key2"}))
assert.NoError(compare("bar", []string{"key1", "key2"}))
store.Add("key3", "foo,bar,baz")
assert.NoError(compare("foo", []string{"key1", "key2", "key3"}))
assert.NoError(compare("bar", []string{"key1", "key2", "key3"}))
assert.NoError(compare("baz", []string{"key3"}))
store.Update("key1", "foo")
assert.NoError(compare("foo", []string{"key1", "key2", "key3"}))
assert.NoError(compare("bar", []string{"key2", "key3"}))
assert.NoError(compare("baz", []string{"key3"}))
store.Update("key2", "bar")
assert.NoError(compare("foo", []string{"key1", "key3"}))
assert.NoError(compare("bar", []string{"key2", "key3"}))
assert.NoError(compare("baz", []string{"key3"}))
store.Delete("key1")
assert.NoError(compare("foo", []string{"key3"}))
assert.NoError(compare("bar", []string{"key2", "key3"}))
assert.NoError(compare("baz", []string{"key3"}))
store.Delete("key3")
assert.NoError(compare("foo", []string{}))
assert.NoError(compare("bar", []string{"key2"}))
assert.NoError(compare("baz", []string{}))
}
func BenchmarkIndexer(b *testing.B) {
testIndexer := "testIndexer"