Merge pull request #48859 from victorgp/master

Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Support for custom tls cipher suites in api server and kubelet

**What this PR does / why we need it**:
This pull request aims to solve the problem of users not able to set custom cipher suites in the api server.
Several users have requested this given that some default ciphers are vulnerable.
There is a discussion in #41038 of how to implement this. The options are:
- Setting a fixed list of ciphers, but users will have different requirements so a fixed list would be problematic.
- Letting the user set them by parameter, this requires adding a new parameter that could be pretty long with the list of all the ciphers.

I implemented the second option, if the ciphers are not passed by parameter, the Go default ones will be used (same behavior as now).

**Which issue this PR fixes**
fixes #41038

**Special notes for your reviewer**:
The ciphers in Go tls config are constants and the ones passed by parameters are a comma-separated list. I needed to create the `type CipherSuitesFlag` to support that conversion/mapping, because i couldn't find any way to do this type of reflection in Go.
If you think there is another way to implement this, let me know.

If you want to test it out, this is a ciphers combination i tested without the weak ones:

```
TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
```

If this is merged i will implement the same for the Kubelet.

**Release note**:
```release-note
kube-apiserver and kubelet now support customizing TLS ciphers via a `--tls-cipher-suites` flag
```

Kubernetes-commit: b7100f1ee7231617891a100dd34b3490a1f578e4
This commit is contained in:
Kubernetes Publisher 2018-01-17 17:46:40 -08:00
commit 4abd5d2816
5 changed files with 326 additions and 144 deletions

288
Godeps/Godeps.json generated
View File

@ -1200,579 +1200,579 @@
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery", "ImportPath": "k8s.io/client-go/discovery",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/discovery/fake", "ImportPath": "k8s.io/client-go/discovery/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers", "ImportPath": "k8s.io/client-go/informers",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration", "ImportPath": "k8s.io/client-go/informers/admissionregistration",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps", "ImportPath": "k8s.io/client-go/informers/apps",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1", "ImportPath": "k8s.io/client-go/informers/apps/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta1", "ImportPath": "k8s.io/client-go/informers/apps/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/apps/v1beta2", "ImportPath": "k8s.io/client-go/informers/apps/v1beta2",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling", "ImportPath": "k8s.io/client-go/informers/autoscaling",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch", "ImportPath": "k8s.io/client-go/informers/batch",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1", "ImportPath": "k8s.io/client-go/informers/batch/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v1beta1", "ImportPath": "k8s.io/client-go/informers/batch/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates", "ImportPath": "k8s.io/client-go/informers/certificates",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core", "ImportPath": "k8s.io/client-go/informers/core",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/core/v1", "ImportPath": "k8s.io/client-go/informers/core/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events", "ImportPath": "k8s.io/client-go/informers/events",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/events/v1beta1", "ImportPath": "k8s.io/client-go/informers/events/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions", "ImportPath": "k8s.io/client-go/informers/extensions",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/internalinterfaces", "ImportPath": "k8s.io/client-go/informers/internalinterfaces",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking", "ImportPath": "k8s.io/client-go/informers/networking",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/networking/v1", "ImportPath": "k8s.io/client-go/informers/networking/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy", "ImportPath": "k8s.io/client-go/informers/policy",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/policy/v1beta1", "ImportPath": "k8s.io/client-go/informers/policy/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac", "ImportPath": "k8s.io/client-go/informers/rbac",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1", "ImportPath": "k8s.io/client-go/informers/rbac/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling", "ImportPath": "k8s.io/client-go/informers/scheduling",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings", "ImportPath": "k8s.io/client-go/informers/settings",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage", "ImportPath": "k8s.io/client-go/informers/storage",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1", "ImportPath": "k8s.io/client-go/informers/storage/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/informers/storage/v1beta1", "ImportPath": "k8s.io/client-go/informers/storage/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes", "ImportPath": "k8s.io/client-go/kubernetes",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/fake", "ImportPath": "k8s.io/client-go/kubernetes/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/scheme", "ImportPath": "k8s.io/client-go/kubernetes/scheme",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake", "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1", "ImportPath": "k8s.io/client-go/listers/apps/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta1", "ImportPath": "k8s.io/client-go/listers/apps/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/apps/v1beta2", "ImportPath": "k8s.io/client-go/listers/apps/v1beta2",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1", "ImportPath": "k8s.io/client-go/listers/batch/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v1beta1", "ImportPath": "k8s.io/client-go/listers/batch/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/core/v1", "ImportPath": "k8s.io/client-go/listers/core/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/events/v1beta1", "ImportPath": "k8s.io/client-go/listers/events/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/networking/v1", "ImportPath": "k8s.io/client-go/listers/networking/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/policy/v1beta1", "ImportPath": "k8s.io/client-go/listers/policy/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1", "ImportPath": "k8s.io/client-go/listers/rbac/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1", "ImportPath": "k8s.io/client-go/listers/storage/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/listers/storage/v1beta1", "ImportPath": "k8s.io/client-go/listers/storage/v1beta1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/pkg/version", "ImportPath": "k8s.io/client-go/pkg/version",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest", "ImportPath": "k8s.io/client-go/rest",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/rest/watch", "ImportPath": "k8s.io/client-go/rest/watch",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/testing", "ImportPath": "k8s.io/client-go/testing",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/auth", "ImportPath": "k8s.io/client-go/tools/auth",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/cache", "ImportPath": "k8s.io/client-go/tools/cache",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd", "ImportPath": "k8s.io/client-go/tools/clientcmd",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api", "ImportPath": "k8s.io/client-go/tools/clientcmd/api",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/metrics", "ImportPath": "k8s.io/client-go/tools/metrics",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/pager", "ImportPath": "k8s.io/client-go/tools/pager",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/tools/reference", "ImportPath": "k8s.io/client-go/tools/reference",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/transport", "ImportPath": "k8s.io/client-go/transport",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/buffer", "ImportPath": "k8s.io/client-go/util/buffer",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/cert", "ImportPath": "k8s.io/client-go/util/cert",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/flowcontrol", "ImportPath": "k8s.io/client-go/util/flowcontrol",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/homedir", "ImportPath": "k8s.io/client-go/util/homedir",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/client-go/util/integer", "ImportPath": "k8s.io/client-go/util/integer",
"Rev": "ce9bf2bd6c56abe0d5a993b6ac21accead8de379" "Rev": "da710ccb08aa4a9885c7b01556e5b8c122681bb8"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",

