Compare commits

..

16 Commits

Author SHA1 Message Date
Kubernetes Publisher
c0e3722d5c Fix Godeps.json to point to kubernetes-1.14.7 tags 2019-09-18 22:27:21 +00:00
Kubernetes Publisher
6d55c1b1f1 Merge pull request #81525 from cblecker/1.14-x/net
Update golang/x/net dependency on release-1.14

Kubernetes-commit: 8d394792b0e36316371ba90b51bfe64381e2e88a
2019-08-16 22:22:28 +00:00
Christoph Blecker
cbfe85d220 Update golang/x/net dependency
Kubernetes-commit: 4a9f1962500b3570bee33614f5d34ac5935d89fc
2019-08-16 11:49:44 -07:00
Kubernetes Publisher
26d42a5152 Merge pull request #81407 from wojtek-t/automated-cherry-pick-of-#80978-upstream-release-1.14
Manual cherry pick of #80978 upstream release 1.14

Kubernetes-commit: dfadb869149281b136c13cb6fff44877df478c05
2019-08-15 20:20:54 -07:00
wojtekt
6ffad8d5b6 Fix events test
Kubernetes-commit: 15d1365cfec5b68284f92d6cc0bcfde966b58af9
2019-08-14 08:21:22 +02:00
wojtekt
1a5d156414 Fix GetReference function
Kubernetes-commit: 6c696540471160b75c56d0c235b0ee0a6c9c8354
2019-08-05 08:37:55 +02:00
Kubernetes Publisher
571d7ec2d8 Merge pull request #79694 from tiffanyfay/automated-cherry-pick-of-#75585-#75587-upstream-release-1.14
Automated cherry pick of #75585: Updated client-go expiration cache to take in expiration #75587: Remove aws cred provider dep on cloud provider

Kubernetes-commit: ccdea031a6a610771917140380658d459437ee8e
2019-08-06 18:56:54 -07:00
tiffany jernigan
862890c1a3 Updated client-go expiration cache to take in expiration policies
Kubernetes-commit: e6174e0ab51393378955be1d0c66bde71d3edecc
2019-03-22 07:38:35 +00:00
Kubernetes Publisher
640d9f2408 sync: update godeps 2019-07-04 10:02:34 +00:00
Kubernetes Publisher
11646d1007 Merge pull request #78027 from yuchengwu/automated-cherry-pick-of-#77874-github-release-1.14
Automated cherry pick of #77874: fix CVE-2019-11244: `kubectl --http-cache=<world-accessible

Kubernetes-commit: 4ccdc8b71b2790b2853b3ac43cdda623f8b22b12
2019-05-21 19:11:37 +00:00
Kubernetes Publisher
5c0812a8fc Merge pull request #77897 from mikedanese/automated-cherry-pick-of-#77613-upstream-release-1.14
Automated cherry pick of #77613 upstream release 1.14

Kubernetes-commit: 484ab1431d8c7afb8e2cb37578c731df72840406
2019-05-21 10:08:20 -07:00
Jordan Liggitt
c042b7cfb1 honor overridden tokenfile, add InClusterConfig override tests
Kubernetes-commit: 63bad1d80c2fdd0ad4aca2f9bc7461e6c91dd981
2019-05-15 08:15:02 -04:00
Mike Danese
e51768eced BoundServiceAccountTokenVolume: fix InClusterConfig
Kubernetes-commit: 6919c6e1ab3dcd3f02bcbf3c6f106089d867090b
2019-05-14 09:29:16 -07:00
Yucheng Wu
d9b9519d37 fix CVE-2019-11244: kubectl --http-cache=<world-accessible dir> creates world-writeable cached schema files
Kubernetes-commit: 6e4df6a7f27ecadbdec06fe92d915faabee33300
2019-05-14 14:49:38 +08:00
Kubernetes Publisher
6d7835f19a Merge pull request #76199 from mvladev/automated-cherry-pick-of-#75072-upstream-release-1.14
Automated cherry pick of #75072: Check for required name parameter in dynamic client