View File

@ -51,6 +51,9 @@ type SecureServingOptions struct {
ServerCert GeneratableKeyCert ServerCert GeneratableKeyCert
// SNICertKeys are named CertKeys for serving secure traffic with SNI support. // SNICertKeys are named CertKeys for serving secure traffic with SNI support.
SNICertKeys []utilflag.NamedCertKey SNICertKeys []utilflag.NamedCertKey
// CipherSuites is the list of allowed cipher suites for the server.
// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
CipherSuites []string
} }
type CertKey struct { type CertKey struct {
@ -134,6 +137,11 @@ func (s *SecureServingOptions) AddFlags(fs *pflag.FlagSet) {
"Controllers. This must be a valid PEM-encoded CA bundle. Altneratively, the certificate authority "+ "Controllers. This must be a valid PEM-encoded CA bundle. Altneratively, the certificate authority "+
"can be appended to the certificate provided by --tls-cert-file.") "can be appended to the certificate provided by --tls-cert-file.")
fs.StringSliceVar(&s.CipherSuites, "tls-cipher-suites", s.CipherSuites,
"Comma-separated list of cipher suites for the server. "+
"Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants). "+
"If omitted, the default Go cipher suites will be used")
fs.Var(utilflag.NewNamedCertKeyArray(&s.SNICertKeys), "tls-sni-cert-key", ""+ fs.Var(utilflag.NewNamedCertKeyArray(&s.SNICertKeys), "tls-sni-cert-key", ""+
"A pair of x509 certificate and private key file paths, optionally suffixed with a list of "+ "A pair of x509 certificate and private key file paths, optionally suffixed with a list of "+
"domain patterns which are fully qualified domain names, possibly with prefixed wildcard "+ "domain patterns which are fully qualified domain names, possibly with prefixed wildcard "+
@ -233,6 +241,14 @@ func (s *SecureServingOptions) applyServingInfoTo(c *server.Config) error {
} }
} }
if len(s.CipherSuites) != 0 {
cipherSuites, err := utilflag.TLSCipherSuites(s.CipherSuites)
if err != nil {
return err
}
secureServingInfo.CipherSuites = cipherSuites
}
// load SNI certs // load SNI certs
namedTLSCerts := make([]server.NamedTLSCert, 0, len(s.SNICertKeys)) namedTLSCerts := make([]server.NamedTLSCert, 0, len(s.SNICertKeys))
for _, nck := range s.SNICertKeys { for _, nck := range s.SNICertKeys {

View File

@ -9,6 +9,7 @@ load(
go_test( go_test(
name = "go_default_test", name = "go_default_test",
srcs = [ srcs = [
"ciphersuites_flag_test.go",
"colon_separated_multimap_string_string_test.go", "colon_separated_multimap_string_string_test.go",
"langle_separated_map_string_string_test.go", "langle_separated_map_string_string_test.go",
"map_string_bool_test.go", "map_string_bool_test.go",
@ -23,6 +24,7 @@ go_test(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"ciphersuites_flag.go",
"colon_separated_multimap_string_string.go", "colon_separated_multimap_string_string.go",
"configuration_map.go", "configuration_map.go",
"flags.go", "flags.go",

View File

@ -0,0 +1,64 @@
/*
Copyright 2017 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 flag
import (
"crypto/tls"
"fmt"
)
// ciphers maps strings into tls package cipher constants in
// https://golang.org/pkg/crypto/tls/#pkg-constants
var ciphers = map[string]uint16{
"TLS_RSA_WITH_RC4_128_SHA": tls.TLS_RSA_WITH_RC4_128_SHA,
"TLS_RSA_WITH_3DES_EDE_CBC_SHA": tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
"TLS_RSA_WITH_AES_128_CBC_SHA": tls.TLS_RSA_WITH_AES_128_CBC_SHA,
"TLS_RSA_WITH_AES_256_CBC_SHA": tls.TLS_RSA_WITH_AES_256_CBC_SHA,
"TLS_RSA_WITH_AES_128_CBC_SHA256": tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
"TLS_RSA_WITH_AES_128_GCM_SHA256": tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
"TLS_RSA_WITH_AES_256_GCM_SHA384": tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
"TLS_ECDHE_RSA_WITH_RC4_128_SHA": tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305": tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305": tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
}
func TLSCipherSuites(cipherNames []string) ([]uint16, error) {
if len(cipherNames) == 0 {
return nil, nil
}
ciphersIntSlice := make([]uint16, 0)
for _, cipher := range cipherNames {
intValue, ok := ciphers[cipher]
if !ok {
return nil, fmt.Errorf("Cipher suite %s not supported or doesn't exist", cipher)
}
ciphersIntSlice = append(ciphersIntSlice, intValue)
}
return ciphersIntSlice, nil
}

View File

@ -0,0 +1,100 @@
/*
Copyright 2017 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 flag
import (
"crypto/tls"
"fmt"
"go/importer"
"reflect"
"strings"
"testing"
)
func TestStrToUInt16(t *testing.T) {
tests := []struct {
flag []string
expected []uint16
expected_error bool
}{
{
// Happy case
flag: []string{"TLS_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"},
expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_RSA_WITH_AES_128_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
expected_error: false,
},
{
// One flag only
flag: []string{"TLS_RSA_WITH_RC4_128_SHA"},
expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA},
expected_error: false,
},
{
// Empty flag
flag: []string{},
expected: nil,
expected_error: false,
},
{
// Duplicated flag
flag: []string{"TLS_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_RC4_128_SHA"},
expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_RSA_WITH_AES_128_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, tls.TLS_RSA_WITH_RC4_128_SHA},
expected_error: false,
},
{
// Invalid flag
flag: []string{"foo"},
expected: nil,
expected_error: true,
},
}
for i, test := range tests {
uIntFlags, err := TLSCipherSuites(test.flag)
if reflect.DeepEqual(uIntFlags, test.expected) == false {
t.Errorf("%d: expected %+v, got %+v", i, test.expected, uIntFlags)
}
if test.expected_error && err == nil {
t.Errorf("%d: expecting error, got %+v", i, err)
}
}
}
func TestConstantMaps(t *testing.T) {
pkg, err := importer.Default().Import("crypto/tls")
if err != nil {
fmt.Printf("error: %s\n", err.Error())
return
}
discoveredCiphers := map[string]bool{}
for _, declName := range pkg.Scope().Names() {
if strings.HasPrefix(declName, "TLS_RSA_") || strings.HasPrefix(declName, "TLS_ECDHE_") {
discoveredCiphers[declName] = true
}
}
for k := range discoveredCiphers {
if _, ok := ciphers[k]; !ok {
t.Errorf("discovered cipher tls.%s not in ciphers map", k)
}
}
for k := range ciphers {
if _, ok := discoveredCiphers[k]; !ok {
t.Errorf("ciphers map has %s not in tls package", k)
}
}
}