Kubernetes-commit: 59a9c64405257d01c91cd8ac78ba57e0104516b9
2019-05-10 19:05:10 +00:00
Levi Blackstone
a7a9c94e20 Check for required name parameter in dynamic client
The Create, Delete, Get, Patch, Update and UpdateStatus
methods in the dynamic client all expect the name
parameter to be non-empty, but did not validate this
requirement, which could lead to a panic. Add explicit
checks to these methods.

Kubernetes-commit: 541b9807cd7fe037287cc0d32ab1099ee658ec24
2019-03-06 16:21:33 -07:00
15 changed files with 334 additions and 205 deletions

190
Godeps/Godeps.json generated
View File

@@ -1,7 +1,7 @@
{
"ImportPath": "k8s.io/client-go",
"GoVersion": "go1.12",
"GodepVersion": "v80",
"GodepVersion": "v80-k8s-r1",
"Packages": [
"./..."
],
@@ -192,27 +192,27 @@
},
{
"ImportPath": "golang.org/x/net/context",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/net/context/ctxhttp",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/net/http/httpguts",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/net/http2",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/net/http2/hpack",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/net/idna",
"Rev": "65e2d4e15006aab9813ff8769e768bbf4bb667a0"
"Rev": "cdfb69ac37fc6fa907650654115ebebb3aae2087"
},
{
"ImportPath": "golang.org/x/oauth2",
@@ -272,355 +272,355 @@
},
{
"ImportPath": "k8s.io/api/admissionregistration/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/apps/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/apps/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/apps/v1beta2",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/auditregistration/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/authentication/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/authentication/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/authorization/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/authorization/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/autoscaling/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/autoscaling/v2beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/autoscaling/v2beta2",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/batch/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/batch/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/batch/v2alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/certificates/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/coordination/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/coordination/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/core/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/events/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/extensions/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/imagepolicy/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/networking/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/networking/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/node/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/node/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/policy/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/rbac/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/rbac/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/rbac/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/scheduling/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/scheduling/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/scheduling/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/settings/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/storage/v1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/storage/v1alpha1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/api/storage/v1beta1",
"Rev": "40a48860b5abbba9aa891b02b32da429b08d96a0"
"Rev": "e3a6b8045b0b303430f6d0c261fd9e35be50800e"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/apitesting",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/equality",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/errors",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/naming",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "d7deff9243b165ee192f5551710ea4285dcfd615"
"Rev": "a9f1d8a9c10182d101acf19b5145c3d4e9299adb"
},
{
"ImportPath": "k8s.io/klog",

View File

@@ -172,7 +172,7 @@ func (d *CachedDiscoveryClient) getCachedFile(filename string) ([]byte, error) {
}
func (d *CachedDiscoveryClient) writeCachedFile(filename string, obj runtime.Object) error {
if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil {
if err := os.MkdirAll(filepath.Dir(filename), 0750); err != nil {
return err
}
@@ -191,7 +191,7 @@ func (d *CachedDiscoveryClient) writeCachedFile(filename string, obj runtime.Obj
return err
}
err = os.Chmod(f.Name(), 0755)
err = os.Chmod(f.Name(), 0660)
if err != nil {
return err
}

View File

@@ -19,6 +19,7 @@ package disk
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
@@ -96,6 +97,32 @@ func TestNewCachedDiscoveryClient_TTL(t *testing.T) {
assert.Equal(c.groupCalls, 2)
}
func TestNewCachedDiscoveryClient_PathPerm(t *testing.T) {
assert := assert.New(t)
d, err := ioutil.TempDir("", "")
assert.NoError(err)
os.RemoveAll(d)
defer os.RemoveAll(d)
c := fakeDiscoveryClient{}
cdc := newCachedDiscoveryClient(&c, d, 1*time.Nanosecond)
cdc.ServerGroups()
err = filepath.Walk(d, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
assert.Equal(os.FileMode(0750), info.Mode().Perm())
} else {
assert.Equal(os.FileMode(0660), info.Mode().Perm())
}
return nil
})
assert.NoError(err)
}
type fakeDiscoveryClient struct {
groupCalls int
resourceCalls int

View File

@@ -18,6 +18,7 @@ package disk
import (
"net/http"
"os"
"path/filepath"
"github.com/gregjones/httpcache"
@@ -35,6 +36,8 @@ type cacheRoundTripper struct {
// corresponding requests.
func newCacheRoundTripper(cacheDir string, rt http.RoundTripper) http.RoundTripper {
d := diskv.New(diskv.Options{
PathPerm: os.FileMode(0750),
FilePerm: os.FileMode(0660),
BasePath: cacheDir,
TempDir: filepath.Join(cacheDir, ".diskv-temp"),
})

View File

@@ -22,7 +22,10 @@ import (
"net/http"
"net/url"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
// copied from k8s.io/client-go/transport/round_trippers_test.go
@@ -93,3 +96,52 @@ func TestCacheRoundTripper(t *testing.T) {
t.Errorf("Invalid content read from cache %q", string(content))
}
}
func TestCacheRoundTripperPathPerm(t *testing.T) {
assert := assert.New(t)
rt := &testRoundTripper{}
cacheDir, err := ioutil.TempDir("", "cache-rt")
os.RemoveAll(cacheDir)
defer os.RemoveAll(cacheDir)
if err != nil {
t.Fatal(err)
}
cache := newCacheRoundTripper(cacheDir, rt)
// First call, caches the response
req := &http.Request{
Method: http.MethodGet,
URL: &url.URL{Host: "localhost"},
}
rt.Response = &http.Response{
Header: http.Header{"ETag": []string{`"123456"`}},
Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))),
StatusCode: http.StatusOK,
}
resp, err := cache.RoundTrip(req)
if err != nil {
t.Fatal(err)
}
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal(err)
}
if string(content) != "Content" {
t.Errorf(`Expected Body to be "Content", got %q`, string(content))
}
err = filepath.Walk(cacheDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
assert.Equal(os.FileMode(0750), info.Mode().Perm())
} else {
assert.Equal(os.FileMode(0660), info.Mode().Perm())
}
return nil
})
assert.NoError(err)
}

View File

@@ -17,6 +17,7 @@ limitations under the License.
package dynamic
import (
"fmt"
"io"
"k8s.io/apimachinery/pkg/api/meta"
@@ -94,6 +95,9 @@ func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, opts meta
return nil, err
}
name = accessor.GetName()
if len(name) == 0 {
return nil, fmt.Errorf("name is required")
}
}
result := c.client.client.
@@ -122,6 +126,10 @@ func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, opts meta
if err != nil {
return nil, err
}
name := accessor.GetName()
if len(name) == 0 {
return nil, fmt.Errorf("name is required")
}
outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj)
if err != nil {
return nil, err
@@ -129,7 +137,7 @@ func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, opts meta
result := c.client.client.
Put().
AbsPath(append(c.makeURLSegments(accessor.GetName()), subresources...)...).
AbsPath(append(c.makeURLSegments(name), subresources...)...).
Body(outBytes).
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
Do()
@@ -153,6 +161,10 @@ func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opt
if err != nil {
return nil, err
}
name := accessor.GetName()
if len(name) == 0 {
return nil, fmt.Errorf("name is required")
}
outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj)
if err != nil {
@@ -161,7 +173,7 @@ func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opt
result := c.client.client.
Put().
AbsPath(append(c.makeURLSegments(accessor.GetName()), "status")...).
AbsPath(append(c.makeURLSegments(name), "status")...).
Body(outBytes).
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
Do()
@@ -181,6 +193,9 @@ func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opt
}
func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error {
if len(name) == 0 {
return fmt.Errorf("name is required")
}
if opts == nil {
opts = &metav1.DeleteOptions{}
}
@@ -216,6 +231,9 @@ func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, lis
}
func (c *dynamicResourceClient) Get(name string, opts metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) {
if len(name) == 0 {
return nil, fmt.Errorf("name is required")
}
result := c.client.client.Get().AbsPath(append(c.makeURLSegments(name), subresources...)...).SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).Do()
if err := result.Error(); err != nil {
return nil, err
@@ -284,6 +302,9 @@ func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface,
}
func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*unstructured.Unstructured, error) {
if len(name) == 0 {
return nil, fmt.Errorf("name is required")
}
result := c.client.client.
Patch(pt).
AbsPath(append(c.makeURLSegments(name), subresources...)...).

View File

@@ -74,9 +74,10 @@ func (c *Config) TransportConfig() (*transport.Config, error) {
KeyFile: c.KeyFile,
KeyData: c.KeyData,
},
Username: c.Username,
Password: c.Password,
BearerToken: c.BearerToken,
Username: c.Username,
Password: c.Password,
BearerToken: c.BearerToken,
BearerTokenFile: c.BearerTokenFile,
Impersonate: transport.ImpersonationConfig{
UserName: c.Impersonate.UserName,
Groups: c.Impersonate.Groups,

View File

@@ -48,7 +48,7 @@ type ExpirationCache struct {
// ExpirationPolicy dictates when an object expires. Currently only abstracted out
// so unittests don't rely on the system clock.
type ExpirationPolicy interface {
IsExpired(obj *timestampedEntry) bool
IsExpired(obj *TimestampedEntry) bool
}
// TTLPolicy implements a ttl based ExpirationPolicy.
@@ -63,26 +63,29 @@ type TTLPolicy struct {
// IsExpired returns true if the given object is older than the ttl, or it can't
// determine its age.
func (p *TTLPolicy) IsExpired(obj *timestampedEntry) bool {
return p.Ttl > 0 && p.Clock.Since(obj.timestamp) > p.Ttl
func (p *TTLPolicy) IsExpired(obj *TimestampedEntry) bool {
return p.Ttl > 0 && p.Clock.Since(obj.Timestamp) > p.Ttl
}
// timestampedEntry is the only type allowed in a ExpirationCache.
type timestampedEntry struct {
obj interface{}
timestamp time.Time
// TimestampedEntry is the only type allowed in a ExpirationCache.
// Keep in mind that it is not safe to share timestamps between computers.
// Behavior may be inconsistent if you get a timestamp from the API Server and
// use it on the client machine as part of your ExpirationCache.
type TimestampedEntry struct {
Obj interface{}
Timestamp time.Time
}
// getTimestampedEntry returns the timestampedEntry stored under the given key.
func (c *ExpirationCache) getTimestampedEntry(key string) (*timestampedEntry, bool) {
// getTimestampedEntry returns the TimestampedEntry stored under the given key.
func (c *ExpirationCache) getTimestampedEntry(key string) (*TimestampedEntry, bool) {
item, _ := c.cacheStorage.Get(key)
if tsEntry, ok := item.(*timestampedEntry); ok {
if tsEntry, ok := item.(*TimestampedEntry); ok {
return tsEntry, true
}
return nil, false
}
// getOrExpire retrieves the object from the timestampedEntry if and only if it hasn't
// getOrExpire retrieves the object from the TimestampedEntry if and only if it hasn't
// already expired. It holds a write lock across deletion.
func (c *ExpirationCache) getOrExpire(key string) (interface{}, bool) {
// Prevent all inserts from the time we deem an item as "expired" to when we
@@ -95,11 +98,11 @@ func (c *ExpirationCache) getOrExpire(key string) (interface{}, bool) {
return nil, false
}
if c.expirationPolicy.IsExpired(timestampedItem) {
klog.V(4).Infof("Entry %v: %+v has expired", key, timestampedItem.obj)
klog.V(4).Infof("Entry %v: %+v has expired", key, timestampedItem.Obj)
c.cacheStorage.Delete(key)
return nil, false
}
return timestampedItem.obj, true
return timestampedItem.Obj, true
}
// GetByKey returns the item stored under the key, or sets exists=false.
@@ -126,7 +129,7 @@ func (c *ExpirationCache) List() []interface{} {
list := make([]interface{}, 0, len(items))
for _, item := range items {
obj := item.(*timestampedEntry).obj
obj := item.(*TimestampedEntry).Obj
if key, err := c.keyFunc(obj); err != nil {
list = append(list, obj)
} else if obj, exists := c.getOrExpire(key); exists {
@@ -151,7 +154,7 @@ func (c *ExpirationCache) Add(obj interface{}) error {
c.expirationLock.Lock()
defer c.expirationLock.Unlock()
c.cacheStorage.Add(key, &timestampedEntry{obj, c.clock.Now()})
c.cacheStorage.Add(key, &TimestampedEntry{obj, c.clock.Now()})
return nil
}
@@ -184,7 +187,7 @@ func (c *ExpirationCache) Replace(list []interface{}, resourceVersion string) er
if err != nil {
return KeyError{item, err}
}
items[key] = &timestampedEntry{item, ts}
items[key] = &TimestampedEntry{item, ts}
}
c.expirationLock.Lock()
defer c.expirationLock.Unlock()
@@ -199,10 +202,15 @@ func (c *ExpirationCache) Resync() error {
// NewTTLStore creates and returns a ExpirationCache with a TTLPolicy
func NewTTLStore(keyFunc KeyFunc, ttl time.Duration) Store {
return NewExpirationStore(keyFunc, &TTLPolicy{ttl, clock.RealClock{}})
}
// NewExpirationStore creates and returns a ExpirationCache for a given policy
func NewExpirationStore(keyFunc KeyFunc, expirationPolicy ExpirationPolicy) Store {
return &ExpirationCache{
cacheStorage: NewThreadSafeStore(Indexers{}, Indices{}),
keyFunc: keyFunc,
clock: clock.RealClock{},
expirationPolicy: &TTLPolicy{ttl, clock.RealClock{}},
expirationPolicy: expirationPolicy,
}
}

View File

@@ -38,7 +38,7 @@ type FakeExpirationPolicy struct {
RetrieveKeyFunc KeyFunc
}
func (p *FakeExpirationPolicy) IsExpired(obj *timestampedEntry) bool {
func (p *FakeExpirationPolicy) IsExpired(obj *TimestampedEntry) bool {
key, _ := p.RetrieveKeyFunc(obj)
return !p.NeverExpire.Has(key)
}

View File

@@ -34,7 +34,7 @@ func TestTTLExpirationBasic(t *testing.T) {
&FakeExpirationPolicy{
NeverExpire: sets.NewString(),
RetrieveKeyFunc: func(obj interface{}) (string, error) {
return obj.(*timestampedEntry).obj.(testStoreObject).id, nil
return obj.(*TimestampedEntry).Obj.(testStoreObject).id, nil
},
},
clock.RealClock{},
@@ -67,7 +67,7 @@ func TestReAddExpiredItem(t *testing.T) {
exp := &FakeExpirationPolicy{
NeverExpire: sets.NewString(),
RetrieveKeyFunc: func(obj interface{}) (string, error) {
return obj.(*timestampedEntry).obj.(testStoreObject).id, nil
return obj.(*TimestampedEntry).Obj.(testStoreObject).id, nil
},
}
ttlStore := NewFakeExpirationStore(
@@ -130,7 +130,7 @@ func TestTTLList(t *testing.T) {
&FakeExpirationPolicy{
NeverExpire: sets.NewString(testObjs[1].id),
RetrieveKeyFunc: func(obj interface{}) (string, error) {
return obj.(*timestampedEntry).obj.(testStoreObject).id, nil
return obj.(*TimestampedEntry).Obj.(testStoreObject).id, nil
},
},
clock.RealClock{},
@@ -168,15 +168,15 @@ func TestTTLPolicy(t *testing.T) {
expiredTime := fakeTime.Add(-(ttl + 1))
policy := TTLPolicy{ttl, clock.NewFakeClock(fakeTime)}
fakeTimestampedEntry := &timestampedEntry{obj: struct{}{}, timestamp: exactlyOnTTL}
fakeTimestampedEntry := &TimestampedEntry{Obj: struct{}{}, Timestamp: exactlyOnTTL}
if policy.IsExpired(fakeTimestampedEntry) {
t.Errorf("TTL cache should not expire entries exactly on ttl")
}
fakeTimestampedEntry.timestamp = fakeTime
fakeTimestampedEntry.Timestamp = fakeTime
if policy.IsExpired(fakeTimestampedEntry) {
t.Errorf("TTL Cache should not expire entries before ttl")
}
fakeTimestampedEntry.timestamp = expiredTime
fakeTimestampedEntry.Timestamp = expiredTime
if !policy.IsExpired(fakeTimestampedEntry) {
t.Errorf("TTL Cache should expire entries older than ttl")
}

View File

@@ -228,6 +228,7 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI
// blindly overwrite existing values based on precedence
if len(configAuthInfo.Token) > 0 {
mergedConfig.BearerToken = configAuthInfo.Token
mergedConfig.BearerTokenFile = configAuthInfo.TokenFile
} else if len(configAuthInfo.TokenFile) > 0 {
tokenBytes, err := ioutil.ReadFile(configAuthInfo.TokenFile)
if err != nil {
@@ -499,8 +500,9 @@ func (config *inClusterClientConfig) ClientConfig() (*restclient.Config, error)
if server := config.overrides.ClusterInfo.Server; len(server) > 0 {
icc.Host = server
}
if token := config.overrides.AuthInfo.Token; len(token) > 0 {
icc.BearerToken = token
if len(config.overrides.AuthInfo.Token) > 0 || len(config.overrides.AuthInfo.TokenFile) > 0 {
icc.BearerToken = config.overrides.AuthInfo.Token
icc.BearerTokenFile = config.overrides.AuthInfo.TokenFile
}
if certificateAuthorityFile := config.overrides.ClusterInfo.CertificateAuthority; len(certificateAuthorityFile) > 0 {
icc.TLSClientConfig.CAFile = certificateAuthorityFile

View File

@@ -548,6 +548,30 @@ func TestInClusterClientConfigPrecedence(t *testing.T) {
},
},
},
{
overrides: &ConfigOverrides{
ClusterInfo: clientcmdapi.Cluster{
Server: "https://host-from-overrides.com",
CertificateAuthority: "/path/to/ca-from-overrides.crt",
},
AuthInfo: clientcmdapi.AuthInfo{
Token: "token-from-override",
TokenFile: "tokenfile-from-override",
},
},
},
{
overrides: &ConfigOverrides{
ClusterInfo: clientcmdapi.Cluster{
Server: "https://host-from-overrides.com",
CertificateAuthority: "/path/to/ca-from-overrides.crt",
},
AuthInfo: clientcmdapi.AuthInfo{
Token: "",
TokenFile: "tokenfile-from-override",
},
},
},
{
overrides: &ConfigOverrides{},
},
@@ -556,13 +580,15 @@ func TestInClusterClientConfigPrecedence(t *testing.T) {
for _, tc := range tt {
expectedServer := "https://host-from-cluster.com"
expectedToken := "token-from-cluster"
expectedTokenFile := "tokenfile-from-cluster"
expectedCAFile := "/path/to/ca-from-cluster.crt"
icc := &inClusterClientConfig{
inClusterConfigProvider: func() (*restclient.Config, error) {
return &restclient.Config{
Host: expectedServer,
BearerToken: expectedToken,
Host: expectedServer,
BearerToken: expectedToken,
BearerTokenFile: expectedTokenFile,
TLSClientConfig: restclient.TLSClientConfig{
CAFile: expectedCAFile,
},
@@ -579,8 +605,9 @@ func TestInClusterClientConfigPrecedence(t *testing.T) {
if overridenServer := tc.overrides.ClusterInfo.Server; len(overridenServer) > 0 {
expectedServer = overridenServer
}
if overridenToken := tc.overrides.AuthInfo.Token; len(overridenToken) > 0 {
expectedToken = overridenToken
if len(tc.overrides.AuthInfo.Token) > 0 || len(tc.overrides.AuthInfo.TokenFile) > 0 {
expectedToken = tc.overrides.AuthInfo.Token
expectedTokenFile = tc.overrides.AuthInfo.TokenFile
}
if overridenCAFile := tc.overrides.ClusterInfo.CertificateAuthority; len(overridenCAFile) > 0 {
expectedCAFile = overridenCAFile
@@ -592,6 +619,9 @@ func TestInClusterClientConfigPrecedence(t *testing.T) {
if clientConfig.BearerToken != expectedToken {
t.Errorf("Expected token %v, got %v", expectedToken, clientConfig.BearerToken)
}
if clientConfig.BearerTokenFile != expectedTokenFile {
t.Errorf("Expected tokenfile %v, got %v", expectedTokenFile, clientConfig.BearerTokenFile)
}
if clientConfig.TLSClientConfig.CAFile != expectedCAFile {
t.Errorf("Expected Certificate Authority %v, got %v", expectedCAFile, clientConfig.TLSClientConfig.CAFile)
}

View File

@@ -153,7 +153,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -162,7 +162,7 @@ func TestEventf(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -181,7 +181,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
},
Reason: "Killed",
Message: "some other verbose message: 1",
@@ -189,7 +189,7 @@ func TestEventf(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`,
expectUpdate: false,
},
{
@@ -208,7 +208,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -217,7 +217,7 @@ func TestEventf(t *testing.T) {
Count: 2,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: true,
},
{
@@ -236,7 +236,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Started",
@@ -245,7 +245,7 @@ func TestEventf(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -264,7 +264,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -273,7 +273,7 @@ func TestEventf(t *testing.T) {
Count: 3,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: true,
},
{
@@ -292,7 +292,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Stopped",
@@ -301,7 +301,7 @@ func TestEventf(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -320,7 +320,7 @@ func TestEventf(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Stopped",
@@ -329,7 +329,7 @@ func TestEventf(t *testing.T) {
Count: 2,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectUpdate: true,
},
}
@@ -509,7 +509,7 @@ func TestLotsOfEvents(t *testing.T) {
Name: fmt.Sprintf("foo-%v", i),
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
}
// we need to vary the reason to prevent aggregation
go recorder.Eventf(ref, v1.EventTypeNormal, "Reason-"+string(i), strconv.Itoa(i))
@@ -567,7 +567,7 @@ func TestEventfNoNamespace(t *testing.T) {
Name: "foo",
Namespace: "",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -576,7 +576,7 @@ func TestEventfNoNamespace(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: false,
},
}
@@ -677,7 +677,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -686,7 +686,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -705,7 +705,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
},
Reason: "Killed",
Message: "some other verbose message: 1",
@@ -713,7 +713,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`,
expectUpdate: false,
},
{
@@ -732,7 +732,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -741,7 +741,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 2,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: true,
},
{
@@ -760,7 +760,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Started",
@@ -769,7 +769,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -788,7 +788,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "bar",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[2]",
},
Reason: "Started",
@@ -797,7 +797,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 3,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`,
expectUpdate: true,
},
{
@@ -816,7 +816,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Stopped",
@@ -825,7 +825,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 1,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectUpdate: false,
},
{
@@ -844,7 +844,7 @@ func TestMultiSinkCache(t *testing.T) {
Name: "foo",
Namespace: "baz",
UID: "differentUid",
APIVersion: "version",
APIVersion: "v1",
FieldPath: "spec.containers[3]",
},
Reason: "Stopped",
@@ -853,7 +853,7 @@ func TestMultiSinkCache(t *testing.T) {
Count: 2,
Type: v1.EventTypeNormal,
},
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"v1", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`,
expectUpdate: true,
},
}

View File

@@ -19,8 +19,6 @@ package reference
import (
"errors"
"fmt"
"net/url"
"strings"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
@@ -30,8 +28,7 @@ import (
var (
// Errors that could be returned by GetReference.
ErrNilObject = errors.New("can't reference a nil object")
ErrNoSelfLink = errors.New("selfLink was empty, can't make reference")
ErrNilObject = errors.New("can't reference a nil object")
)
// GetReference returns an ObjectReference which refers to the given
@@ -47,20 +44,6 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen
return ref, nil
}
gvk := obj.GetObjectKind().GroupVersionKind()
// if the object referenced is actually persisted, we can just get kind from meta
// if we are building an object reference to something not yet persisted, we should fallback to scheme
kind := gvk.Kind
if len(kind) == 0 {
// TODO: this is wrong
gvks, _, err := scheme.ObjectKinds(obj)
if err != nil {
return nil, err
}
kind = gvks[0].Kind
}
// An object that implements only List has enough metadata to build a reference
var listMeta metav1.Common
objectMeta, err := meta.Accessor(obj)
@@ -73,29 +56,29 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen
listMeta = objectMeta
}
// if the object referenced is actually persisted, we can also get version from meta
version := gvk.GroupVersion().String()
if len(version) == 0 {
selfLink := listMeta.GetSelfLink()
if len(selfLink) == 0 {
return nil, ErrNoSelfLink
}
selfLinkUrl, err := url.Parse(selfLink)
gvk := obj.GetObjectKind().GroupVersionKind()
// If object meta doesn't contain data about kind and/or version,
// we are falling back to scheme.
//
// TODO: This doesn't work for CRDs, which are not registered in scheme.
if gvk.Empty() {
gvks, _, err := scheme.ObjectKinds(obj)
if err != nil {
return nil, err
}
// example paths: /<prefix>/<version>/*
parts := strings.Split(selfLinkUrl.Path, "/")
if len(parts) < 4 {
return nil, fmt.Errorf("unexpected self link format: '%v'; got version '%v'", selfLink, version)
}
if parts[1] == "api" {
version = parts[2]
} else {
version = parts[2] + "/" + parts[3]
if len(gvks) == 0 || gvks[0].Empty() {
return nil, fmt.Errorf("unexpected gvks registered for object %T: %v", obj, gvks)
}
// TODO: The same object can be registered for multiple group versions
// (although in practise this doesn't seem to be used).
// In such case, the version set may not be correct.
gvk = gvks[0]
}
kind := gvk.Kind
version := gvk.GroupVersion().String()
// only has list metadata
if objectMeta == nil {
return &v1.ObjectReference{

View File

@@ -37,29 +37,31 @@ func TestGetReferenceRefVersion(t *testing.T) {
tests := []struct {
name string
input *TestRuntimeObj
groupVersion schema.GroupVersion
expectedRefVersion string
}{
{
name: "api from selflink",
name: "v1 GV from scheme",
input: &TestRuntimeObj{
ObjectMeta: metav1.ObjectMeta{SelfLink: "/api/v1/namespaces"},
ObjectMeta: metav1.ObjectMeta{SelfLink: "/bad-selflink/unused"},
},
groupVersion: schema.GroupVersion{Group: "", Version: "v1"},
expectedRefVersion: "v1",
},
{
name: "foo.group/v3 from selflink",
name: "foo.group/v3 GV from scheme",
input: &TestRuntimeObj{
ObjectMeta: metav1.ObjectMeta{SelfLink: "/apis/foo.group/v3/namespaces"},
ObjectMeta: metav1.ObjectMeta{SelfLink: "/bad-selflink/unused"},
},
groupVersion: schema.GroupVersion{Group: "foo.group", Version: "v3"},
expectedRefVersion: "foo.group/v3",
},
}
scheme := runtime.NewScheme()
scheme.AddKnownTypes(schema.GroupVersion{Group: "this", Version: "is ignored"}, &TestRuntimeObj{})
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
scheme := runtime.NewScheme()
scheme.AddKnownTypes(test.groupVersion, &TestRuntimeObj{})
ref, err := GetReference(scheme, test.input)
if err != nil {
t.Fatal(err)