Update go dependencies
This commit is contained in:
parent
a858c549d9
commit
f3bde94d68
643 changed files with 14296 additions and 19354 deletions
584
vendor/k8s.io/kubernetes/CHANGELOG-1.2.md
generated
vendored
584
vendor/k8s.io/kubernetes/CHANGELOG-1.2.md
generated
vendored
|
|
@ -1,584 +0,0 @@
|
|||
<!-- BEGIN MUNGE: GENERATED_TOC -->
|
||||
- [v1.2.7](#v127)
|
||||
- [Downloads for v1.2.7](#downloads-for-v127)
|
||||
- [Client Binaries](#client-binaries)
|
||||
- [Server Binaries](#server-binaries)
|
||||
- [Changelog since v1.2.6](#changelog-since-v126)
|
||||
- [Other notable changes](#other-notable-changes)
|
||||
- [v1.2.6](#v126)
|
||||
- [Downloads for v1.2.6](#downloads-for-v126)
|
||||
- [Changelog since v1.2.5](#changelog-since-v125)
|
||||
- [Other notable changes](#other-notable-changes-1)
|
||||
- [v1.2.5](#v125)
|
||||
- [Downloads for v1.2.5](#downloads-for-v125)
|
||||
- [Changes since v1.2.4](#changes-since-v124)
|
||||
- [Other notable changes](#other-notable-changes-2)
|
||||
- [v1.2.4](#v124)
|
||||
- [Downloads for v1.2.4](#downloads-for-v124)
|
||||
- [Changes since v1.2.3](#changes-since-v123)
|
||||
- [Other notable changes](#other-notable-changes-3)
|
||||
- [v1.2.3](#v123)
|
||||
- [Downloads for v1.2.3](#downloads-for-v123)
|
||||
- [Changes since v1.2.2](#changes-since-v122)
|
||||
- [Action Required](#action-required)
|
||||
- [Other notable changes](#other-notable-changes-4)
|
||||
- [v1.2.2](#v122)
|
||||
- [Downloads for v1.2.2](#downloads-for-v122)
|
||||
- [Changes since v1.2.1](#changes-since-v121)
|
||||
- [Other notable changes](#other-notable-changes-5)
|
||||
- [v1.2.1](#v121)
|
||||
- [Downloads for v1.2.1](#downloads-for-v121)
|
||||
- [Changes since v1.2.0](#changes-since-v120)
|
||||
- [Other notable changes](#other-notable-changes-6)
|
||||
- [v1.2.0](#v120)
|
||||
- [Downloads for v1.2.0](#downloads-for-v120)
|
||||
- [Changes since v1.1.1](#changes-since-v111)
|
||||
- [Major Themes](#major-themes)
|
||||
- [Other notable improvements](#other-notable-improvements)
|
||||
- [Experimental Features](#experimental-features)
|
||||
- [Action required](#action-required-1)
|
||||
- [Known Issues](#known-issues)
|
||||
- [Docker Known Issues](#docker-known-issues)
|
||||
- [1.9.1](#191)
|
||||
- [Provider-specific Notes](#provider-specific-notes)
|
||||
- [Various](#various)
|
||||
- [AWS](#aws)
|
||||
- [GCE](#gce)
|
||||
<!-- END MUNGE: GENERATED_TOC -->
|
||||
|
||||
<!-- NEW RELEASE NOTES ENTRY -->
|
||||
|
||||
|
||||
# v1.2.7
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.7
|
||||
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes.tar.gz) | `53db157923c17fa7a0addb3e4dfe7d1b9194b9266a87d371a251d5bb790a1832`
|
||||
[kubernetes-src.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-src.tar.gz) | `e6e46831706743d8263581d0575507cf5ffc265096d22e5e84cf1c3ae925db5e`
|
||||
|
||||
### Client Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-client-darwin-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-darwin-386.tar.gz) | `8418767e45c62c2ef5f9b4479ed02af64e190ce07dcbafa1920e93e71f419c55`
|
||||
[kubernetes-client-darwin-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-darwin-amd64.tar.gz) | `41d742c2c55e7686311978eaaddee3844b990a0fe49fa8597158bcb0ee4c05c9`
|
||||
[kubernetes-client-linux-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-linux-386.tar.gz) | `619e0a450cddf10ed1d42ed1d6330d41a75b9c1e00eb654cbe4b0422cd6099c5`
|
||||
[kubernetes-client-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-linux-amd64.tar.gz) | `9a5fcd87514b88eb25173e574aef5b5343816c07ab5947d06787c9f12c40f54a`
|
||||
[kubernetes-client-linux-arm.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-linux-arm.tar.gz) | `fd6e39b4a56e03448382825f27f4f30a2e981a8d20f4a8cedbd084bbb4577d42`
|
||||
[kubernetes-client-windows-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-windows-386.tar.gz) | `862625cb3d9445cff1b09e4ebcdb60dd93b5b2dc34bb6022d2eeed7c8d8bc5d8`
|
||||
[kubernetes-client-windows-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-client-windows-amd64.tar.gz) | `054337e41187e39950de93e4670bc78a95b6901cc2f95c50ff437d9825ae94c5`
|
||||
|
||||
### Server Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-server-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-server-linux-amd64.tar.gz) | `fef041e9cbe5bcf8fd708f81ee2e2783429af1ab9cfb151d645ef9be96e19b73`
|
||||
[kubernetes-server-linux-arm.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.7/kubernetes-server-linux-arm.tar.gz) | `ce02d7bcd75c31db4f7b9922c19ea2a3312b0ba579b0dcd96b279b661eca18a8`
|
||||
|
||||
## Changelog since v1.2.6
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Test x509 intermediates correctly ([#34524](https://github.com/kubernetes/kubernetes/pull/34524), [@liggitt](https://github.com/liggitt))
|
||||
|
||||
|
||||
|
||||
# v1.2.6
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.6
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.6/kubernetes.tar.gz) | `50023455d00af52c41a7158b4bd117b2dfd4a100` | `cf0411bcb620eb13b08b93578efffc43`
|
||||
|
||||
## Changelog since v1.2.5
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Fix watch cache filtering ([#28967](https://github.com/kubernetes/kubernetes/pull/28967), [@liggitt](https://github.com/liggitt))
|
||||
* Fix problems with container restarts and flocker ([#25874](https://github.com/kubernetes/kubernetes/pull/25874), [@simonswine](https://github.com/simonswine))
|
||||
|
||||
|
||||
|
||||
# v1.2.5
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.5
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.5/kubernetes.tar.gz) | `ddf12d7f37dfef25308798d71ad547761d0785ac` | `69d770df8fa4eceb57167e34df3962ca`
|
||||
|
||||
## Changes since v1.2.4
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Retry Pod/RC updates in kubectl rolling-update ([#27509](https://github.com/kubernetes/kubernetes/pull/27509), [@janetkuo](https://github.com/janetkuo))
|
||||
* GCE provider: Create TargetPool with 200 instances, then update with rest ([#27865](https://github.com/kubernetes/kubernetes/pull/27865), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* GCE provider: Limit Filter calls to regexps rather than large blobs ([#27741](https://github.com/kubernetes/kubernetes/pull/27741), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Fix strategic merge diff list diff bug ([#26418](https://github.com/kubernetes/kubernetes/pull/26418), [@AdoHe](https://github.com/AdoHe))
|
||||
* AWS: Fix long-standing bug in stringSetToPointers ([#26331](https://github.com/kubernetes/kubernetes/pull/26331), [@therc](https://github.com/therc))
|
||||
* AWS kube-up: Increase timeout waiting for docker start ([#25405](https://github.com/kubernetes/kubernetes/pull/25405), [@justinsb](https://github.com/justinsb))
|
||||
* Fix hyperkube flag parsing ([#25512](https://github.com/kubernetes/kubernetes/pull/25512), [@colhom](https://github.com/colhom))
|
||||
* kubectl rolling-update support for same image ([#24645](https://github.com/kubernetes/kubernetes/pull/24645), [@jlowdermilk](https://github.com/jlowdermilk))
|
||||
* Return "410 Gone" errors via watch stream when using watch cache ([#25369](https://github.com/kubernetes/kubernetes/pull/25369), [@liggitt](https://github.com/liggitt))
|
||||
|
||||
|
||||
|
||||
# v1.2.4
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.4
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.4/kubernetes.tar.gz) | `f3aea83f8f0e16b2b41998a2edc09eb42fd8d945` | `ab0aca3a20e8eba43c8ff9d672793618`
|
||||
|
||||
## Changes since v1.2.3
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Ensure status is not changed during an update of PV, PVC, HPA objects ([#24924](https://github.com/kubernetes/kubernetes/pull/24924), [@mqliang](https://github.com/mqliang))
|
||||
* GCI: Add two GCI specific metadata pairs ([#25105](https://github.com/kubernetes/kubernetes/pull/25105), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Add an entry to the salt config to allow Debian jessie on GCE. ([#25123](https://github.com/kubernetes/kubernetes/pull/25123), [@jlewi](https://github.com/jlewi))
|
||||
* As with the existing Wheezy image on GCE, docker is expected
|
||||
* to already be installed in the image.
|
||||
* Fix DeletingLoadBalancer event generation. ([#24833](https://github.com/kubernetes/kubernetes/pull/24833), [@a-robinson](https://github.com/a-robinson))
|
||||
* GCE: Prefer preconfigured node tags for firewalls, if available ([#25148](https://github.com/kubernetes/kubernetes/pull/25148), [@a-robinson](https://github.com/a-robinson))
|
||||
* Drain pods created from ReplicaSets in 'kubectl drain' ([#23689](https://github.com/kubernetes/kubernetes/pull/23689), [@maclof](https://github.com/maclof))
|
||||
* GCI: Update the command to get the image ([#24987](https://github.com/kubernetes/kubernetes/pull/24987), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Validate deletion timestamp doesn't change on update ([#24839](https://github.com/kubernetes/kubernetes/pull/24839), [@liggitt](https://github.com/liggitt))
|
||||
* Add support for running clusters on GCI ([#24893](https://github.com/kubernetes/kubernetes/pull/24893), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Trusty: Add retry in curl commands ([#24749](https://github.com/kubernetes/kubernetes/pull/24749), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
|
||||
|
||||
|
||||
# v1.2.3
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.3
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.3/kubernetes.tar.gz) | `b2ce4e0c72562d09ba06e3c0913f0bd78da0285e` | `69e75650de30d5a52d144799e94a168d`
|
||||
|
||||
## Changes since v1.2.2
|
||||
|
||||
### Action Required
|
||||
|
||||
* Make watch cache treat resourceVersion consistent with uncached watch ([#24008](https://github.com/kubernetes/kubernetes/pull/24008), [@liggitt](https://github.com/liggitt))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Fix unintended change of Service.spec.ports[].nodePort during kubectl apply ([#24180](https://github.com/kubernetes/kubernetes/pull/24180), [@AdoHe](https://github.com/AdoHe))
|
||||
* Flush conntrack state for removed/changed UDP Services ([#22573](https://github.com/kubernetes/kubernetes/pull/22573), [@freehan](https://github.com/freehan))
|
||||
* Allow setting the Host header in a httpGet probe ([#24292](https://github.com/kubernetes/kubernetes/pull/24292), [@errm](https://github.com/errm))
|
||||
* Bridge off-cluster traffic into services by masquerading. ([#24429](https://github.com/kubernetes/kubernetes/pull/24429), [@cjcullen](https://github.com/cjcullen))
|
||||
* Version-guard Kubectl client Guestbook application test against deployments ([#24478](https://github.com/kubernetes/kubernetes/pull/24478), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* Fix goroutine leak in ssh-tunnel healthcheck. ([#24487](https://github.com/kubernetes/kubernetes/pull/24487), [@cjcullen](https://github.com/cjcullen))
|
||||
* Fixed mounting with containerized kubelet ([#23435](https://github.com/kubernetes/kubernetes/pull/23435), [@jsafrane](https://github.com/jsafrane))
|
||||
* Do not throw creation errors for containers that fail immediately after being started ([#23894](https://github.com/kubernetes/kubernetes/pull/23894), [@vishh](https://github.com/vishh))
|
||||
* Honor starting resourceVersion in watch cache ([#24208](https://github.com/kubernetes/kubernetes/pull/24208), [@ncdc](https://github.com/ncdc))
|
||||
* Fix TerminationMessagePath ([#23658](https://github.com/kubernetes/kubernetes/pull/23658), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* Fix gce.getDiskByNameUnknownZone logic. ([#24452](https://github.com/kubernetes/kubernetes/pull/24452), [@a-robinson](https://github.com/a-robinson))
|
||||
* kubelet: add RSS memory to the summary API ([#24015](https://github.com/kubernetes/kubernetes/pull/24015), [@yujuhong](https://github.com/yujuhong))
|
||||
* e2e: adapt kubelet_perf.go to use the new summary metrics API ([#24003](https://github.com/kubernetes/kubernetes/pull/24003), [@yujuhong](https://github.com/yujuhong))
|
||||
* e2e: fix error checking in kubelet stats ([#24205](https://github.com/kubernetes/kubernetes/pull/24205), [@yujuhong](https://github.com/yujuhong))
|
||||
* Trusty: Avoid unnecessary in-memory temp files ([#24144](https://github.com/kubernetes/kubernetes/pull/24144), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Allowing type object in kubectl swagger validation ([#24054](https://github.com/kubernetes/kubernetes/pull/24054), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Add ClusterUpgrade tests ([#24150](https://github.com/kubernetes/kubernetes/pull/24150), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* Trusty: Do not create the docker-daemon cgroup ([#23996](https://github.com/kubernetes/kubernetes/pull/23996), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
|
||||
|
||||
|
||||
# v1.2.2
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.2
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.2/kubernetes.tar.gz) | `8dede5833a1986434adea80749624f81a0db7bb4` | `72a5389f22827fb5133fdc3b7bfb9b3a`
|
||||
|
||||
## Changes since v1.2.1
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Trusty: Update heapster manifest handling code ([#23434](https://github.com/kubernetes/kubernetes/pull/23434), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Support addon Deployments, make heapster a deployment with a nanny. ([#22893](https://github.com/kubernetes/kubernetes/pull/22893), [@Q-Lee](https://github.com/Q-Lee))
|
||||
* Create a new Deployment in kube-system for every version. ([#23512](https://github.com/kubernetes/kubernetes/pull/23512), [@Q-Lee](https://github.com/Q-Lee))
|
||||
* Use SCP to dump logs and parallelize a bit. ([#22835](https://github.com/kubernetes/kubernetes/pull/22835), [@spxtr](https://github.com/spxtr))
|
||||
* Trusty: Regional release .tar.gz support ([#23558](https://github.com/kubernetes/kubernetes/pull/23558), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Make ConfigMap volume readable as non-root ([#23793](https://github.com/kubernetes/kubernetes/pull/23793), [@pmorie](https://github.com/pmorie))
|
||||
* only include running and pending pods in daemonset should place calculation ([#23929](https://github.com/kubernetes/kubernetes/pull/23929), [@mikedanese](https://github.com/mikedanese))
|
||||
* A pod never terminated if a container image registry was unavailable ([#23746](https://github.com/kubernetes/kubernetes/pull/23746), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Update Dashboard UI addon to v1.0.1 ([#23724](https://github.com/kubernetes/kubernetes/pull/23724), [@maciaszczykm](https://github.com/maciaszczykm))
|
||||
* Ensure object returned by volume getCloudProvider incorporates cloud config ([#23769](https://github.com/kubernetes/kubernetes/pull/23769), [@saad-ali](https://github.com/saad-ali))
|
||||
* Add a timeout to the sshDialer to prevent indefinite hangs. ([#23843](https://github.com/kubernetes/kubernetes/pull/23843), [@cjcullen](https://github.com/cjcullen))
|
||||
* AWS kube-up: tolerate a lack of ephemeral volumes ([#23776](https://github.com/kubernetes/kubernetes/pull/23776), [@justinsb](https://github.com/justinsb))
|
||||
* Fix so setup-files don't recreate/invalidate certificates that already exist ([#23550](https://github.com/kubernetes/kubernetes/pull/23550), [@luxas](https://github.com/luxas))
|
||||
|
||||
|
||||
|
||||
# v1.2.1
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.1
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.1/kubernetes.tar.gz) | `1639807c5788e1c6b1ab51fd30b723fb5debd865` | `235a1da47972c96a560d718d3256ca4f`
|
||||
|
||||
|
||||
## Changes since v1.2.0
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* AWS: Fix problems with >2 security groups ([#23340](https://github.com/kubernetes/kubernetes/pull/23340), [@justinsb](https://github.com/justinsb))
|
||||
* IngressTLS: allow secretName to be blank for SNI routing ([#23500](https://github.com/kubernetes/kubernetes/pull/23500), [@tam7t](https://github.com/tam7t))
|
||||
* Heapster patch release to 1.0.2 ([#23487](https://github.com/kubernetes/kubernetes/pull/23487), [@piosz](https://github.com/piosz))
|
||||
* Remove unnecessary override of /etc/init.d/docker on containervm image. ([#23593](https://github.com/kubernetes/kubernetes/pull/23593), [@dchen1107](https://github.com/dchen1107))
|
||||
* Change kube-proxy & fluentd CPU request to 20m/80m. ([#23646](https://github.com/kubernetes/kubernetes/pull/23646), [@cjcullen](https://github.com/cjcullen))
|
||||
* make docker-checker more robust ([#23662](https://github.com/kubernetes/kubernetes/pull/23662), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* validate that daemonsets don't have empty selectors on creation ([#23530](https://github.com/kubernetes/kubernetes/pull/23530), [@mikedanese](https://github.com/mikedanese))
|
||||
* don't sync deployment when pod selector is empty ([#23467](https://github.com/kubernetes/kubernetes/pull/23467), [@mikedanese](https://github.com/mikedanese))
|
||||
* Support differentiation of OS distro in e2e tests ([#23466](https://github.com/kubernetes/kubernetes/pull/23466), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* don't sync daemonsets with selectors that match all pods ([#23223](https://github.com/kubernetes/kubernetes/pull/23223), [@mikedanese](https://github.com/mikedanese))
|
||||
* Trusty: Avoid reaching GCE custom metadata size limit ([#22818](https://github.com/kubernetes/kubernetes/pull/22818), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Update kubectl help for 1.2 resources ([#23305](https://github.com/kubernetes/kubernetes/pull/23305), [@janetkuo](https://github.com/janetkuo))
|
||||
* Removing URL query param from swagger UI to fix the XSS issue ([#23234](https://github.com/kubernetes/kubernetes/pull/23234), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Fix hairpin mode ([#23325](https://github.com/kubernetes/kubernetes/pull/23325), [@MurgaNikolay](https://github.com/MurgaNikolay))
|
||||
* Bump to container-vm-v20160321 ([#23313](https://github.com/kubernetes/kubernetes/pull/23313), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Remove the restart-kube-proxy and restart-apiserver functions ([#23180](https://github.com/kubernetes/kubernetes/pull/23180), [@roberthbailey](https://github.com/roberthbailey))
|
||||
* Copy annotations back from RS to Deployment on rollback ([#23160](https://github.com/kubernetes/kubernetes/pull/23160), [@janetkuo](https://github.com/janetkuo))
|
||||
* Trusty: Support hybrid cluster with nodes on ContainerVM ([#23079](https://github.com/kubernetes/kubernetes/pull/23079), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* update expose command description to add deployment ([#23246](https://github.com/kubernetes/kubernetes/pull/23246), [@AdoHe](https://github.com/AdoHe))
|
||||
* Add a rate limiter to the GCE cloudprovider ([#23019](https://github.com/kubernetes/kubernetes/pull/23019), [@alex-mohr](https://github.com/alex-mohr))
|
||||
* Add a Deployment example for kubectl expose. ([#23222](https://github.com/kubernetes/kubernetes/pull/23222), [@madhusudancs](https://github.com/madhusudancs))
|
||||
* Use versioned object when computing patch ([#23145](https://github.com/kubernetes/kubernetes/pull/23145), [@liggitt](https://github.com/liggitt))
|
||||
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
|
||||
* Add a SSHKey sync check to the master's healthz (when using SSHTunnels). ([#23167](https://github.com/kubernetes/kubernetes/pull/23167), [@cjcullen](https://github.com/cjcullen))
|
||||
* Validate minimum CPU limits to be >= 10m ([#23143](https://github.com/kubernetes/kubernetes/pull/23143), [@vishh](https://github.com/vishh))
|
||||
* Fix controller-manager race condition issue which cause endpoints flush during restart ([#23035](https://github.com/kubernetes/kubernetes/pull/23035), [@xinxiaogang](https://github.com/xinxiaogang))
|
||||
* MESOS: forward globally declared cadvisor housekeeping flags ([#22974](https://github.com/kubernetes/kubernetes/pull/22974), [@jdef](https://github.com/jdef))
|
||||
* Trusty: support developer workflow on base image ([#22960](https://github.com/kubernetes/kubernetes/pull/22960), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
|
||||
|
||||
|
||||
# v1.2.0
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.2/examples)
|
||||
|
||||
## Downloads for v1.2.0
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.2.0/kubernetes.tar.gz) | `52dd998e1191f464f581a9b87017d70ce0b058d9` | `c0ce9e6150e9d7a19455db82f3318b4c`
|
||||
|
||||
## Changes since v1.1.1
|
||||
|
||||
### Major Themes
|
||||
|
||||
* <strong>Significant scale improvements</strong>. Increased cluster scale by 400% to 1000 nodes with 30,000 pods per cluster.
|
||||
Kubelet supports 100 pods per node with 4x reduced system overhead.
|
||||
* <strong>Simplified application deployment and management. </strong>
|
||||
* Dynamic Configuration (ConfigMap API in the core API group) enables application
|
||||
configuration to be stored as a Kubernetes API object and pulled dynamically on
|
||||
container startup, as an alternative to baking in command-line flags when a
|
||||
container is built.
|
||||
* Turnkey Deployments (Deployment API (Beta) in the Extensions API group)
|
||||
automate deployment and rolling updates of applications, specified
|
||||
declaratively. It handles versioning, multiple simultaneous rollouts,
|
||||
aggregating status across all pods, maintaining application availability, and
|
||||
rollback.
|
||||
* <strong>Automated cluster management: </strong>
|
||||
* Kubernetes clusters can now span zones within a cloud provider. Pods from a
|
||||
service will be automatically spread across zones, enabling applications to
|
||||
tolerate zone failure.
|
||||
* Simplified way to run a container on every node (DaemonSet API (Beta) in the
|
||||
Extensions API group): Kubernetes can schedule a service (such as a logging
|
||||
agent) that runs one, and only one, pod per node.
|
||||
* TLS and L7 support (Ingress API (Beta) in the Extensions API group): Kubernetes
|
||||
is now easier to integrate into custom networking environments by supporting
|
||||
TLS for secure communication and L7 http-based traffic routing.
|
||||
* Graceful Node Shutdown (aka drain) - The new “kubectl drain” command gracefully
|
||||
evicts pods from nodes in preparation for disruptive operations like kernel
|
||||
upgrades or maintenance.
|
||||
* Custom Metrics for Autoscaling (HorizontalPodAutoscaler API in the Autoscaling
|
||||
API group): The Horizontal Pod Autoscaling feature now supports custom metrics
|
||||
(Alpha), allowing you to specify application-level metrics and thresholds to
|
||||
trigger scaling up and down the number of pods in your application.
|
||||
* <strong>New GUI</strong> (dashboard) allows you to get started quickly and enables the same
|
||||
functionality found in the CLI as a more approachable and discoverable way of
|
||||
interacting with the system. Note: the GUI is enabled by default in 1.2 clusters.
|
||||
|
||||
<img src="docs/images/newgui.png" width="" alt="Dashboard UI screenshot showing cards that represent applications that run inside a cluster" title="Dashboard UI apps screen">
|
||||
|
||||
### Other notable improvements
|
||||
|
||||
* Job was Beta in 1.1 and is GA in 1.2 .
|
||||
* <code>apiVersion: batch/v1 </code>is now available. You now do not need to specify the <code>.spec.selector</code> field — a [unique selector is automatically generated ](http://kubernetes.io/docs/user-guide/jobs/#pod-selector)for you.
|
||||
* The previous version, <code>apiVersion: extensions/v1beta1</code>, is still supported. Even if you roll back to 1.1, the objects created using
|
||||
the new apiVersion will still be accessible, using the old version. You can
|
||||
continue to use your existing JSON and YAML files until you are ready to switch
|
||||
to <code>batch/v1</code>. We may remove support for Jobs with <code>apiVersion: extensions/v1beta1 </code>in 1.3 or 1.4.
|
||||
* HorizontalPodAutoscaler was Beta in 1.1 and is GA in 1.2 .
|
||||
* <code>apiVersion: autoscaling/v1 </code>is now available. Changes in this version are:
|
||||
* Field CPUUtilization which was a nested structure CPUTargetUtilization in
|
||||
HorizontalPodAutoscalerSpec was replaced by TargetCPUUtilizationPercentage
|
||||
which is an integer.
|
||||
* ScaleRef of type SubresourceReference in HorizontalPodAutoscalerSpec which
|
||||
referred to scale subresource of the resource being scaled was replaced by
|
||||
ScaleTargetRef which points just to the resource being scaled.
|
||||
* In extensions/v1beta1 if CPUUtilization in HorizontalPodAutoscalerSpec was not
|
||||
specified it was set to 80 by default while in autoscaling/v1 HPA object
|
||||
without TargetCPUUtilizationPercentage specified is a valid object. Pod
|
||||
autoscaler controller will apply a default scaling policy in this case which is
|
||||
equivalent to the previous one but may change in the future.
|
||||
* The previous version, <code>apiVersion: extensions/v1beta1</code>, is still supported. Even if you roll back to 1.1, the objects created using
|
||||
the new apiVersions will still be accessible, using the old version. You can
|
||||
continue to use your existing JSON and YAML files until you are ready to switch
|
||||
to <code>autoscaling/v1</code>. We may remove support for HorizontalPodAutoscalers with <code>apiVersion: extensions/v1beta1 </code>in 1.3 or 1.4.
|
||||
* Kube-Proxy now defaults to an iptables-based proxy. If the --proxy-mode flag is
|
||||
specified while starting kube-proxy (‘userspace’ or ‘iptables’), the flag value
|
||||
will be respected. If the flag value is not specified, the kube-proxy respects
|
||||
the Node object annotation: ‘net.beta.kubernetes.io/proxy-mode’. If the
|
||||
annotation is not specified, then ‘iptables’ mode is the default. If kube-proxy
|
||||
is unable to start in iptables mode because system requirements are not met
|
||||
(kernel or iptables versions are insufficient), the kube-proxy will fall-back
|
||||
to userspace mode. Kube-proxy is much more performant and less
|
||||
resource-intensive in ‘iptables’ mode.
|
||||
* Node stability can be improved by reserving [resources](https://github.com/kubernetes/kubernetes/blob/release-1.2/docs/proposals/node-allocatable.md) for the base operating system using --system-reserved and --kube-reserved Kubelet flags
|
||||
* Liveness and readiness probes now support more configuration parameters:
|
||||
periodSeconds, successThreshold, failureThreshold
|
||||
* The new ReplicaSet API (Beta) in the Extensions API group is similar to
|
||||
ReplicationController, but its [selector](http://kubernetes.io/docs/user-guide/labels/#label-selectors) is more general (supports set-based selector; whereas ReplicationController
|
||||
only supports equality-based selector).
|
||||
* Scale subresource support is now expanded to ReplicaSets along with
|
||||
ReplicationControllers and Deployments. Scale now supports two different types
|
||||
of selectors to accommodate both [equality-based selectors](http://kubernetes.io/docs/user-guide/labels/#equality-based-requirement) supported by ReplicationControllers and [set-based selectors](http://kubernetes.io/docs/user-guide/labels/#set-based-requirement) supported by Deployments and ReplicaSets.
|
||||
* “kubectl run” now produces Deployments (instead of ReplicationControllers) and
|
||||
Jobs (instead of Pods) by default.
|
||||
* Pods can now consume Secret data in environment variables and inject those
|
||||
environment variables into a container’s command-line args.
|
||||
* Stable version of Heapster which scales up to 1000 nodes: more metrics, reduced
|
||||
latency, reduced cpu/memory consumption (~4mb per monitored node).
|
||||
* Pods now have a security context which allows users to specify:
|
||||
* attributes which apply to the whole pod:
|
||||
* User ID
|
||||
* Whether all containers should be non-root
|
||||
* Supplemental Groups
|
||||
* FSGroup - a special supplemental group
|
||||
* SELinux options
|
||||
* If a pod defines an FSGroup, that Pod’s system (emptyDir, secret, configMap,
|
||||
etc) volumes and block-device volumes will be owned by the FSGroup, and each
|
||||
container in the pod will run with the FSGroup as a supplemental group
|
||||
* Volumes that support SELinux labelling are now automatically relabeled with the
|
||||
Pod’s SELinux context, if specified
|
||||
* A stable client library release\_1\_2 is added. The library is [here](pkg/client/clientset_generated/), and detailed doc is [here](docs/devel/generating-clientset.md#released-clientsets). We will keep the interface of this go client stable.
|
||||
* New Azure File Service Volume Plugin enables mounting Microsoft Azure File
|
||||
Volumes (SMB 2.1 and 3.0) into a Pod. See [example](https://github.com/kubernetes/kubernetes/blob/release-1.2/examples/azure_file/README.md) for details.
|
||||
* Logs usage and root filesystem usage of a container, volumes usage of a pod and node disk usage are exposed through Kubelet new metrics API.
|
||||
|
||||
### Experimental Features
|
||||
|
||||
* Dynamic Provisioning of PersistentVolumes: Kubernetes previously required all
|
||||
volumes to be manually provisioned by a cluster administrator before use. With
|
||||
this feature, volume plugins that support it (GCE PD, AWS EBS, and Cinder) can
|
||||
automatically provision a PersistentVolume to bind to an unfulfilled
|
||||
PersistentVolumeClaim.
|
||||
* Run multiple schedulers in parallel, e.g. one or more custom schedulers
|
||||
alongside the default Kubernetes scheduler, using pod annotations to select
|
||||
among the schedulers for each pod. Documentation is [here](http://kubernetes.io/docs/admin/multiple-schedulers.md), design doc is [here](docs/proposals/multiple-schedulers.md).
|
||||
* More expressive node affinity syntax, and support for “soft” node affinity.
|
||||
Node selectors (to constrain pods to schedule on a subset of nodes) now support
|
||||
the operators {<code>In, NotIn, Exists, DoesNotExist, Gt, Lt</code>} instead of just conjunction of exact match on node label values. In
|
||||
addition, we’ve introduced a new “soft” kind of node selector that is just a
|
||||
hint to the scheduler; the scheduler will try to satisfy these requests but it
|
||||
does not guarantee they will be satisfied. Both the “hard” and “soft” variants
|
||||
of node affinity use the new syntax. Documentation is [here](http://kubernetes.io/docs/user-guide/node-selection/) (see section “Alpha feature in Kubernetes v1.2: Node Affinity“). Design doc is [here](https://github.com/kubernetes/kubernetes/blob/release-1.2/docs/design/nodeaffinity.md).
|
||||
* A pod can specify its own Hostname and Subdomain via annotations (<code>pod.beta.kubernetes.io/hostname, pod.beta.kubernetes.io/subdomain)</code>. If the Subdomain matches the name of a [headless service](http://kubernetes.io/docs/user-guide/services/#headless-services) in the same namespace, a DNS A record is also created for the pod’s FQDN. More
|
||||
details can be found in the [DNS README](https://github.com/kubernetes/kubernetes/blob/release-1.2/cluster/saltbase/salt/kube-dns/README.md#a-records-and-hostname-based-on-pod-annotations---a-beta-feature-in-kubernetes-v12). Changes were introduced in PR [#20688](https://github.com/kubernetes/kubernetes/pull/20688).
|
||||
* New SchedulerExtender enables users to implement custom
|
||||
out-of-(the-scheduler)-process scheduling predicates and priority functions,
|
||||
for example to schedule pods based on resources that are not directly managed
|
||||
by Kubernetes. Changes were introduced in PR [#13580](https://github.com/kubernetes/kubernetes/pull/13580). Example configuration and documentation is available [here](docs/design/scheduler_extender.md). This is an alpha feature and may not be supported in its current form at beta
|
||||
or GA.
|
||||
* New Flex Volume Plugin enables users to use out-of-process volume plugins that
|
||||
are installed to “/usr/libexec/kubernetes/kubelet-plugins/volume/exec/” on
|
||||
every node, instead of being compiled into the Kubernetes binary. See [example](examples/volumes/flexvolume/README.md) for details.
|
||||
* vendor volumes into a pod. It expects vendor drivers are installed in the
|
||||
volume plugin path on each kubelet node. This is an alpha feature and may
|
||||
change in future.
|
||||
* Kubelet exposes a new Alpha metrics API - /stats/summary in a user friendly format with reduced system overhead. The measurement is done in PR [#22542](https://github.com/kubernetes/kubernetes/pull/22542).
|
||||
|
||||
### Action required
|
||||
|
||||
* Docker v1.9.1 is officially recommended. Docker v1.8.3 and Docker v1.10 are
|
||||
supported. If you are using an older release of Docker, please upgrade. Known
|
||||
issues with Docker 1.9.1 can be found below.
|
||||
* CPU hardcapping will be enabled by default for containers with CPU limit set,
|
||||
if supported by the kernel. You should either adjust your CPU limit, or set CPU
|
||||
request only, if you want to avoid hardcapping. If the kernel does not support
|
||||
CPU Quota, NodeStatus will contain a warning indicating that CPU Limits cannot
|
||||
be enforced.
|
||||
* The following applies only if you use the Go language client (<code>/pkg/client/unversioned</code>) to create Job by defining Go variables of type "<code>k8s.io/kubernetes/pkg/apis/extensions".Job</code>). We think <strong>this is not common</strong>, so if you are not sure what this means, you probably aren't doing this. If
|
||||
you do this, then, at the time you re-vendor the "<code>k8s.io/kubernetes/"</code> code, you will need to set <code>job.Spec.ManualSelector = true</code>, or else set <code>job.Spec.Selector = nil. </code>Otherwise, the jobs you create may be rejected. See [Specifying your own pod selector](http://kubernetes.io/docs/user-guide/jobs/#specifying-your-own-pod-selector).
|
||||
* Deployment was Alpha in 1.1 (though it had apiVersion extensions/v1beta1) and
|
||||
was disabled by default. Due to some non-backward-compatible API changes, any
|
||||
Deployment objects you created in 1.1 won’t work with in the 1.2 release.
|
||||
* Before upgrading to 1.2, <strong>delete all Deployment alpha-version resources</strong>, including the Replication Controllers and Pods the Deployment manages. Then
|
||||
create Deployment Beta resources after upgrading to 1.2. Not deleting the
|
||||
Deployment objects may cause the deployment controller to mistakenly match
|
||||
other pods and delete them, due to the selector API change.
|
||||
* Client (kubectl) and server versions must match (both 1.1 or both 1.2) for any
|
||||
Deployment-related operations.
|
||||
* Behavior change:
|
||||
* Deployment creates ReplicaSets instead of ReplicationControllers.
|
||||
* Scale subresource now has a new <code>targetSelector</code> field in its status. This field supports the new set-based selectors supported
|
||||
by Deployments, but in a serialized format.
|
||||
* Spec change:
|
||||
* Deployment’s [selector](http://kubernetes.io/docs/user-guide/labels/#label-selectors) is now more general (supports set-based selector; it only supported
|
||||
equality-based selector in 1.1).
|
||||
* .spec.uniqueLabelKey is removed -- users can’t customize unique label key --
|
||||
and its default value is changed from
|
||||
“deployment.kubernetes.io/podTemplateHash” to “pod-template-hash”.
|
||||
* .spec.strategy.rollingUpdate.minReadySeconds is moved to .spec.minReadySeconds
|
||||
* DaemonSet was Alpha in 1.1 (though it had apiVersion extensions/v1beta1) and
|
||||
was disabled by default. Due to some non-backward-compatible API changes, any
|
||||
DaemonSet objects you created in 1.1 won’t work with in the 1.2 release.
|
||||
* Before upgrading to 1.2, <strong>delete all DaemonSet alpha-version resources</strong>. If you do not want to disrupt the pods, use kubectl delete daemonset <name>
|
||||
--cascade=false. Then create DaemonSet Beta resources after upgrading to 1.2.
|
||||
* Client (kubectl) and server versions must match (both 1.1 or both 1.2) for any
|
||||
DaemonSet-related operations.
|
||||
* Behavior change:
|
||||
* DaemonSet pods will be created on nodes with .spec.unschedulable=true and will
|
||||
not be evicted from nodes whose Ready condition is false.
|
||||
* Updates to the pod template are now permitted. To perform a rolling update of a
|
||||
DaemonSet, update the pod template and then delete its pods one by one; they
|
||||
will be replaced using the updated template.
|
||||
* Spec change:
|
||||
* DaemonSet’s [selector](http://kubernetes.io/docs/user-guide/labels/#label-selectors) is now more general (supports set-based selector; it only supported
|
||||
equality-based selector in 1.1).
|
||||
* Running against a secured etcd requires these flags to be passed to
|
||||
kube-apiserver (instead of --etcd-config):
|
||||
* --etcd-certfile, --etcd-keyfile (if using client cert auth)
|
||||
* --etcd-cafile (if not using system roots)
|
||||
* As part of preparation in 1.2 for adding support for protocol buffers (and the
|
||||
direct YAML support in the API available today), the Content-Type and Accept
|
||||
headers are now properly handled as per the HTTP spec. As a consequence, if
|
||||
you had a client that was sending an invalid Content-Type or Accept header to
|
||||
the API, in 1.2 you will either receive a 415 or 406 error.
|
||||
The only client
|
||||
this is known to affect is curl when you use -d with JSON but don't set a
|
||||
content type, helpfully sends "application/x-www-urlencoded", which is not
|
||||
correct.
|
||||
Other client authors should double check that you are sending proper
|
||||
accept and content type headers, or set no value (in which case JSON is the
|
||||
default).
|
||||
An example using curl:
|
||||
<code>curl -H "Content-Type: application/json" -XPOST -d
|
||||
'{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"kube-system"}}' "[http://127.0.0.1:8080/api/v1/namespaces](http://127.0.0.1:8080/api/v1/namespaces)"</code>
|
||||
* The version of InfluxDB is bumped from 0.8 to 0.9 which means storage schema
|
||||
change. More details [here](https://docs.influxdata.com/influxdb/v0.9/administration/upgrading/).
|
||||
* We have renamed “minions” to “nodes”. If you were specifying NUM\_MINIONS or
|
||||
MINION\_SIZE to kube-up, you should now specify NUM\_NODES or NODE\_SIZE.
|
||||
|
||||
### Known Issues
|
||||
|
||||
* Paused deployments can't be resized and don't clean up old ReplicaSets.
|
||||
* Minimum memory limit is 4MB. This is a docker limitation
|
||||
* Minimum CPU limits is 10m. This is a Linux Kernel limitation
|
||||
* “kubectl rollout undo” (i.e. rollback) will hang on paused deployments, because
|
||||
paused deployments can’t be rolled back (this is expected), and the command
|
||||
waits for rollback events to return the result. Users should use “kubectl
|
||||
rollout resume” to resume a deployment before rolling back.
|
||||
* “kubectl edit <list>” will open the editor multiple times, once for each
|
||||
resource in the list.
|
||||
* If you create HPA object using autoscaling/v1 API without specifying
|
||||
targetCPUUtilizationPercentage and read it using kubectl it will print default
|
||||
value as specified in extensions/v1beta1 (see details in [#23196](https://github.com/kubernetes/kubernetes/issues/23196)).
|
||||
* If a node or kubelet crashes with a volume attached, the volume will remain
|
||||
attached to that node. If that volume can only be attached to one node at a
|
||||
time (GCE PDs attached in RW mode, for example), then the volume must be
|
||||
manually detached before Kubernetes can attach it to other nodes.
|
||||
* If a volume is already attached to a node any subsequent attempts to attach it
|
||||
again (due to kubelet restart, for example) will fail. The volume must either
|
||||
be manually detached first or the pods referencing it deleted (which would
|
||||
trigger automatic volume detach).
|
||||
* In very large clusters it may happen that a few nodes won’t register in API
|
||||
server in a given timeframe for whatever reasons (networking issue, machine
|
||||
failure, etc.). Normally when kube-up script will encounter even one NotReady
|
||||
node it will fail, even though the cluster most likely will be working. We
|
||||
added an environmental variable to kube-up ALLOWED\_NOTREADY\_NODES that
|
||||
defines the number of nodes that if not Ready in time won’t cause kube-up
|
||||
failure.
|
||||
* “kubectl rolling-update” only supports Replication Controllers (it doesn’t
|
||||
support Replica Sets). It’s recommended to use Deployment 1.2 with “kubectl
|
||||
rollout” commands instead, if you want to rolling update Replica Sets.
|
||||
* When live upgrading Kubelet to 1.2 without draining the pods running on the node,
|
||||
the containers will be restarted by Kubelet (see details in [#23104](https://github.com/kubernetes/kubernetes/issues/23104)).
|
||||
|
||||
#### Docker Known Issues
|
||||
|
||||
##### 1.9.1
|
||||
|
||||
* Listing containers can be slow at times which will affect kubelet performance.
|
||||
More information [here](https://github.com/docker/docker/issues/17720)
|
||||
* Docker daemon restarts can fail. Docker checkpoints have to deleted between
|
||||
restarts. More information [here](https://github.com/kubernetes/kubernetes/issues/20995)
|
||||
* Pod IP allocation-related issues. Deleting the docker checkpoint prior to
|
||||
restarting the daemon alleviates this issue, but hasn’t been verified to
|
||||
completely eliminate the IP allocation issue. More information [here](https://github.com/kubernetes/kubernetes/issues/21523#issuecomment-191498969)
|
||||
* Daemon becomes unresponsive (rarely) due to kernel deadlocks. More information [here](https://github.com/kubernetes/kubernetes/issues/21866#issuecomment-189492391)
|
||||
|
||||
### Provider-specific Notes
|
||||
|
||||
#### Various
|
||||
|
||||
Core changes:
|
||||
|
||||
* Support for load balancers with source ranges
|
||||
|
||||
#### AWS
|
||||
|
||||
Core changes:
|
||||
|
||||
* Support for ELBs with complex configurations: better subnet selection with
|
||||
multiple subnets, and internal ELBs
|
||||
* Support for VPCs with private dns names
|
||||
* Multiple fixes to EBS volume mounting code for robustness, and to support
|
||||
mounting the full number of AWS recommended volumes.
|
||||
* Multiple fixes to avoid hitting AWS rate limits, and to throttle if we do
|
||||
* Support for the EC2 Container Registry (currently in us-east-1 only)
|
||||
|
||||
With kube-up:
|
||||
|
||||
* Automatically install updates on boot & reboot
|
||||
* Use optimized image based on Jessie by default
|
||||
* Add support for Ubuntu Wily
|
||||
* Master is configured with automatic restart-on-failure, via CloudWatch
|
||||
* Bootstrap reworked to be more similar to GCE; better supports reboots/restarts
|
||||
* Use an elastic IP for the master by default
|
||||
* Experimental support for node spot instances (set NODE\_SPOT\_PRICE=0.05)
|
||||
|
||||
#### GCE
|
||||
|
||||
* Ubuntu Trusty support added
|
||||
|
||||
Please see the [Releases Page](https://github.com/kubernetes/kubernetes/releases) for older releases.
|
||||
|
||||
|
||||
[]()
|
||||
972
vendor/k8s.io/kubernetes/CHANGELOG-1.3.md
generated
vendored
972
vendor/k8s.io/kubernetes/CHANGELOG-1.3.md
generated
vendored
|
|
@ -1,972 +0,0 @@
|
|||
<!-- BEGIN MUNGE: GENERATED_TOC -->
|
||||
- [v1.3.10](#v1310)
|
||||
- [Downloads for v1.3.10](#downloads-for-v1310)
|
||||
- [Client Binaries](#client-binaries)
|
||||
- [Server Binaries](#server-binaries)
|
||||
- [Changelog since v1.3.9](#changelog-since-v139)
|
||||
- [Other notable changes](#other-notable-changes)
|
||||
- [v1.3.9](#v139)
|
||||
- [Downloads](#downloads)
|
||||
- [Changelog since v1.3.8](#changelog-since-v138)
|
||||
- [Other notable changes](#other-notable-changes-1)
|
||||
- [v1.3.8](#v138)
|
||||
- [Downloads](#downloads-1)
|
||||
- [Changelog since v1.3.7](#changelog-since-v137)
|
||||
- [Other notable changes](#other-notable-changes-2)
|
||||
- [v1.3.7](#v137)
|
||||
- [Downloads](#downloads-2)
|
||||
- [Changelog since v1.3.6](#changelog-since-v136)
|
||||
- [Other notable changes](#other-notable-changes-3)
|
||||
- [v1.3.6](#v136)
|
||||
- [Downloads](#downloads-3)
|
||||
- [Changelog since v1.3.5](#changelog-since-v135)
|
||||
- [Other notable changes](#other-notable-changes-4)
|
||||
- [v1.3.5](#v135)
|
||||
- [Downloads](#downloads-4)
|
||||
- [Changelog since v1.3.4](#changelog-since-v134)
|
||||
- [Other notable changes](#other-notable-changes-5)
|
||||
- [v1.3.4](#v134)
|
||||
- [Downloads](#downloads-5)
|
||||
- [Changelog since v1.3.3](#changelog-since-v133)
|
||||
- [Other notable changes](#other-notable-changes-6)
|
||||
- [v1.3.3](#v133)
|
||||
- [Downloads](#downloads-6)
|
||||
- [Changelog since v1.3.2](#changelog-since-v132)
|
||||
- [Other notable changes](#other-notable-changes-7)
|
||||
- [Known Issues](#known-issues)
|
||||
- [v1.3.2](#v132)
|
||||
- [Downloads](#downloads-7)
|
||||
- [Changelog since v1.3.1](#changelog-since-v131)
|
||||
- [Other notable changes](#other-notable-changes-8)
|
||||
- [v1.3.1](#v131)
|
||||
- [Downloads](#downloads-8)
|
||||
- [Changelog since v1.3.0](#changelog-since-v130)
|
||||
- [Other notable changes](#other-notable-changes-9)
|
||||
- [v1.3.0](#v130)
|
||||
- [Downloads](#downloads-9)
|
||||
- [Highlights](#highlights)
|
||||
- [Known Issues and Important Steps before Upgrading](#known-issues-and-important-steps-before-upgrading)
|
||||
- [ThirdPartyResource](#thirdpartyresource)
|
||||
- [kubectl](#kubectl)
|
||||
- [kubernetes Core Known Issues](#kubernetes-core-known-issues)
|
||||
- [Docker runtime Known Issues](#docker-runtime-known-issues)
|
||||
- [Rkt runtime Known Issues](#rkt-runtime-known-issues)
|
||||
- [Provider-specific Notes](#provider-specific-notes)
|
||||
- [Previous Releases Included in v1.3.0](#previous-releases-included-in-v130)
|
||||
- [v1.3.0-beta.3](#v130-beta3)
|
||||
- [Downloads](#downloads-10)
|
||||
- [Changelog since v1.3.0-beta.2](#changelog-since-v130-beta2)
|
||||
- [Action Required](#action-required)
|
||||
- [Other notable changes](#other-notable-changes-10)
|
||||
- [v1.3.0-beta.2](#v130-beta2)
|
||||
- [Downloads](#downloads-11)
|
||||
- [Changes since v1.3.0-beta.1](#changes-since-v130-beta1)
|
||||
- [Experimental Features](#experimental-features)
|
||||
- [Other notable changes](#other-notable-changes-11)
|
||||
- [v1.3.0-beta.1](#v130-beta1)
|
||||
- [Downloads](#downloads-12)
|
||||
- [Changes since v1.3.0-alpha.5](#changes-since-v130-alpha5)
|
||||
- [Action Required](#action-required-1)
|
||||
- [Other notable changes](#other-notable-changes-12)
|
||||
- [v1.3.0-alpha.5](#v130-alpha5)
|
||||
- [Downloads](#downloads-13)
|
||||
- [Changes since v1.3.0-alpha.4](#changes-since-v130-alpha4)
|
||||
- [Action Required](#action-required-2)
|
||||
- [Other notable changes](#other-notable-changes-13)
|
||||
- [v1.3.0-alpha.4](#v130-alpha4)
|
||||
- [Downloads](#downloads-14)
|
||||
- [Changes since v1.3.0-alpha.3](#changes-since-v130-alpha3)
|
||||
- [Action Required](#action-required-3)
|
||||
- [Other notable changes](#other-notable-changes-14)
|
||||
- [v1.3.0-alpha.3](#v130-alpha3)
|
||||
- [Downloads](#downloads-15)
|
||||
- [Changes since v1.3.0-alpha.2](#changes-since-v130-alpha2)
|
||||
- [Action Required](#action-required-4)
|
||||
- [Other notable changes](#other-notable-changes-15)
|
||||
- [v1.3.0-alpha.2](#v130-alpha2)
|
||||
- [Downloads](#downloads-16)
|
||||
- [Changes since v1.3.0-alpha.1](#changes-since-v130-alpha1)
|
||||
- [Other notable changes](#other-notable-changes-16)
|
||||
- [v1.3.0-alpha.1](#v130-alpha1)
|
||||
- [Downloads](#downloads-17)
|
||||
- [Changes since v1.2.0](#changes-since-v120)
|
||||
- [Action Required](#action-required-5)
|
||||
- [Other notable changes](#other-notable-changes-17)
|
||||
<!-- END MUNGE: GENERATED_TOC -->
|
||||
|
||||
<!-- NEW RELEASE NOTES ENTRY -->
|
||||
|
||||
|
||||
# v1.3.10
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads for v1.3.10
|
||||
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes.tar.gz) | `0f61517fbab1feafbe1024da0b88bfe16e61fed7e612285d70e3ecb53ce518cf`
|
||||
[kubernetes-src.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-src.tar.gz) | `7b1be0dcc12ae1b0cb1928b770c1025755fd0858ce7520907bacda19e5bfa53f`
|
||||
|
||||
### Client Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-client-darwin-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-darwin-386.tar.gz) | `64a7012411a506ff7825e7b9c64b50197917d6f4e1128ea0e7b30a121059da47`
|
||||
[kubernetes-client-darwin-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-darwin-amd64.tar.gz) | `5d85843e643eaebe3e34e48810f4786430b5ecce915144e01ba2d8539aa77364`
|
||||
[kubernetes-client-linux-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-linux-386.tar.gz) | `06d478c601b1d4aa1fc539e9120adbcbbd2fb370d062516f84a064e465d8eadc`
|
||||
[kubernetes-client-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-linux-amd64.tar.gz) | `fe571542482b8ba3ff94b9e5e9657f6ab4fc0feb8971930dc80b7ae2548d669b`
|
||||
[kubernetes-client-linux-arm64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-linux-arm64.tar.gz) | `176b52d35150ca9f08a7e90e33e2839b7574afe350edf4fafa46745d77bb5aa4`
|
||||
[kubernetes-client-linux-arm.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-linux-arm.tar.gz) | `1c3bf4ac1e4eb0e02f785db725efd490beaf06c8acd26d694971ba510b60a94d`
|
||||
[kubernetes-client-linux-ppc64le.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-linux-ppc64le.tar.gz) | `172cd0af71fcba7c51e9476732dbe86ba251c03b1d74f912111e4e755be540ce`
|
||||
[kubernetes-client-windows-386.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-windows-386.tar.gz) | `f2d2f82d7e285c98d8cc58a8a6e13a1122c9f60bb2c73e4cefe3555f963e56cd`
|
||||
[kubernetes-client-windows-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-client-windows-amd64.tar.gz) | `ac0aa2b09dfeb8001e76f3aefe82c7bd2fda5bd0ef744ac3aed966b99c8dc8e5`
|
||||
|
||||
### Server Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-server-linux-amd64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-server-linux-amd64.tar.gz) | `bf0d3924ff84c95c316fcb4b21876cc019bd648ca8ab87fd6b2712ccda30992b`
|
||||
[kubernetes-server-linux-arm64.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-server-linux-arm64.tar.gz) | `45e88d1c8edc17d7f1deab8d040a769d8647203c465d76763abb1ce445a98773`
|
||||
[kubernetes-server-linux-arm.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-server-linux-arm.tar.gz) | `40ac46a265021615637f07d532cd563b4256dcf340a27c594bfd3501fe66b84c`
|
||||
[kubernetes-server-linux-ppc64le.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.10/kubernetes-server-linux-ppc64le.tar.gz) | `faa5075ab3e6688666bbbb274fa55a825513ee082a3b17bcddb5b8f4fd6f9aa0`
|
||||
|
||||
## Changelog since v1.3.9
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* gci: decouple from the built-in kubelet version ([#31367](https://github.com/kubernetes/kubernetes/pull/31367), [@Amey-D](https://github.com/Amey-D))
|
||||
* Bump GCE debian image to container-vm-v20161025 (CVE-2016-5195 Dirty… ([#35825](https://github.com/kubernetes/kubernetes/pull/35825), [@dchen1107](https://github.com/dchen1107))
|
||||
* Add RELEASE_INFRA_PUSH related code to support pushes from kubernetes/release. ([#28922](https://github.com/kubernetes/kubernetes/pull/28922), [@david-mcmahon](https://github.com/david-mcmahon))
|
||||
|
||||
|
||||
|
||||
# v1.3.9
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.9/kubernetes.tar.gz) | `a994c732d2b852bbee55a78601d50d046323021a99b0801aea07dacf64c2c59a`
|
||||
|
||||
## Changelog since v1.3.8
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Test x509 intermediates correctly ([#34524](https://github.com/kubernetes/kubernetes/pull/34524), [@liggitt](https://github.com/liggitt))
|
||||
* Remove headers that are unnecessary for proxy target ([#34076](https://github.com/kubernetes/kubernetes/pull/34076), [@mbohlool](https://github.com/mbohlool))
|
||||
|
||||
|
||||
|
||||
# v1.3.8
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.8/kubernetes.tar.gz) | `66cf72d8f07e2f700acfcb11536694e0d904483611ff154f34a8380c63720a8d`
|
||||
|
||||
## Changelog since v1.3.7
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* AWS: fix volume device assignment race condition ([#31090](https://github.com/kubernetes/kubernetes/pull/31090), [@justinsb](https://github.com/justinsb))
|
||||
|
||||
|
||||
|
||||
# v1.3.7
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.7/kubernetes.tar.gz) | `ad18566a09ff87b36107c2ea238fa5e20988d7a62c85df9c8598920679fec4a1`
|
||||
|
||||
## Changelog since v1.3.6
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* AWS: Add ap-south-1 to list of known AWS regions ([#28428](https://github.com/kubernetes/kubernetes/pull/28428), [@justinsb](https://github.com/justinsb))
|
||||
* Back porting critical vSphere bug fixes to release 1.3 ([#31993](https://github.com/kubernetes/kubernetes/pull/31993), [@dagnello](https://github.com/dagnello))
|
||||
* Back port - Openstack provider allowing more than one service port for lbaas v2 ([#32001](https://github.com/kubernetes/kubernetes/pull/32001), [@dagnello](https://github.com/dagnello))
|
||||
* Fix a bug in kubelet hostport logic which flushes KUBE-MARK-MASQ iptables chain ([#32413](https://github.com/kubernetes/kubernetes/pull/32413), [@freehan](https://github.com/freehan))
|
||||
* Fixes the panic that occurs in the federation controller manager when registering a GKE cluster to the federation. Fixes issue [#30790](https://github.com/kubernetes/kubernetes/pull/30790). ([#30940](https://github.com/kubernetes/kubernetes/pull/30940), [@madhusudancs](https://github.com/madhusudancs))
|
||||
|
||||
|
||||
|
||||
# v1.3.6
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.6/kubernetes.tar.gz) | `2db7ace2f72a2e162329a6dc969a5a158bb8c5d0f8054c5b1b2b1063aa22020d`
|
||||
|
||||
## Changelog since v1.3.5
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Addresses vSphere Volume Attach limits ([#29881](https://github.com/kubernetes/kubernetes/pull/29881), [@dagnello](https://github.com/dagnello))
|
||||
* Increase request timeout based on termination grace period ([#31275](https://github.com/kubernetes/kubernetes/pull/31275), [@dims](https://github.com/dims))
|
||||
* Skip safe to detach check if node API object no longer exists ([#30737](https://github.com/kubernetes/kubernetes/pull/30737), [@saad-ali](https://github.com/saad-ali))
|
||||
* Nodecontroller doesn't flip readiness on pods if kubeletVersion < 1.2.0 ([#30828](https://github.com/kubernetes/kubernetes/pull/30828), [@bprashanth](https://github.com/bprashanth))
|
||||
* Update cadvisor to v0.23.9 to fix a problem where attempting to gather container filesystem usage statistics could result in corrupted devicemapper thin pool storage for Docker. ([#30307](https://github.com/kubernetes/kubernetes/pull/30307), [@sjenning](https://github.com/sjenning))
|
||||
|
||||
|
||||
|
||||
# v1.3.5
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.5/kubernetes.tar.gz) | `46be88ce927124f7cef7e280720b42c63051086880b7ebdba298b561dbe19f82`
|
||||
|
||||
## Changelog since v1.3.4
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Update Dashboard UI to version v1.1.1 ([#30273](https://github.com/kubernetes/kubernetes/pull/30273), [@bryk](https://github.com/bryk))
|
||||
* allow restricting subresource access ([#30001](https://github.com/kubernetes/kubernetes/pull/30001), [@deads2k](https://github.com/deads2k))
|
||||
* Fix PVC.Status.Capacity and AccessModes after binding ([#29982](https://github.com/kubernetes/kubernetes/pull/29982), [@jsafrane](https://github.com/jsafrane))
|
||||
* oidc authentication plugin: don't trim issuer URLs with trailing slashes ([#29860](https://github.com/kubernetes/kubernetes/pull/29860), [@ericchiang](https://github.com/ericchiang))
|
||||
* network/cni: Bring up the `lo` interface for rkt ([#29310](https://github.com/kubernetes/kubernetes/pull/29310), [@euank](https://github.com/euank))
|
||||
* Fixing kube-up for CVM masters. ([#29140](https://github.com/kubernetes/kubernetes/pull/29140), [@maisem](https://github.com/maisem))
|
||||
|
||||
|
||||
|
||||
# v1.3.4
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.4/kubernetes.tar.gz) | `818acc1a8ba61cff434d4c0c5aa3d342d06e6907b565cfd8651b8cfcf3f0a1e6`
|
||||
|
||||
## Changelog since v1.3.3
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* NetworkPolicy cherry-pick 1.3 ([#29556](https://github.com/kubernetes/kubernetes/pull/29556), [@caseydavenport](https://github.com/caseydavenport))
|
||||
* Allow mounts to run in parallel for non-attachable volumes ([#28939](https://github.com/kubernetes/kubernetes/pull/28939), [@saad-ali](https://github.com/saad-ali))
|
||||
* add enhanced volume and mount logging for block devices ([#24797](https://github.com/kubernetes/kubernetes/pull/24797), [@screeley44](https://github.com/screeley44))
|
||||
* kube-up: increase download timeout for kubernetes.tar.gz ([#29426](https://github.com/kubernetes/kubernetes/pull/29426), [@justinsb](https://github.com/justinsb))
|
||||
* Fix RBAC authorizer of ServiceAccount ([#29071](https://github.com/kubernetes/kubernetes/pull/29071), [@albatross0](https://github.com/albatross0))
|
||||
* Update docker engine-api to dea108d3aa ([#29144](https://github.com/kubernetes/kubernetes/pull/29144), [@ronnielai](https://github.com/ronnielai))
|
||||
* Assume volume is detached if node doesn't exist ([#29485](https://github.com/kubernetes/kubernetes/pull/29485), [@saad-ali](https://github.com/saad-ali))
|
||||
* Make PD E2E Tests Wait for Detach to Prevent Kernel Errors ([#29031](https://github.com/kubernetes/kubernetes/pull/29031), [@saad-ali](https://github.com/saad-ali))
|
||||
* Fix "PVC Volume not detached if pod deleted via namespace deletion" issue ([#29077](https://github.com/kubernetes/kubernetes/pull/29077), [@saad-ali](https://github.com/saad-ali))
|
||||
* append an abac rule for $KUBE_USER. ([#29164](https://github.com/kubernetes/kubernetes/pull/29164), [@cjcullen](https://github.com/cjcullen))
|
||||
|
||||
|
||||
|
||||
# v1.3.3
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha256 hash
|
||||
------ | -----------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.3/kubernetes.tar.gz) | `a92a74a0d3f7d02d01ac2c8dfb5ee2e97b0485819e77b2110eb7c6b7c782478c`
|
||||
|
||||
## Changelog since v1.3.2
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Removing images with multiple tags ([#29316](https://github.com/kubernetes/kubernetes/pull/29316), [@ronnielai](https://github.com/ronnielai))
|
||||
* kubectl: don't display an empty list when trying to get a single resource that isn't found ([#28294](https://github.com/kubernetes/kubernetes/pull/28294), [@ncdc](https://github.com/ncdc))
|
||||
* Fix working_set calculation in kubelet ([#29154](https://github.com/kubernetes/kubernetes/pull/29154), [@vishh](https://github.com/vishh))
|
||||
* Don't delete affinity when endpoints are empty ([#28655](https://github.com/kubernetes/kubernetes/pull/28655), [@freehan](https://github.com/freehan))
|
||||
* GCE bring-up: Differentiate NODE_TAGS from NODE_INSTANCE_PREFIX ([#29141](https://github.com/kubernetes/kubernetes/pull/29141), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Fix logrotate config on GCI ([#29139](https://github.com/kubernetes/kubernetes/pull/29139), [@adityakali](https://github.com/adityakali))
|
||||
* Do not query the metadata server to find out if running on GCE. Retry metadata server query for gcr if running on gce. ([#28871](https://github.com/kubernetes/kubernetes/pull/28871), [@vishh](https://github.com/vishh))
|
||||
* Fix GPU resource validation ([#28743](https://github.com/kubernetes/kubernetes/pull/28743), [@therc](https://github.com/therc))
|
||||
* Scale kube-proxy conntrack limits by cores (new default behavior) ([#28876](https://github.com/kubernetes/kubernetes/pull/28876), [@thockin](https://github.com/thockin))
|
||||
* Don't recreate lb cloud resources on kcm restart ([#29082](https://github.com/kubernetes/kubernetes/pull/29082), [@bprashanth](https://github.com/bprashanth))
|
||||
|
||||
## Known Issues
|
||||
|
||||
There are a number of known issues that have been found and are being worked on.
|
||||
Please be aware of them as you test your workloads.
|
||||
|
||||
* PVC Volume not detached if pod deleted via namespace deletion ([29051](https://github.com/kubernetes/kubernetes/issues/29051))
|
||||
* Google Compute Engine PD Detach fails if node no longer exists ([29358](https://github.com/kubernetes/kubernetes/issues/29358))
|
||||
* Mounting (only 'default-token') volume takes a long time when creating a batch of pods (parallelization issue) ([28616](https://github.com/kubernetes/kubernetes/issues/28616))
|
||||
* Error while tearing down pod, "device or resource busy" on service account secret ([28750](https://github.com/kubernetes/kubernetes/issues/28750))
|
||||
|
||||
|
||||
|
||||
# v1.3.2
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.2/kubernetes.tar.gz) | `f46664d04dc2966c77d8727bba57f57b5f917572` | `1a5b0639941054585d0432dd5ce3abc7`
|
||||
|
||||
## Changelog since v1.3.1
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* List all nodes and occupy cidr map before starting allocations ([#29062](https://github.com/kubernetes/kubernetes/pull/29062), [@bprashanth](https://github.com/bprashanth))
|
||||
* Fix watch cache filtering ([#28968](https://github.com/kubernetes/kubernetes/pull/28968), [@liggitt](https://github.com/liggitt))
|
||||
* Lock all possible kubecfg files at the beginning of ModifyConfig. ([#28232](https://github.com/kubernetes/kubernetes/pull/28232), [@cjcullen](https://github.com/cjcullen))
|
||||
|
||||
|
||||
|
||||
# v1.3.1
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3.0/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.1/kubernetes.tar.gz) | `5645b12beda22137204439de8260c62c9925f89b` | `ae6e9902ec70c1322d9a0a29ef385190`
|
||||
|
||||
## Changelog since v1.3.0
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Fix watch cache filtering ([#29046](https://github.com/kubernetes/kubernetes/pull/29046), [@liggitt](https://github.com/liggitt))
|
||||
|
||||
|
||||
|
||||
# v1.3.0
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0/kubernetes.tar.gz) | `88249c443d438666928379aa7fe865b389ed72ea` | `9270f001aef8c03ff5db63456ca9eecc`
|
||||
|
||||
## Highlights
|
||||
|
||||
* Authorization:
|
||||
* **Alpha** RBAC authorization API group
|
||||
* Federation
|
||||
* federation api group is now **beta**
|
||||
* Services from all federated clusters are now registered in Cloud DNS (AWS and GCP).
|
||||
* Stateful Apps:
|
||||
* **alpha** PetSets manage stateful apps
|
||||
* **alpha** Init containers provide one-time setup for stateful containers
|
||||
* Updating:
|
||||
* Retry Pod/RC updates in kubectl rolling-update.
|
||||
* Stop 'kubectl drain' deleting pods with local storage.
|
||||
* Add `kubectl rollout status`
|
||||
* Security/Auth
|
||||
* L7 LB controller and disk attach controllers run on master, so nodes do not need those privileges.
|
||||
* Setting TLS1.2 minimum
|
||||
* `kubectl create secret tls` command
|
||||
* Webhook Token Authenticator
|
||||
* **beta** PodSecurityPolicy objects limits use of security-sensitive features by pods.
|
||||
* Kubectl
|
||||
* Display line number on JSON errors
|
||||
* Add flag -t as shorthand for --tty
|
||||
* Resources
|
||||
* Improved node stability by *optionally* evicting pods upon memory pressure - [Design Doc](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/proposals/kubelet-eviction.md)
|
||||
* **alpha**: NVIDIA GPU support ([#24836](https://github.com/kubernetes/kubernetes/pull/24836), [@therc](https://github.com/therc))
|
||||
* Adding loadBalancer services and nodeports services to quota system
|
||||
|
||||
## Known Issues and Important Steps before Upgrading
|
||||
|
||||
The following versions of Docker Engine are supported - *[v1.10](https://github.com/kubernetes/kubernetes/issues/19720)*, *[v1.11](https://github.com/kubernetes/kubernetes/issues/23397)*
|
||||
Although *v1.9* is still compatible, we recommend upgrading to one of the supported versions.
|
||||
All prior versions of docker will not be supported.
|
||||
|
||||
#### ThirdPartyResource
|
||||
|
||||
If you use ThirdPartyResource objects, they have moved from being namespaced-scoped to be cluster-scoped. Before upgrading to 1.3.0, export and delete any existing ThirdPartyResource objects using a 1.2.x client:
|
||||
|
||||
kubectl get thirdpartyresource --all-namespaces -o yaml > tprs.yaml
|
||||
kubectl delete -f tprs.yaml
|
||||
|
||||
After upgrading to 1.3.0, re-register the third party resource objects at the root scope (using a 1.3 server and client):
|
||||
|
||||
kubectl create -f tprs.yaml
|
||||
|
||||
#### kubectl
|
||||
|
||||
Kubectl flag `--container-port` flag is deprecated: it will be removed in the future, please use `--target-port` instead.
|
||||
|
||||
#### kubernetes Core Known Issues
|
||||
|
||||
- Kube Proxy crashes infrequently due to a docker bug ([#24000](https://github.com/docker/docker/issues/24000))
|
||||
- This issue can be resolved by restarting docker daemon
|
||||
- CORS works only in insecure mode ([#24086](https://github.com/kubernetes/kubernetes/issues/24086))
|
||||
- Persistent volume claims gets added incorrectly after being deleted under stress. Happens very infrequently. ([#26082](https://github.com/kubernetes/kubernetes/issues/26082))
|
||||
|
||||
#### Docker runtime Known Issues
|
||||
|
||||
- Kernel crash with Aufs storage driver on Debian Jessie ([#27885](https://github.com/kubernetes/kubernetes/issues/27885))
|
||||
- Consider running the *new* [kubernetes node problem detector](https://github.com/kubernetes/node-problem-detector) to identify this (and other) kernel issues automatically.
|
||||
|
||||
- File descriptors are leaked in docker v1.11 ([#275](https://github.com/docker/containerd/issues/275))
|
||||
- Additional memory overhead per container in docker v1.11 ([#21737](https://github.com/docker/docker/issues/21737))
|
||||
- [List of upstream fixes](https://github.com/docker/docker/compare/v1.10.3...runcom:docker-1.10.3-stable) for docker v1.10 identified by RedHat
|
||||
|
||||
#### Rkt runtime Known Issues
|
||||
|
||||
- A detailed list of known issues can be found [here](https://github.com/kubernetes/kubernetes.github.io/blob/release-1.3/docs/getting-started-guides/rkt/notes.md)
|
||||
|
||||
*More Instructions coming soon*
|
||||
|
||||
## Provider-specific Notes
|
||||
|
||||
* AWS
|
||||
* Support for ap-northeast-2 region (Seoul)
|
||||
* Allow cross-region image pulling with ECR
|
||||
* More reliable kube-up/kube-down
|
||||
* Enable ICMP Type 3 Code 4 for ELBs
|
||||
* ARP caching fix
|
||||
* Use /dev/xvdXX names
|
||||
* ELB:
|
||||
* ELB proxy protocol support
|
||||
* mixed plaintext/encrypted ports support in ELBs
|
||||
* SSL support for ELB listeners
|
||||
* Allow VPC CIDR to be specified (experimental)
|
||||
* Fix problems with >2 security groups
|
||||
* GCP:
|
||||
* Enable using gcr.io as a Docker registry mirror.
|
||||
* Make bigger master root disks in GCE for large clusters.
|
||||
* Change default clusterCIDRs from /16 to /14 allowing 1000 Node clusters by default.
|
||||
* Allow Debian Jessie on GCE.
|
||||
* Node problem detector addon pod detects and reports kernel deadlocks.
|
||||
* OpenStack
|
||||
* Provider added.
|
||||
* VSphere:
|
||||
* Provider updated.
|
||||
|
||||
## Previous Releases Included in v1.3.0
|
||||
|
||||
- [v1.3.0-beta.3](CHANGELOG.md#v130-beta3)
|
||||
- [v1.3.0-beta.2](CHANGELOG.md#v130-beta2)
|
||||
- [v1.3.0-beta.1](CHANGELOG.md#v130-beta1)
|
||||
- [v1.3.0-alpha.5](CHANGELOG.md#v130-alpha5)
|
||||
- [v1.3.0-alpha.4](CHANGELOG.md#v130-alpha4)
|
||||
- [v1.3.0-alpha.3](CHANGELOG.md#v130-alpha3)
|
||||
- [v1.3.0-alpha.2](CHANGELOG.md#v130-alpha2)
|
||||
- [v1.3.0-alpha.1](CHANGELOG.md#v130-alpha1)
|
||||
|
||||
|
||||
|
||||
# v1.3.0-beta.3
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-beta.3/kubernetes.tar.gz) | `9d18964a294f356bfdc841957dcad8ff35ed909c` | `ee5fcdf86645135ed132663967876dd6`
|
||||
|
||||
## Changelog since v1.3.0-beta.2
|
||||
|
||||
### Action Required
|
||||
|
||||
* [kubelet] Allow opting out of automatic cloud provider detection in kubelet. By default kubelet will auto-detect cloud providers ([#28258](https://github.com/kubernetes/kubernetes/pull/28258), [@vishh](https://github.com/vishh))
|
||||
* If you use one of the kube-dns replication controller manifest in `cluster/saltbase/salt/kube-dns`, i.e. `cluster/saltbase/salt/kube-dns/{skydns-rc.yaml.base,skydns-rc.yaml.in}`, either substitute one of `__PILLAR__FEDERATIONS__DOMAIN__MAP__` or `{{ pillar['federations_domain_map'] }}` with the corresponding federation name to domain name value or remove them if you do not support cluster federation at this time. If you plan to substitute the parameter with its value, here is an example for `{{ pillar['federations_domain_map'] }` ([#28132](https://github.com/kubernetes/kubernetes/pull/28132), [@madhusudancs](https://github.com/madhusudancs))
|
||||
* pillar['federations_domain_map'] = "- --federations=myfederation=federation.test"
|
||||
* where `myfederation` is the name of the federation and `federation.test` is the domain name registered for the federation.
|
||||
* federation: Upgrading the groupversion to v1beta1 ([#28186](https://github.com/kubernetes/kubernetes/pull/28186), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Set Dashboard UI version to v1.1.0 ([#27869](https://github.com/kubernetes/kubernetes/pull/27869), [@bryk](https://github.com/bryk))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Build: Add KUBE_GCS_RELEASE_BUCKET_MIRROR option to push-ci-build.sh ([#28172](https://github.com/kubernetes/kubernetes/pull/28172), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Image GC logic should compensate for reserved blocks ([#27996](https://github.com/kubernetes/kubernetes/pull/27996), [@ronnielai](https://github.com/ronnielai))
|
||||
* Bump minimum API version for docker to 1.21 ([#27208](https://github.com/kubernetes/kubernetes/pull/27208), [@yujuhong](https://github.com/yujuhong))
|
||||
* Adding lock files for kubeconfig updating ([#28034](https://github.com/kubernetes/kubernetes/pull/28034), [@krousey](https://github.com/krousey))
|
||||
* federation service controller: fixing the logic to update DNS records ([#27999](https://github.com/kubernetes/kubernetes/pull/27999), [@quinton-hoole](https://github.com/quinton-hoole))
|
||||
* federation: Updating KubeDNS to try finding a local service first for federation query ([#27708](https://github.com/kubernetes/kubernetes/pull/27708), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Support journal logs in fluentd-gcp on GCI ([#27981](https://github.com/kubernetes/kubernetes/pull/27981), [@a-robinson](https://github.com/a-robinson))
|
||||
* Copy and display source location prominently on Kubernetes instances ([#27985](https://github.com/kubernetes/kubernetes/pull/27985), [@maisem](https://github.com/maisem))
|
||||
* Federation e2e support for AWS ([#27791](https://github.com/kubernetes/kubernetes/pull/27791), [@colhom](https://github.com/colhom))
|
||||
* Copy and display source location prominently on Kubernetes instances ([#27840](https://github.com/kubernetes/kubernetes/pull/27840), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* AWS/GCE: Spread PetSet volume creation across zones, create GCE volumes in non-master zones ([#27553](https://github.com/kubernetes/kubernetes/pull/27553), [@justinsb](https://github.com/justinsb))
|
||||
* GCE provider: Create TargetPool with 200 instances, then update with rest ([#27829](https://github.com/kubernetes/kubernetes/pull/27829), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Add sources to server tarballs. ([#27830](https://github.com/kubernetes/kubernetes/pull/27830), [@david-mcmahon](https://github.com/david-mcmahon))
|
||||
* Retry Pod/RC updates in kubectl rolling-update ([#27509](https://github.com/kubernetes/kubernetes/pull/27509), [@janetkuo](https://github.com/janetkuo))
|
||||
* AWS kube-up: Authorize route53 in the IAM policy ([#27794](https://github.com/kubernetes/kubernetes/pull/27794), [@justinsb](https://github.com/justinsb))
|
||||
* Allow conformance tests to run on non-GCE providers ([#26932](https://github.com/kubernetes/kubernetes/pull/26932), [@aaronlevy](https://github.com/aaronlevy))
|
||||
* AWS kube-up: move to Docker 1.11.2 ([#27676](https://github.com/kubernetes/kubernetes/pull/27676), [@justinsb](https://github.com/justinsb))
|
||||
* Fixed an issue that Deployment may be scaled down further than allowed by maxUnavailable when minReadySeconds is set. ([#27728](https://github.com/kubernetes/kubernetes/pull/27728), [@janetkuo](https://github.com/janetkuo))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-beta.2
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-beta.2/kubernetes.tar.gz) | `9c95762970b943d6c6547f0841c1e5471148b0e3` | `dc9e8560f24459b2313317b15910bee7`
|
||||
|
||||
## Changes since v1.3.0-beta.1
|
||||
|
||||
### Experimental Features
|
||||
|
||||
* Init containers enable pod authors to perform tasks before their normal containers start. Each init container is started in order, and failing containers will prevent the application from starting. ([#23666](https://github.com/kubernetes/kubernetes/pull/23666), [@smarterclayton](https://github.com/smarterclayton))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* GCE provider: Limit Filter calls to regexps rather than large blobs ([#27741](https://github.com/kubernetes/kubernetes/pull/27741), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Show LASTSEEN, the sorting key, as the first column in `kubectl get event` output ([#27549](https://github.com/kubernetes/kubernetes/pull/27549), [@therc](https://github.com/therc))
|
||||
* GCI: fix kubectl permission issue [#27643](https://github.com/kubernetes/kubernetes/pull/27643) ([#27740](https://github.com/kubernetes/kubernetes/pull/27740), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Add federation api and cm servers to hyperkube ([#27586](https://github.com/kubernetes/kubernetes/pull/27586), [@colhom](https://github.com/colhom))
|
||||
* federation: Creating kubeconfig files to be used for creating secrets for clusters on aws and gke ([#27332](https://github.com/kubernetes/kubernetes/pull/27332), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* AWS: Enable ICMP Type 3 Code 4 for ELBs ([#27677](https://github.com/kubernetes/kubernetes/pull/27677), [@justinsb](https://github.com/justinsb))
|
||||
* Bumped Heapster to v1.1.0. ([#27542](https://github.com/kubernetes/kubernetes/pull/27542), [@piosz](https://github.com/piosz))
|
||||
* More details about the release https://github.com/kubernetes/heapster/releases/tag/v1.1.0
|
||||
* Deleting federation-push.sh ([#27400](https://github.com/kubernetes/kubernetes/pull/27400), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Validate-cluster finishes shortly after at most ALLOWED_NOTREADY_NODE… ([#26778](https://github.com/kubernetes/kubernetes/pull/26778), [@gmarek](https://github.com/gmarek))
|
||||
* AWS kube-down: Issue warning if VPC not found ([#27518](https://github.com/kubernetes/kubernetes/pull/27518), [@justinsb](https://github.com/justinsb))
|
||||
* gce/kube-down: Parallelize IGM deletion, batch more ([#27302](https://github.com/kubernetes/kubernetes/pull/27302), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Enable dynamic allocation of heapster/eventer cpu request/limit ([#27185](https://github.com/kubernetes/kubernetes/pull/27185), [@gmarek](https://github.com/gmarek))
|
||||
* 'kubectl describe pv' now shows events ([#27431](https://github.com/kubernetes/kubernetes/pull/27431), [@jsafrane](https://github.com/jsafrane))
|
||||
* AWS kube-up: set net.ipv4.neigh.default.gc_thresh1=0 to avoid ARP over-caching ([#27682](https://github.com/kubernetes/kubernetes/pull/27682), [@justinsb](https://github.com/justinsb))
|
||||
* AWS volumes: Use /dev/xvdXX names with EC2 ([#27628](https://github.com/kubernetes/kubernetes/pull/27628), [@justinsb](https://github.com/justinsb))
|
||||
* Add a test config variable to specify desired Docker version to run on GCI. ([#26813](https://github.com/kubernetes/kubernetes/pull/26813), [@wonderfly](https://github.com/wonderfly))
|
||||
* Check for thin_is binary in path for devicemapper when using ThinPoolWatcher and fix uint64 overflow issue for CPU stats ([#27591](https://github.com/kubernetes/kubernetes/pull/27591), [@dchen1107](https://github.com/dchen1107))
|
||||
* Change default value of deleting-pods-burst to 1 ([#27606](https://github.com/kubernetes/kubernetes/pull/27606), [@gmarek](https://github.com/gmarek))
|
||||
* MESOS: fix race condition in contrib/mesos/pkg/queue/delay ([#24916](https://github.com/kubernetes/kubernetes/pull/24916), [@jdef](https://github.com/jdef))
|
||||
* including federation binaries in the list of images we push during release ([#27396](https://github.com/kubernetes/kubernetes/pull/27396), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* fix updatePod() of RS and RC controllers ([#27415](https://github.com/kubernetes/kubernetes/pull/27415), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Change default value of deleting-pods-burst to 1 ([#27422](https://github.com/kubernetes/kubernetes/pull/27422), [@gmarek](https://github.com/gmarek))
|
||||
* A new volume manager was introduced in kubelet that synchronizes volume mount/unmount (and attach/detach, if attach/detach controller is not enabled). ([#26801](https://github.com/kubernetes/kubernetes/pull/26801), [@saad-ali](https://github.com/saad-ali))
|
||||
* This eliminates the race conditions between the pod creation loop and the orphaned volumes loops. It also removes the unmount/detach from the `syncPod()` path so volume clean up never blocks the `syncPod` loop.
|
||||
|
||||
|
||||
|
||||
# v1.3.0-beta.1
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/release-1.3/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-beta.1/kubernetes.tar.gz) | `2b54995ee8f52d78dc31c3d7291e8dfa5c809fe7` | `f1022a84c3441cae4ebe1d295470be8f`
|
||||
|
||||
## Changes since v1.3.0-alpha.5
|
||||
|
||||
### Action Required
|
||||
|
||||
* Fixing logic to generate ExternalHost in genericapiserver ([#26796](https://github.com/kubernetes/kubernetes/pull/26796), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* federation: Updating federation-controller-manager to use secret to get federation-apiserver's kubeconfig ([#26819](https://github.com/kubernetes/kubernetes/pull/26819), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* federation: fix dns provider initialization issues ([#27252](https://github.com/kubernetes/kubernetes/pull/27252), [@mfanjie](https://github.com/mfanjie))
|
||||
* Updating federation up scripts to work in non e2e setup ([#27260](https://github.com/kubernetes/kubernetes/pull/27260), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* version bump for gci to milestone 53 ([#27210](https://github.com/kubernetes/kubernetes/pull/27210), [@adityakali](https://github.com/adityakali))
|
||||
* kubectl apply: retry applying a patch if a version conflict error is encountered ([#26557](https://github.com/kubernetes/kubernetes/pull/26557), [@AdoHe](https://github.com/AdoHe))
|
||||
* Revert "Wait for arc.getArchive() to complete before running tests" ([#27130](https://github.com/kubernetes/kubernetes/pull/27130), [@pwittrock](https://github.com/pwittrock))
|
||||
* ResourceQuota BestEffort scope aligned with Pod level QoS ([#26969](https://github.com/kubernetes/kubernetes/pull/26969), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* The AWS cloudprovider will cache results from DescribeInstances() if the set of nodes hasn't changed ([#26900](https://github.com/kubernetes/kubernetes/pull/26900), [@therc](https://github.com/therc))
|
||||
* GCE provider: Log full contents of long operations ([#26962](https://github.com/kubernetes/kubernetes/pull/26962), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Fix system container detection in kubelet on systemd. ([#26586](https://github.com/kubernetes/kubernetes/pull/26586), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* This fixed environments where CPU and Memory Accounting were not enabled on the unit that launched the kubelet or docker from reporting the root cgroup when monitoring usage stats for those components.
|
||||
* New default horizontalpodautoscaler/v1 generator for kubectl autoscale. ([#26775](https://github.com/kubernetes/kubernetes/pull/26775), [@piosz](https://github.com/piosz))
|
||||
* Use autoscaling/v1 in kubectl by default.
|
||||
* federation: Adding dnsprovider flags to federation-controller-manager ([#27158](https://github.com/kubernetes/kubernetes/pull/27158), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* federation service controller: fixing a bug so that existing services are created in newly registered clusters ([#27028](https://github.com/kubernetes/kubernetes/pull/27028), [@mfanjie](https://github.com/mfanjie))
|
||||
* Rename environment variables (KUBE_)ENABLE_NODE_AUTOSCALER to (KUBE_)ENABLE_CLUSTER_AUTOSCALER. ([#27117](https://github.com/kubernetes/kubernetes/pull/27117), [@mwielgus](https://github.com/mwielgus))
|
||||
* support for mounting local-ssds on GCI ([#27143](https://github.com/kubernetes/kubernetes/pull/27143), [@adityakali](https://github.com/adityakali))
|
||||
* AWS: support mixed plaintext/encrypted ports in ELBs via service.beta.kubernetes.io/aws-load-balancer-ssl-ports annotation ([#26976](https://github.com/kubernetes/kubernetes/pull/26976), [@therc](https://github.com/therc))
|
||||
* Updating e2e docs with instructions on running federation tests ([#27072](https://github.com/kubernetes/kubernetes/pull/27072), [@colhom](https://github.com/colhom))
|
||||
* LBaaS v2 Support for Openstack Cloud Provider Plugin ([#25987](https://github.com/kubernetes/kubernetes/pull/25987), [@dagnello](https://github.com/dagnello))
|
||||
* GCI: add support for network plugin ([#27027](https://github.com/kubernetes/kubernetes/pull/27027), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Bump cAdvisor to v0.23.3 ([#27065](https://github.com/kubernetes/kubernetes/pull/27065), [@timstclair](https://github.com/timstclair))
|
||||
* Stop 'kubectl drain' deleting pods with local storage. ([#26667](https://github.com/kubernetes/kubernetes/pull/26667), [@mml](https://github.com/mml))
|
||||
* Networking e2es: Wait for all nodes to be schedulable in kubeproxy and networking tests ([#27008](https://github.com/kubernetes/kubernetes/pull/27008), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* change clientset of service controller to versioned ([#26694](https://github.com/kubernetes/kubernetes/pull/26694), [@mfanjie](https://github.com/mfanjie))
|
||||
* Use gcr.io as a Docker registry mirror when setting up a cluster in GCE. ([#25841](https://github.com/kubernetes/kubernetes/pull/25841), [@ojarjur](https://github.com/ojarjur))
|
||||
* correction on rbd volume object and defaults ([#25490](https://github.com/kubernetes/kubernetes/pull/25490), [@rootfs](https://github.com/rootfs))
|
||||
* Bump GCE debian image to container-v1-3-v20160604 ([#26851](https://github.com/kubernetes/kubernetes/pull/26851), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Option to enable http2 on client connections. ([#25280](https://github.com/kubernetes/kubernetes/pull/25280), [@timothysc](https://github.com/timothysc))
|
||||
* kubectl get ingress output remove rules ([#26684](https://github.com/kubernetes/kubernetes/pull/26684), [@AdoHe](https://github.com/AdoHe))
|
||||
* AWS kube-up: Remove SecurityContextDeny admission controller (to mirror GCE) ([#25381](https://github.com/kubernetes/kubernetes/pull/25381), [@zquestz](https://github.com/zquestz))
|
||||
* Fix third party ([#25894](https://github.com/kubernetes/kubernetes/pull/25894), [@brendandburns](https://github.com/brendandburns))
|
||||
* AWS Route53 dnsprovider ([#26049](https://github.com/kubernetes/kubernetes/pull/26049), [@quinton-hoole](https://github.com/quinton-hoole))
|
||||
* GCI/Trusty: support the Docker registry mirror ([#26745](https://github.com/kubernetes/kubernetes/pull/26745), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Kubernetes v1.3 introduces a new Attach/Detach Controller. This controller manages attaching and detaching of volumes on-behalf of nodes. ([#26351](https://github.com/kubernetes/kubernetes/pull/26351), [@saad-ali](https://github.com/saad-ali))
|
||||
* This ensures that attachment and detachment of volumes is independent of any single nodes’ availability. Meaning, if a node or kubelet becomes unavailable for any reason, the volumes attached to that node will be detached so they are free to be attached to other nodes.
|
||||
* Specifically the new controller watches the API server for scheduled pods. It processes each pod and ensures that any volumes that implement the volume Attacher interface are attached to the node their pod is scheduled to.
|
||||
* When a pod is deleted, the controller waits for the volume to be safely unmounted by kubelet. It does this by waiting for the volume to no longer be present in the nodes Node.Status.VolumesInUse list. If the volume is not safely unmounted by kubelet within a pre-configured duration (3 minutes in Kubernetes v1.3), the controller unilaterally detaches the volume (this prevents volumes from getting stranded on nodes that become unavailable).
|
||||
* In order to remain backwards compatible, the new controller only manages attach/detach of volumes that are scheduled to nodes that opt-in to controller management. Nodes running v1.3 or higher of Kubernetes opt-in to controller management by default by setting the "volumes.kubernetes.io/controller-managed-attach-detach" annotation on the Node object on startup. This behavior is gated by a new kubelet flag, "enable-controller-attach-detach,” (default true).
|
||||
* In order to safely upgrade an existing Kubernetes cluster without interruption of volume attach/detach logic:
|
||||
* First upgrade the master to Kubernetes v1.3.
|
||||
* This will start the new attach/detach controller.
|
||||
* The new controller will initially ignore volumes for all nodes since they lack the "volumes.kubernetes.io/controller-managed-attach-detach" annotation.
|
||||
* Then upgrade nodes to Kubernetes v1.3.
|
||||
* As nodes are upgraded, they will automatically, by default, opt-in to attach/detach controller management, which will cause the controller to start managing attaches/detaches for volumes that get scheduled to those nodes.
|
||||
* Added DNS Reverse Record logic for service IPs ([#26226](https://github.com/kubernetes/kubernetes/pull/26226), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* read gluster log to surface glusterfs plugin errors properly in describe events ([#24808](https://github.com/kubernetes/kubernetes/pull/24808), [@screeley44](https://github.com/screeley44))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-alpha.5
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/master/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-alpha.5/kubernetes.tar.gz) | `724bf5a4437ca9dc75d9297382f47a179e8dc5a6` | `2a8b4a5297df3007fce69f1e344fd87e`
|
||||
|
||||
## Changes since v1.3.0-alpha.4
|
||||
|
||||
### Action Required
|
||||
|
||||
* Add direct serializer ([#26251](https://github.com/kubernetes/kubernetes/pull/26251), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Add a NodeCondition "NetworkUnavailable" to prevent scheduling onto a node until the routes have been created ([#26415](https://github.com/kubernetes/kubernetes/pull/26415), [@wojtek-t](https://github.com/wojtek-t))
|
||||
* Add garbage collector into kube-controller-manager ([#26341](https://github.com/kubernetes/kubernetes/pull/26341), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Add orphaning finalizer logic to GC ([#25599](https://github.com/kubernetes/kubernetes/pull/25599), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* GCI-backed masters mount srv/kubernetes and srv/sshproxy in the right place ([#26238](https://github.com/kubernetes/kubernetes/pull/26238), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* Updaing QoS policy to be at the pod level ([#14943](https://github.com/kubernetes/kubernetes/pull/14943), [@vishh](https://github.com/vishh))
|
||||
* add CIDR allocator for NodeController ([#19242](https://github.com/kubernetes/kubernetes/pull/19242), [@mqliang](https://github.com/mqliang))
|
||||
* Adding garbage collector controller ([#24509](https://github.com/kubernetes/kubernetes/pull/24509), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Fix a bug with pluralization of third party resources ([#25374](https://github.com/kubernetes/kubernetes/pull/25374), [@brendandburns](https://github.com/brendandburns))
|
||||
* Run l7 controller on master ([#26048](https://github.com/kubernetes/kubernetes/pull/26048), [@bprashanth](https://github.com/bprashanth))
|
||||
* AWS: ELB proxy protocol support via annotation service.beta.kubernetes.io/aws-load-balancer-proxy-protocol ([#24569](https://github.com/kubernetes/kubernetes/pull/24569), [@williamsandrew](https://github.com/williamsandrew))
|
||||
* kubectl run --restart=Never creates pods ([#25253](https://github.com/kubernetes/kubernetes/pull/25253), [@soltysh](https://github.com/soltysh))
|
||||
* Add LabelSelector to PersistentVolumeClaimSpec ([#25917](https://github.com/kubernetes/kubernetes/pull/25917), [@pmorie](https://github.com/pmorie))
|
||||
* Removed metrics api group ([#26073](https://github.com/kubernetes/kubernetes/pull/26073), [@piosz](https://github.com/piosz))
|
||||
* Fixed check in kubectl autoscale: cpu consumption can be higher than 100%. ([#26162](https://github.com/kubernetes/kubernetes/pull/26162), [@jszczepkowski](https://github.com/jszczepkowski))
|
||||
* Add support for 3rd party objects to kubectl label ([#24882](https://github.com/kubernetes/kubernetes/pull/24882), [@brendandburns](https://github.com/brendandburns))
|
||||
* Move shell completion generation into 'kubectl completion' command ([#23801](https://github.com/kubernetes/kubernetes/pull/23801), [@sttts](https://github.com/sttts))
|
||||
* Fix strategic merge diff list diff bug ([#26418](https://github.com/kubernetes/kubernetes/pull/26418), [@AdoHe](https://github.com/AdoHe))
|
||||
* Setting TLS1.2 minimum because TLS1.0 and TLS1.1 are vulnerable ([#26169](https://github.com/kubernetes/kubernetes/pull/26169), [@victorgp](https://github.com/victorgp))
|
||||
* Kubelet: Periodically reporting image pulling progress in log ([#26145](https://github.com/kubernetes/kubernetes/pull/26145), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* Federation service controller is one key component of federation controller manager, it watches federation service, creates/updates services to all registered clusters, and update DNS records to global DNS server. ([#26034](https://github.com/kubernetes/kubernetes/pull/26034), [@mfanjie](https://github.com/mfanjie))
|
||||
* Stabilize map order in kubectl describe ([#26046](https://github.com/kubernetes/kubernetes/pull/26046), [@timoreimann](https://github.com/timoreimann))
|
||||
* Google Cloud DNS dnsprovider - replacement for [#25389](https://github.com/kubernetes/kubernetes/pull/25389) ([#26020](https://github.com/kubernetes/kubernetes/pull/26020), [@quinton-hoole](https://github.com/quinton-hoole))
|
||||
* Fix system container detection in kubelet on systemd. ([#25982](https://github.com/kubernetes/kubernetes/pull/25982), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* This fixed environments where CPU and Memory Accounting were not enabled on the unit
|
||||
* that launched the kubelet or docker from reporting the root cgroup when
|
||||
* monitoring usage stats for those components.
|
||||
* Added pods-per-core to kubelet. [#25762](https://github.com/kubernetes/kubernetes/pull/25762) ([#25813](https://github.com/kubernetes/kubernetes/pull/25813), [@rrati](https://github.com/rrati))
|
||||
* promote sourceRange into service spec ([#25826](https://github.com/kubernetes/kubernetes/pull/25826), [@freehan](https://github.com/freehan))
|
||||
* kube-controller-manager: Add configure-cloud-routes option ([#25614](https://github.com/kubernetes/kubernetes/pull/25614), [@justinsb](https://github.com/justinsb))
|
||||
* kubelet: reading cloudinfo from cadvisor ([#21373](https://github.com/kubernetes/kubernetes/pull/21373), [@enoodle](https://github.com/enoodle))
|
||||
* Disable cAdvisor event storage by default ([#24771](https://github.com/kubernetes/kubernetes/pull/24771), [@timstclair](https://github.com/timstclair))
|
||||
* Remove docker-multinode ([#26031](https://github.com/kubernetes/kubernetes/pull/26031), [@luxas](https://github.com/luxas))
|
||||
* nodecontroller: Fix log message on successful update ([#26207](https://github.com/kubernetes/kubernetes/pull/26207), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* remove deprecated generated typed clients ([#26336](https://github.com/kubernetes/kubernetes/pull/26336), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Kubenet host-port support through iptables ([#25604](https://github.com/kubernetes/kubernetes/pull/25604), [@freehan](https://github.com/freehan))
|
||||
* Add metrics support for a GCE PD, EC2 EBS & Azure File volumes ([#25852](https://github.com/kubernetes/kubernetes/pull/25852), [@vishh](https://github.com/vishh))
|
||||
* Bump cAdvisor to v0.23.2 - See [changelog](https://github.com/google/cadvisor/blob/master/CHANGELOG.md) for details ([#25914](https://github.com/kubernetes/kubernetes/pull/25914), [@timstclair](https://github.com/timstclair))
|
||||
* Alpha version of "Role Based Access Control" API. ([#25634](https://github.com/kubernetes/kubernetes/pull/25634), [@ericchiang](https://github.com/ericchiang))
|
||||
* Add Seccomp API ([#25324](https://github.com/kubernetes/kubernetes/pull/25324), [@jfrazelle](https://github.com/jfrazelle))
|
||||
* AWS: Fix long-standing bug in stringSetToPointers ([#26331](https://github.com/kubernetes/kubernetes/pull/26331), [@therc](https://github.com/therc))
|
||||
* Add dnsmasq as a DNS cache in kube-dns pod ([#26114](https://github.com/kubernetes/kubernetes/pull/26114), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* routecontroller: Add wait.NonSlidingUntil, use it ([#26301](https://github.com/kubernetes/kubernetes/pull/26301), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Attempt 2: Bump GCE containerVM to container-v1-3-v20160517 (Docker 1.11.1) again. ([#26001](https://github.com/kubernetes/kubernetes/pull/26001), [@dchen1107](https://github.com/dchen1107))
|
||||
* Downward API implementation for resources limits and requests ([#24179](https://github.com/kubernetes/kubernetes/pull/24179), [@aveshagarwal](https://github.com/aveshagarwal))
|
||||
* GCE clusters start using GCI as the default OS image for masters ([#26197](https://github.com/kubernetes/kubernetes/pull/26197), [@wonderfly](https://github.com/wonderfly))
|
||||
* Add a 'kubectl clusterinfo dump' option ([#20672](https://github.com/kubernetes/kubernetes/pull/20672), [@brendandburns](https://github.com/brendandburns))
|
||||
* Fixing heapster memory requirements. ([#26109](https://github.com/kubernetes/kubernetes/pull/26109), [@Q-Lee](https://github.com/Q-Lee))
|
||||
* Handle federated service name lookups in kube-dns. ([#25727](https://github.com/kubernetes/kubernetes/pull/25727), [@madhusudancs](https://github.com/madhusudancs))
|
||||
* Support sort-by timestamp in kubectl get ([#25600](https://github.com/kubernetes/kubernetes/pull/25600), [@janetkuo](https://github.com/janetkuo))
|
||||
* vSphere Volume Plugin Implementation ([#24947](https://github.com/kubernetes/kubernetes/pull/24947), [@abithap](https://github.com/abithap))
|
||||
* ResourceQuota controller uses rate limiter to prevent hot-loops in error situations ([#25748](https://github.com/kubernetes/kubernetes/pull/25748), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Fix hyperkube flag parsing ([#25512](https://github.com/kubernetes/kubernetes/pull/25512), [@colhom](https://github.com/colhom))
|
||||
* Add a kubectl create secret tls command ([#24719](https://github.com/kubernetes/kubernetes/pull/24719), [@bprashanth](https://github.com/bprashanth))
|
||||
* Introduce a new add-on pod NodeProblemDetector. ([#25986](https://github.com/kubernetes/kubernetes/pull/25986), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* NodeProblemDetector is a DaemonSet running on each node, monitoring node health and reporting
|
||||
* node problems as NodeCondition and Event. Currently it already supports kernel log monitoring, and
|
||||
* will support more problem detection in the future. It is enabled by default on gce now.
|
||||
* Handle cAdvisor partial failures ([#25933](https://github.com/kubernetes/kubernetes/pull/25933), [@timstclair](https://github.com/timstclair))
|
||||
* Use SkyDNS as a library for a more integrated kube DNS ([#23930](https://github.com/kubernetes/kubernetes/pull/23930), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* Introduce node memory pressure condition to scheduler ([#25531](https://github.com/kubernetes/kubernetes/pull/25531), [@ingvagabund](https://github.com/ingvagabund))
|
||||
* Fix detection of docker cgroup on RHEL ([#25907](https://github.com/kubernetes/kubernetes/pull/25907), [@ncdc](https://github.com/ncdc))
|
||||
* Kubelet evicts pods when available memory falls below configured eviction thresholds ([#25772](https://github.com/kubernetes/kubernetes/pull/25772), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Use protobufs by default to communicate with apiserver (still store JSONs in etcd) ([#25738](https://github.com/kubernetes/kubernetes/pull/25738), [@wojtek-t](https://github.com/wojtek-t))
|
||||
* Implement NetworkPolicy v1beta1 API object / client support. ([#25638](https://github.com/kubernetes/kubernetes/pull/25638), [@caseydavenport](https://github.com/caseydavenport))
|
||||
* Only expose top N images in `NodeStatus` ([#25328](https://github.com/kubernetes/kubernetes/pull/25328), [@resouer](https://github.com/resouer))
|
||||
* Extend secrets volumes with path control ([#25285](https://github.com/kubernetes/kubernetes/pull/25285), [@ingvagabund](https://github.com/ingvagabund))
|
||||
* With this PR, kubectl and other RestClient's using the AuthProvider framework can make OIDC authenticated requests, and, if there is a refresh token present, the tokens will be refreshed as needed. ([#25270](https://github.com/kubernetes/kubernetes/pull/25270), [@bobbyrullo](https://github.com/bobbyrullo))
|
||||
* Make addon-manager cross-platform and use it with hyperkube ([#25631](https://github.com/kubernetes/kubernetes/pull/25631), [@luxas](https://github.com/luxas))
|
||||
* kubelet: Optionally, have kubelet exit if lock file contention is observed, using --exit-on-lock-contention flag ([#25596](https://github.com/kubernetes/kubernetes/pull/25596), [@derekparker](https://github.com/derekparker))
|
||||
* Bump up glbc version to 0.6.2 ([#25446](https://github.com/kubernetes/kubernetes/pull/25446), [@bprashanth](https://github.com/bprashanth))
|
||||
* Add "kubectl set image" for easier updating container images (for pods or resources with pod templates). ([#25509](https://github.com/kubernetes/kubernetes/pull/25509), [@janetkuo](https://github.com/janetkuo))
|
||||
* NodeController doesn't evict Pods if no Nodes are Ready ([#25571](https://github.com/kubernetes/kubernetes/pull/25571), [@gmarek](https://github.com/gmarek))
|
||||
* Incompatible change of kube-up.sh: ([#25734](https://github.com/kubernetes/kubernetes/pull/25734), [@jszczepkowski](https://github.com/jszczepkowski))
|
||||
* when turning on cluster autoscaler by setting KUBE_ENABLE_NODE_AUTOSCALER=true,
|
||||
* KUBE_AUTOSCALER_MIN_NODES and KUBE_AUTOSCALER_MAX_NODES need to be set.
|
||||
* systemd node spec proposal ([#17688](https://github.com/kubernetes/kubernetes/pull/17688), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Bump GCE ContainerVM to container-v1-3-v20160517 (Docker 1.11.1) ([#25843](https://github.com/kubernetes/kubernetes/pull/25843), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* AWS: Move enforcement of attached AWS device limit from kubelet to scheduler ([#23254](https://github.com/kubernetes/kubernetes/pull/23254), [@jsafrane](https://github.com/jsafrane))
|
||||
* Refactor persistent volume controller ([#24331](https://github.com/kubernetes/kubernetes/pull/24331), [@jsafrane](https://github.com/jsafrane))
|
||||
* Add support for running GCI on the GCE cloud provider ([#25425](https://github.com/kubernetes/kubernetes/pull/25425), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Implement taints and tolerations ([#24134](https://github.com/kubernetes/kubernetes/pull/24134), [@kevin-wangzefeng](https://github.com/kevin-wangzefeng))
|
||||
* Add init containers to pods ([#23567](https://github.com/kubernetes/kubernetes/pull/23567), [@smarterclayton](https://github.com/smarterclayton))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-alpha.4
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/master/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-alpha.4/kubernetes.tar.gz) | `758e97e7e50153840379ecd9f8fda1869543539f` | `4e18ae6a428c99fcc30e2137d7c41854`
|
||||
|
||||
## Changes since v1.3.0-alpha.3
|
||||
|
||||
### Action Required
|
||||
|
||||
* validate third party resources ([#25007](https://github.com/kubernetes/kubernetes/pull/25007), [@liggitt](https://github.com/liggitt))
|
||||
* Automatically create the kube-system namespace ([#25196](https://github.com/kubernetes/kubernetes/pull/25196), [@luxas](https://github.com/luxas))
|
||||
* Make ThirdPartyResource a root scoped object ([#25006](https://github.com/kubernetes/kubernetes/pull/25006), [@liggitt](https://github.com/liggitt))
|
||||
* mark container-port flag as deprecated ([#25072](https://github.com/kubernetes/kubernetes/pull/25072), [@AdoHe](https://github.com/AdoHe))
|
||||
* Provide flags to use etcd3 backed storage ([#24455](https://github.com/kubernetes/kubernetes/pull/24455), [@hongchaodeng](https://github.com/hongchaodeng))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Fix hyperkube's layer caching, and remove --make-symlinks at build time ([#25693](https://github.com/kubernetes/kubernetes/pull/25693), [@luxas](https://github.com/luxas))
|
||||
* AWS: More support for ap-northeast-2 region ([#24464](https://github.com/kubernetes/kubernetes/pull/24464), [@matthewrudy](https://github.com/matthewrudy))
|
||||
* Make bigger master root disks in GCE for large clusters ([#25670](https://github.com/kubernetes/kubernetes/pull/25670), [@gmarek](https://github.com/gmarek))
|
||||
* AWS kube-down: don't fail if ELB not in VPC - [#23784](https://github.com/kubernetes/kubernetes/pull/23784) ([#23785](https://github.com/kubernetes/kubernetes/pull/23785), [@ajohnstone](https://github.com/ajohnstone))
|
||||
* Build hyperkube in hack/local-up-cluster instead of separate binaries ([#25627](https://github.com/kubernetes/kubernetes/pull/25627), [@luxas](https://github.com/luxas))
|
||||
* enable recursive processing in kubectl rollout ([#25110](https://github.com/kubernetes/kubernetes/pull/25110), [@metral](https://github.com/metral))
|
||||
* Support struct,array,slice types when sorting kubectl output ([#25022](https://github.com/kubernetes/kubernetes/pull/25022), [@zhouhaibing089](https://github.com/zhouhaibing089))
|
||||
* federated api servers: Adding a discovery summarizer server ([#20358](https://github.com/kubernetes/kubernetes/pull/20358), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* AWS: Allow cross-region image pulling with ECR ([#24369](https://github.com/kubernetes/kubernetes/pull/24369), [@therc](https://github.com/therc))
|
||||
* Automatically add node labels beta.kubernetes.io/{os,arch} ([#23684](https://github.com/kubernetes/kubernetes/pull/23684), [@luxas](https://github.com/luxas))
|
||||
* kubectl "rm" will suggest using "delete"; "ps" and "list" will suggest "get". ([#25181](https://github.com/kubernetes/kubernetes/pull/25181), [@janetkuo](https://github.com/janetkuo))
|
||||
* Add IPv6 address support for pods - does NOT include services ([#23090](https://github.com/kubernetes/kubernetes/pull/23090), [@tgraf](https://github.com/tgraf))
|
||||
* Use local disk for ConfigMap volume instead of tmpfs ([#25306](https://github.com/kubernetes/kubernetes/pull/25306), [@pmorie](https://github.com/pmorie))
|
||||
* Alpha support for scheduling pods on machines with NVIDIA GPUs whose kubelets use the `--experimental-nvidia-gpus` flag, using the alpha.kubernetes.io/nvidia-gpu resource ([#24836](https://github.com/kubernetes/kubernetes/pull/24836), [@therc](https://github.com/therc))
|
||||
* AWS: SSL support for ELB listeners through annotations ([#23495](https://github.com/kubernetes/kubernetes/pull/23495), [@therc](https://github.com/therc))
|
||||
* Implement `kubectl rollout status` that can be used to watch a deployment's rollout status ([#19946](https://github.com/kubernetes/kubernetes/pull/19946), [@janetkuo](https://github.com/janetkuo))
|
||||
* Webhook Token Authenticator ([#24902](https://github.com/kubernetes/kubernetes/pull/24902), [@cjcullen](https://github.com/cjcullen))
|
||||
* Update PodSecurityPolicy types and add admission controller that could enforce them ([#24600](https://github.com/kubernetes/kubernetes/pull/24600), [@pweil-](https://github.com/pweil-))
|
||||
* Introducing ScheduledJobs as described in [the proposal](docs/proposals/scheduledjob.md) as part of `batch/v2alpha1` version (experimental feature). ([#24970](https://github.com/kubernetes/kubernetes/pull/24970), [@soltysh](https://github.com/soltysh))
|
||||
* kubectl now supports validation of nested objects with different ApiGroups (e.g. objects in a List) ([#25172](https://github.com/kubernetes/kubernetes/pull/25172), [@pwittrock](https://github.com/pwittrock))
|
||||
* Change default clusterCIDRs from /16 to /14 in GCE configs allowing 1000 Node clusters by default. ([#25350](https://github.com/kubernetes/kubernetes/pull/25350), [@gmarek](https://github.com/gmarek))
|
||||
* Add 'kubectl set' ([#25444](https://github.com/kubernetes/kubernetes/pull/25444), [@janetkuo](https://github.com/janetkuo))
|
||||
* vSphere Cloud Provider Implementation ([#24703](https://github.com/kubernetes/kubernetes/pull/24703), [@dagnello](https://github.com/dagnello))
|
||||
* Added JobTemplate, a preliminary step for ScheduledJob and Workflow ([#21675](https://github.com/kubernetes/kubernetes/pull/21675), [@soltysh](https://github.com/soltysh))
|
||||
* Openstack provider ([#21737](https://github.com/kubernetes/kubernetes/pull/21737), [@zreigz](https://github.com/zreigz))
|
||||
* AWS kube-up: Allow VPC CIDR to be specified (experimental) ([#23362](https://github.com/kubernetes/kubernetes/pull/23362), [@miguelfrde](https://github.com/miguelfrde))
|
||||
* Return "410 Gone" errors via watch stream when using watch cache ([#25369](https://github.com/kubernetes/kubernetes/pull/25369), [@liggitt](https://github.com/liggitt))
|
||||
* GKE provider: Add cluster-ipv4-cidr and arbitrary flags ([#25437](https://github.com/kubernetes/kubernetes/pull/25437), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* AWS kube-up: Increase timeout waiting for docker start ([#25405](https://github.com/kubernetes/kubernetes/pull/25405), [@justinsb](https://github.com/justinsb))
|
||||
* Sort resources in quota errors to avoid duplicate events ([#25161](https://github.com/kubernetes/kubernetes/pull/25161), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Display line number on JSON errors ([#25038](https://github.com/kubernetes/kubernetes/pull/25038), [@mfojtik](https://github.com/mfojtik))
|
||||
* If the cluster node count exceeds the GCE TargetPool maximum (currently 1000), ([#25178](https://github.com/kubernetes/kubernetes/pull/25178), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* randomly select which nodes are members of Kubernetes External Load Balancers.
|
||||
* Clarify supported version skew between masters, nodes, and clients ([#25087](https://github.com/kubernetes/kubernetes/pull/25087), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* Move godeps to vendor/ ([#24242](https://github.com/kubernetes/kubernetes/pull/24242), [@thockin](https://github.com/thockin))
|
||||
* Introduce events flag for describers ([#24554](https://github.com/kubernetes/kubernetes/pull/24554), [@ingvagabund](https://github.com/ingvagabund))
|
||||
* run kube-addon-manager in a static pod ([#23600](https://github.com/kubernetes/kubernetes/pull/23600), [@mikedanese](https://github.com/mikedanese))
|
||||
* Reimplement 'pause' in C - smaller footprint all around ([#23009](https://github.com/kubernetes/kubernetes/pull/23009), [@uluyol](https://github.com/uluyol))
|
||||
* Add subPath to mount a child dir or file of a volumeMount ([#22575](https://github.com/kubernetes/kubernetes/pull/22575), [@MikaelCluseau](https://github.com/MikaelCluseau))
|
||||
* Handle image digests in node status and image GC ([#25088](https://github.com/kubernetes/kubernetes/pull/25088), [@ncdc](https://github.com/ncdc))
|
||||
* PLEG: reinspect pods that failed prior inspections ([#25077](https://github.com/kubernetes/kubernetes/pull/25077), [@ncdc](https://github.com/ncdc))
|
||||
* Fix kubectl create secret/configmap to allow = values ([#24989](https://github.com/kubernetes/kubernetes/pull/24989), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Upgrade installed packages when building hyperkube to improve the security profile ([#25114](https://github.com/kubernetes/kubernetes/pull/25114), [@aaronlevy](https://github.com/aaronlevy))
|
||||
* GCI/Trusty: Support ABAC authorization ([#24950](https://github.com/kubernetes/kubernetes/pull/24950), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* fix cinder volume dir umount issue [#24717](https://github.com/kubernetes/kubernetes/pull/24717) ([#24718](https://github.com/kubernetes/kubernetes/pull/24718), [@chengyli](https://github.com/chengyli))
|
||||
* Inter pod topological affinity and anti-affinity implementation ([#22985](https://github.com/kubernetes/kubernetes/pull/22985), [@kevin-wangzefeng](https://github.com/kevin-wangzefeng))
|
||||
* start etcd compactor in background ([#25010](https://github.com/kubernetes/kubernetes/pull/25010), [@hongchaodeng](https://github.com/hongchaodeng))
|
||||
* GCI: Add two GCI specific metadata pairs ([#25105](https://github.com/kubernetes/kubernetes/pull/25105), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Ensure status is not changed during an update of PV, PVC, HPA objects ([#24924](https://github.com/kubernetes/kubernetes/pull/24924), [@mqliang](https://github.com/mqliang))
|
||||
* GCE: Prefer preconfigured node tags for firewalls, if available ([#25148](https://github.com/kubernetes/kubernetes/pull/25148), [@a-robinson](https://github.com/a-robinson))
|
||||
* kubectl rolling-update support for same image ([#24645](https://github.com/kubernetes/kubernetes/pull/24645), [@jlowdermilk](https://github.com/jlowdermilk))
|
||||
* Add an entry to the salt config to allow Debian jessie on GCE. ([#25123](https://github.com/kubernetes/kubernetes/pull/25123), [@jlewi](https://github.com/jlewi))
|
||||
* As with the existing Wheezy image on GCE, docker is expected
|
||||
* to already be installed in the image.
|
||||
* Mark kube-push.sh as broken ([#25095](https://github.com/kubernetes/kubernetes/pull/25095), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* AWS: Add support for ap-northeast-2 region (Seoul) ([#24457](https://github.com/kubernetes/kubernetes/pull/24457), [@leokhoa](https://github.com/leokhoa))
|
||||
* GCI: Update the command to get the image ([#24987](https://github.com/kubernetes/kubernetes/pull/24987), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Port-forward: use out and error streams instead of glog ([#17030](https://github.com/kubernetes/kubernetes/pull/17030), [@csrwng](https://github.com/csrwng))
|
||||
* Promote Pod Hostname & Subdomain to fields (were annotations) ([#24362](https://github.com/kubernetes/kubernetes/pull/24362), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* Validate deletion timestamp doesn't change on update ([#24839](https://github.com/kubernetes/kubernetes/pull/24839), [@liggitt](https://github.com/liggitt))
|
||||
* Add flag -t as shorthand for --tty ([#24365](https://github.com/kubernetes/kubernetes/pull/24365), [@janetkuo](https://github.com/janetkuo))
|
||||
* Add support for running clusters on GCI ([#24893](https://github.com/kubernetes/kubernetes/pull/24893), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Switch to ABAC authorization from AllowAll ([#24210](https://github.com/kubernetes/kubernetes/pull/24210), [@cjcullen](https://github.com/cjcullen))
|
||||
* Fix DeletingLoadBalancer event generation. ([#24833](https://github.com/kubernetes/kubernetes/pull/24833), [@a-robinson](https://github.com/a-robinson))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-alpha.3
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/master/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-alpha.3/kubernetes.tar.gz) | `01e0dc68653173614dc99f44875173478f837b38` | `ae22c35f3a963743d21daa17683e0288`
|
||||
|
||||
## Changes since v1.3.0-alpha.2
|
||||
|
||||
### Action Required
|
||||
|
||||
* Updating go-restful to generate "type":"object" instead of "type":"any" in swagger-spec (breaks kubectl 1.1) ([#22897](https://github.com/kubernetes/kubernetes/pull/22897), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Make watch cache treat resourceVersion consistent with uncached watch ([#24008](https://github.com/kubernetes/kubernetes/pull/24008), [@liggitt](https://github.com/liggitt))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Trusty: Add retry in curl commands ([#24749](https://github.com/kubernetes/kubernetes/pull/24749), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Collect and expose runtime's image storage usage via Kubelet's /stats/summary endpoint ([#23595](https://github.com/kubernetes/kubernetes/pull/23595), [@vishh](https://github.com/vishh))
|
||||
* Adding loadBalancer services to quota system ([#24247](https://github.com/kubernetes/kubernetes/pull/24247), [@sdminonne](https://github.com/sdminonne))
|
||||
* Enforce --max-pods in kubelet admission; previously was only enforced in scheduler ([#24674](https://github.com/kubernetes/kubernetes/pull/24674), [@gmarek](https://github.com/gmarek))
|
||||
* All clients under ClientSet share one RateLimiter. ([#24166](https://github.com/kubernetes/kubernetes/pull/24166), [@gmarek](https://github.com/gmarek))
|
||||
* Remove requirement that Endpoints IPs be IPv4 ([#23317](https://github.com/kubernetes/kubernetes/pull/23317), [@aanm](https://github.com/aanm))
|
||||
* Fix unintended change of Service.spec.ports[].nodePort during kubectl apply ([#24180](https://github.com/kubernetes/kubernetes/pull/24180), [@AdoHe](https://github.com/AdoHe))
|
||||
* Don't log private SSH key ([#24506](https://github.com/kubernetes/kubernetes/pull/24506), [@timstclair](https://github.com/timstclair))
|
||||
* Incremental improvements to kubelet e2e tests ([#24426](https://github.com/kubernetes/kubernetes/pull/24426), [@pwittrock](https://github.com/pwittrock))
|
||||
* Bridge off-cluster traffic into services by masquerading. ([#24429](https://github.com/kubernetes/kubernetes/pull/24429), [@cjcullen](https://github.com/cjcullen))
|
||||
* Flush conntrack state for removed/changed UDP Services ([#22573](https://github.com/kubernetes/kubernetes/pull/22573), [@freehan](https://github.com/freehan))
|
||||
* Allow setting the Host header in a httpGet probe ([#24292](https://github.com/kubernetes/kubernetes/pull/24292), [@errm](https://github.com/errm))
|
||||
* Fix goroutine leak in ssh-tunnel healthcheck. ([#24487](https://github.com/kubernetes/kubernetes/pull/24487), [@cjcullen](https://github.com/cjcullen))
|
||||
* Fix gce.getDiskByNameUnknownZone logic. ([#24452](https://github.com/kubernetes/kubernetes/pull/24452), [@a-robinson](https://github.com/a-robinson))
|
||||
* Make etcd cache size configurable ([#23914](https://github.com/kubernetes/kubernetes/pull/23914), [@jsravn](https://github.com/jsravn))
|
||||
* Drain pods created from ReplicaSets in 'kubectl drain' ([#23689](https://github.com/kubernetes/kubernetes/pull/23689), [@maclof](https://github.com/maclof))
|
||||
* Make kubectl edit not convert GV on edits ([#23437](https://github.com/kubernetes/kubernetes/pull/23437), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* don't ship kube-registry-proxy and pause images in tars. ([#23605](https://github.com/kubernetes/kubernetes/pull/23605), [@mikedanese](https://github.com/mikedanese))
|
||||
* Do not throw creation errors for containers that fail immediately after being started ([#23894](https://github.com/kubernetes/kubernetes/pull/23894), [@vishh](https://github.com/vishh))
|
||||
* Add a client flag to delete "--now" for grace period 0 ([#23756](https://github.com/kubernetes/kubernetes/pull/23756), [@smarterclayton](https://github.com/smarterclayton))
|
||||
* add act-as powers ([#23549](https://github.com/kubernetes/kubernetes/pull/23549), [@deads2k](https://github.com/deads2k))
|
||||
* Build Kubernetes, etcd and flannel for arm64 and ppc64le ([#23931](https://github.com/kubernetes/kubernetes/pull/23931), [@luxas](https://github.com/luxas))
|
||||
* Honor starting resourceVersion in watch cache ([#24208](https://github.com/kubernetes/kubernetes/pull/24208), [@ncdc](https://github.com/ncdc))
|
||||
* Update the pause image to build for arm64 and ppc64le ([#23697](https://github.com/kubernetes/kubernetes/pull/23697), [@luxas](https://github.com/luxas))
|
||||
* Return more useful error information when a persistent volume fails to mount ([#23122](https://github.com/kubernetes/kubernetes/pull/23122), [@screeley44](https://github.com/screeley44))
|
||||
* Trusty: Avoid unnecessary in-memory temp files ([#24144](https://github.com/kubernetes/kubernetes/pull/24144), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* e2e: fix error checking in kubelet stats ([#24205](https://github.com/kubernetes/kubernetes/pull/24205), [@yujuhong](https://github.com/yujuhong))
|
||||
* Fixed mounting with containerized kubelet ([#23435](https://github.com/kubernetes/kubernetes/pull/23435), [@jsafrane](https://github.com/jsafrane))
|
||||
* Adding nodeports services to quota ([#22154](https://github.com/kubernetes/kubernetes/pull/22154), [@sdminonne](https://github.com/sdminonne))
|
||||
* e2e: adapt kubelet_perf.go to use the new summary metrics API ([#24003](https://github.com/kubernetes/kubernetes/pull/24003), [@yujuhong](https://github.com/yujuhong))
|
||||
* kubelet: add RSS memory to the summary API ([#24015](https://github.com/kubernetes/kubernetes/pull/24015), [@yujuhong](https://github.com/yujuhong))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-alpha.2
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/master/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-alpha.2/kubernetes.tar.gz) | `305c8c2af7e99d463dbbe4208ecfe2b50585e796` | `aadb8d729d855e69212008f8fda628c0`
|
||||
|
||||
## Changes since v1.3.0-alpha.1
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Make kube2sky and skydns docker images cross-platform ([#19376](https://github.com/kubernetes/kubernetes/pull/19376), [@luxas](https://github.com/luxas))
|
||||
* Allowing type object in kubectl swagger validation ([#24054](https://github.com/kubernetes/kubernetes/pull/24054), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Fix TerminationMessagePath ([#23658](https://github.com/kubernetes/kubernetes/pull/23658), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* Trusty: Do not create the docker-daemon cgroup ([#23996](https://github.com/kubernetes/kubernetes/pull/23996), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Make ConfigMap volume readable as non-root ([#23793](https://github.com/kubernetes/kubernetes/pull/23793), [@pmorie](https://github.com/pmorie))
|
||||
* only include running and pending pods in daemonset should place calculation ([#23929](https://github.com/kubernetes/kubernetes/pull/23929), [@mikedanese](https://github.com/mikedanese))
|
||||
* Upgrade to golang 1.6 ([#22149](https://github.com/kubernetes/kubernetes/pull/22149), [@luxas](https://github.com/luxas))
|
||||
* Cross-build hyperkube and debian-iptables for ARM. Also add a flannel image ([#21617](https://github.com/kubernetes/kubernetes/pull/21617), [@luxas](https://github.com/luxas))
|
||||
* Add a timeout to the sshDialer to prevent indefinite hangs. ([#23843](https://github.com/kubernetes/kubernetes/pull/23843), [@cjcullen](https://github.com/cjcullen))
|
||||
* Ensure object returned by volume getCloudProvider incorporates cloud config ([#23769](https://github.com/kubernetes/kubernetes/pull/23769), [@saad-ali](https://github.com/saad-ali))
|
||||
* Update Dashboard UI addon to v1.0.1 ([#23724](https://github.com/kubernetes/kubernetes/pull/23724), [@maciaszczykm](https://github.com/maciaszczykm))
|
||||
* Add zsh completion for kubectl ([#23797](https://github.com/kubernetes/kubernetes/pull/23797), [@sttts](https://github.com/sttts))
|
||||
* AWS kube-up: tolerate a lack of ephemeral volumes ([#23776](https://github.com/kubernetes/kubernetes/pull/23776), [@justinsb](https://github.com/justinsb))
|
||||
* duplicate kube-apiserver to federated-apiserver ([#23509](https://github.com/kubernetes/kubernetes/pull/23509), [@jianhuiz](https://github.com/jianhuiz))
|
||||
* Kubelet: Start using the official docker engine-api ([#23506](https://github.com/kubernetes/kubernetes/pull/23506), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* Fix so setup-files don't recreate/invalidate certificates that already exist ([#23550](https://github.com/kubernetes/kubernetes/pull/23550), [@luxas](https://github.com/luxas))
|
||||
* A pod never terminated if a container image registry was unavailable ([#23746](https://github.com/kubernetes/kubernetes/pull/23746), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Fix jsonpath to handle maps with key of nonstring types ([#23358](https://github.com/kubernetes/kubernetes/pull/23358), [@aveshagarwal](https://github.com/aveshagarwal))
|
||||
* Trusty: Regional release .tar.gz support ([#23558](https://github.com/kubernetes/kubernetes/pull/23558), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Add support for 3rd party objects to kubectl ([#18835](https://github.com/kubernetes/kubernetes/pull/18835), [@brendandburns](https://github.com/brendandburns))
|
||||
* Remove unnecessary override of /etc/init.d/docker on containervm image. ([#23593](https://github.com/kubernetes/kubernetes/pull/23593), [@dchen1107](https://github.com/dchen1107))
|
||||
* make docker-checker more robust ([#23662](https://github.com/kubernetes/kubernetes/pull/23662), [@ArtfulCoder](https://github.com/ArtfulCoder))
|
||||
* Change kube-proxy & fluentd CPU request to 20m/80m. ([#23646](https://github.com/kubernetes/kubernetes/pull/23646), [@cjcullen](https://github.com/cjcullen))
|
||||
* Create a new Deployment in kube-system for every version. ([#23512](https://github.com/kubernetes/kubernetes/pull/23512), [@Q-Lee](https://github.com/Q-Lee))
|
||||
* IngressTLS: allow secretName to be blank for SNI routing ([#23500](https://github.com/kubernetes/kubernetes/pull/23500), [@tam7t](https://github.com/tam7t))
|
||||
* don't sync deployment when pod selector is empty ([#23467](https://github.com/kubernetes/kubernetes/pull/23467), [@mikedanese](https://github.com/mikedanese))
|
||||
* AWS: Fix problems with >2 security groups ([#23340](https://github.com/kubernetes/kubernetes/pull/23340), [@justinsb](https://github.com/justinsb))
|
||||
|
||||
|
||||
|
||||
# v1.3.0-alpha.1
|
||||
|
||||
[Documentation](http://kubernetes.github.io) & [Examples](http://releases.k8s.io/HEAD/examples)
|
||||
|
||||
## Downloads
|
||||
|
||||
binary | sha1 hash | md5 hash
|
||||
------ | --------- | --------
|
||||
[kubernetes.tar.gz](https://storage.googleapis.com/kubernetes-release/release/v1.3.0-alpha.1/kubernetes.tar.gz) | `e0041b08e220a4704ea2ad90a6ec7c8f2120c2d3` | `7bb2df32aea94678f72a8d1f43a12098`
|
||||
|
||||
## Changes since v1.2.0
|
||||
|
||||
### Action Required
|
||||
|
||||
* Disabling swagger ui by default on apiserver. Adding a flag that can enable it ([#23025](https://github.com/kubernetes/kubernetes/pull/23025), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* restore ability to run against secured etcd ([#21535](https://github.com/kubernetes/kubernetes/pull/21535), [@AdoHe](https://github.com/AdoHe))
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* validate that daemonsets don't have empty selectors on creation ([#23530](https://github.com/kubernetes/kubernetes/pull/23530), [@mikedanese](https://github.com/mikedanese))
|
||||
* Trusty: Update heapster manifest handling code ([#23434](https://github.com/kubernetes/kubernetes/pull/23434), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Support differentiation of OS distro in e2e tests ([#23466](https://github.com/kubernetes/kubernetes/pull/23466), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* don't sync daemonsets with selectors that match all pods ([#23223](https://github.com/kubernetes/kubernetes/pull/23223), [@mikedanese](https://github.com/mikedanese))
|
||||
* Trusty: Avoid reaching GCE custom metadata size limit ([#22818](https://github.com/kubernetes/kubernetes/pull/22818), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Update kubectl help for 1.2 resources ([#23305](https://github.com/kubernetes/kubernetes/pull/23305), [@janetkuo](https://github.com/janetkuo))
|
||||
* Support addon Deployments, make heapster a deployment with a nanny. ([#22893](https://github.com/kubernetes/kubernetes/pull/22893), [@Q-Lee](https://github.com/Q-Lee))
|
||||
* Removing URL query param from swagger UI to fix the XSS issue ([#23234](https://github.com/kubernetes/kubernetes/pull/23234), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* Fix hairpin mode ([#23325](https://github.com/kubernetes/kubernetes/pull/23325), [@MurgaNikolay](https://github.com/MurgaNikolay))
|
||||
* Bump to container-vm-v20160321 ([#23313](https://github.com/kubernetes/kubernetes/pull/23313), [@zmerlynn](https://github.com/zmerlynn))
|
||||
* Remove the restart-kube-proxy and restart-apiserver functions ([#23180](https://github.com/kubernetes/kubernetes/pull/23180), [@roberthbailey](https://github.com/roberthbailey))
|
||||
* Copy annotations back from RS to Deployment on rollback ([#23160](https://github.com/kubernetes/kubernetes/pull/23160), [@janetkuo](https://github.com/janetkuo))
|
||||
* Trusty: Support hybrid cluster with nodes on ContainerVM ([#23079](https://github.com/kubernetes/kubernetes/pull/23079), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* update expose command description to add deployment ([#23246](https://github.com/kubernetes/kubernetes/pull/23246), [@AdoHe](https://github.com/AdoHe))
|
||||
* Add a rate limiter to the GCE cloudprovider ([#23019](https://github.com/kubernetes/kubernetes/pull/23019), [@alex-mohr](https://github.com/alex-mohr))
|
||||
* Add a Deployment example for kubectl expose. ([#23222](https://github.com/kubernetes/kubernetes/pull/23222), [@madhusudancs](https://github.com/madhusudancs))
|
||||
* Use versioned object when computing patch ([#23145](https://github.com/kubernetes/kubernetes/pull/23145), [@liggitt](https://github.com/liggitt))
|
||||
* kubelet: send all recevied pods in one update ([#23141](https://github.com/kubernetes/kubernetes/pull/23141), [@yujuhong](https://github.com/yujuhong))
|
||||
* Add a SSHKey sync check to the master's healthz (when using SSHTunnels). ([#23167](https://github.com/kubernetes/kubernetes/pull/23167), [@cjcullen](https://github.com/cjcullen))
|
||||
* Validate minimum CPU limits to be >= 10m ([#23143](https://github.com/kubernetes/kubernetes/pull/23143), [@vishh](https://github.com/vishh))
|
||||
* Fix controller-manager race condition issue which cause endpoints flush during restart ([#23035](https://github.com/kubernetes/kubernetes/pull/23035), [@xinxiaogang](https://github.com/xinxiaogang))
|
||||
* MESOS: forward globally declared cadvisor housekeeping flags ([#22974](https://github.com/kubernetes/kubernetes/pull/22974), [@jdef](https://github.com/jdef))
|
||||
* Trusty: support developer workflow on base image ([#22960](https://github.com/kubernetes/kubernetes/pull/22960), [@andyzheng0831](https://github.com/andyzheng0831))
|
||||
* Bumped Heapster to stable version 1.0.0 ([#22993](https://github.com/kubernetes/kubernetes/pull/22993), [@piosz](https://github.com/piosz))
|
||||
* Deprecating --api-version flag ([#22410](https://github.com/kubernetes/kubernetes/pull/22410), [@nikhiljindal](https://github.com/nikhiljindal))
|
||||
* allow resource.version.group in kubectl ([#22853](https://github.com/kubernetes/kubernetes/pull/22853), [@deads2k](https://github.com/deads2k))
|
||||
* Use SCP to dump logs and parallelize a bit. ([#22835](https://github.com/kubernetes/kubernetes/pull/22835), [@spxtr](https://github.com/spxtr))
|
||||
* update wide option output ([#22772](https://github.com/kubernetes/kubernetes/pull/22772), [@AdoHe](https://github.com/AdoHe))
|
||||
* Change scheduler logic from random to round-robin ([#22430](https://github.com/kubernetes/kubernetes/pull/22430), [@gmarek](https://github.com/gmarek))
|
||||
|
||||
Please see the [Releases Page](https://github.com/kubernetes/kubernetes/releases) for older releases.
|
||||
|
||||
Release notes of older releases can be found in:
|
||||
- [CHANGELOG-1.2.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.2.md)
|
||||
|
||||
[]()
|
||||
1436
vendor/k8s.io/kubernetes/CHANGELOG-1.4.md
generated
vendored
1436
vendor/k8s.io/kubernetes/CHANGELOG-1.4.md
generated
vendored
File diff suppressed because it is too large
Load diff
1327
vendor/k8s.io/kubernetes/CHANGELOG-1.5.md
generated
vendored
1327
vendor/k8s.io/kubernetes/CHANGELOG-1.5.md
generated
vendored
File diff suppressed because it is too large
Load diff
2755
vendor/k8s.io/kubernetes/CHANGELOG-1.6.md
generated
vendored
2755
vendor/k8s.io/kubernetes/CHANGELOG-1.6.md
generated
vendored
File diff suppressed because it is too large
Load diff
2712
vendor/k8s.io/kubernetes/CHANGELOG-1.7.md
generated
vendored
2712
vendor/k8s.io/kubernetes/CHANGELOG-1.7.md
generated
vendored
File diff suppressed because it is too large
Load diff
134
vendor/k8s.io/kubernetes/CHANGELOG-1.8.md
generated
vendored
134
vendor/k8s.io/kubernetes/CHANGELOG-1.8.md
generated
vendored
|
|
@ -1,17 +1,24 @@
|
|||
<!-- BEGIN MUNGE: GENERATED_TOC -->
|
||||
- [v1.8.1](#v181)
|
||||
- [Downloads for v1.8.1](#downloads-for-v181)
|
||||
- [v1.8.2](#v182)
|
||||
- [Downloads for v1.8.2](#downloads-for-v182)
|
||||
- [Client Binaries](#client-binaries)
|
||||
- [Server Binaries](#server-binaries)
|
||||
- [Node Binaries](#node-binaries)
|
||||
- [Changelog since v1.8.0](#changelog-since-v180)
|
||||
- [Action Required](#action-required)
|
||||
- [Changelog since v1.8.1](#changelog-since-v181)
|
||||
- [Other notable changes](#other-notable-changes)
|
||||
- [v1.8.0](#v180)
|
||||
- [Downloads for v1.8.0](#downloads-for-v180)
|
||||
- [v1.8.1](#v181)
|
||||
- [Downloads for v1.8.1](#downloads-for-v181)
|
||||
- [Client Binaries](#client-binaries-1)
|
||||
- [Server Binaries](#server-binaries-1)
|
||||
- [Node Binaries](#node-binaries-1)
|
||||
- [Changelog since v1.8.0](#changelog-since-v180)
|
||||
- [Action Required](#action-required)
|
||||
- [Other notable changes](#other-notable-changes-1)
|
||||
- [v1.8.0](#v180)
|
||||
- [Downloads for v1.8.0](#downloads-for-v180)
|
||||
- [Client Binaries](#client-binaries-2)
|
||||
- [Server Binaries](#server-binaries-2)
|
||||
- [Node Binaries](#node-binaries-2)
|
||||
- [Introduction to v1.8.0](#introduction-to-v180)
|
||||
- [Major Themes](#major-themes)
|
||||
- [SIG API Machinery](#sig-api-machinery)
|
||||
|
|
@ -45,8 +52,8 @@
|
|||
- [Scheduling](#scheduling-1)
|
||||
- [Storage](#storage)
|
||||
- [Cluster Federation](#cluster-federation)
|
||||
- [[alpha] Federated Jobs](#[alpha]-federated-jobs)
|
||||
- [[alpha] Federated Horizontal Pod Autoscaling (HPA)](#[alpha]-federated-horizontal-pod-autoscaling-hpa)
|
||||
- [[alpha] Federated Jobs](#alpha-federated-jobs)
|
||||
- [[alpha] Federated Horizontal Pod Autoscaling (HPA)](#alpha-federated-horizontal-pod-autoscaling-hpa)
|
||||
- [Node Components](#node-components)
|
||||
- [Autoscaling and Metrics](#autoscaling-and-metrics)
|
||||
- [Cluster Autoscaler](#cluster-autoscaler)
|
||||
|
|
@ -72,49 +79,116 @@
|
|||
- [External Dependencies](#external-dependencies)
|
||||
- [v1.8.0-rc.1](#v180-rc1)
|
||||
- [Downloads for v1.8.0-rc.1](#downloads-for-v180-rc1)
|
||||
- [Client Binaries](#client-binaries-2)
|
||||
- [Server Binaries](#server-binaries-2)
|
||||
- [Node Binaries](#node-binaries-2)
|
||||
- [Changelog since v1.8.0-beta.1](#changelog-since-v180-beta1)
|
||||
- [Action Required](#action-required-1)
|
||||
- [Other notable changes](#other-notable-changes-1)
|
||||
- [v1.8.0-beta.1](#v180-beta1)
|
||||
- [Downloads for v1.8.0-beta.1](#downloads-for-v180-beta1)
|
||||
- [Client Binaries](#client-binaries-3)
|
||||
- [Server Binaries](#server-binaries-3)
|
||||
- [Node Binaries](#node-binaries-3)
|
||||
- [Changelog since v1.8.0-alpha.3](#changelog-since-v180-alpha3)
|
||||
- [Action Required](#action-required-2)
|
||||
- [Changelog since v1.8.0-beta.1](#changelog-since-v180-beta1)
|
||||
- [Action Required](#action-required-1)
|
||||
- [Other notable changes](#other-notable-changes-2)
|
||||
- [v1.8.0-alpha.3](#v180-alpha3)
|
||||
- [Downloads for v1.8.0-alpha.3](#downloads-for-v180-alpha3)
|
||||
- [v1.8.0-beta.1](#v180-beta1)
|
||||
- [Downloads for v1.8.0-beta.1](#downloads-for-v180-beta1)
|
||||
- [Client Binaries](#client-binaries-4)
|
||||
- [Server Binaries](#server-binaries-4)
|
||||
- [Node Binaries](#node-binaries-4)
|
||||
- [Changelog since v1.8.0-alpha.2](#changelog-since-v180-alpha2)
|
||||
- [Action Required](#action-required-3)
|
||||
- [Changelog since v1.8.0-alpha.3](#changelog-since-v180-alpha3)
|
||||
- [Action Required](#action-required-2)
|
||||
- [Other notable changes](#other-notable-changes-3)
|
||||
- [v1.8.0-alpha.2](#v180-alpha2)
|
||||
- [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2)
|
||||
- [v1.8.0-alpha.3](#v180-alpha3)
|
||||
- [Downloads for v1.8.0-alpha.3](#downloads-for-v180-alpha3)
|
||||
- [Client Binaries](#client-binaries-5)
|
||||
- [Server Binaries](#server-binaries-5)
|
||||
- [Node Binaries](#node-binaries-5)
|
||||
- [Changelog since v1.7.0](#changelog-since-v170)
|
||||
- [Action Required](#action-required-4)
|
||||
- [Changelog since v1.8.0-alpha.2](#changelog-since-v180-alpha2)
|
||||
- [Action Required](#action-required-3)
|
||||
- [Other notable changes](#other-notable-changes-4)
|
||||
- [v1.8.0-alpha.1](#v180-alpha1)
|
||||
- [Downloads for v1.8.0-alpha.1](#downloads-for-v180-alpha1)
|
||||
- [v1.8.0-alpha.2](#v180-alpha2)
|
||||
- [Downloads for v1.8.0-alpha.2](#downloads-for-v180-alpha2)
|
||||
- [Client Binaries](#client-binaries-6)
|
||||
- [Server Binaries](#server-binaries-6)
|
||||
- [Node Binaries](#node-binaries-6)
|
||||
- [Changelog since v1.7.0](#changelog-since-v170)
|
||||
- [Action Required](#action-required-4)
|
||||
- [Other notable changes](#other-notable-changes-5)
|
||||
- [v1.8.0-alpha.1](#v180-alpha1)
|
||||
- [Downloads for v1.8.0-alpha.1](#downloads-for-v180-alpha1)
|
||||
- [Client Binaries](#client-binaries-7)
|
||||
- [Server Binaries](#server-binaries-7)
|
||||
- [Node Binaries](#node-binaries-7)
|
||||
- [Changelog since v1.7.0-alpha.4](#changelog-since-v170-alpha4)
|
||||
- [Action Required](#action-required-5)
|
||||
- [Other notable changes](#other-notable-changes-5)
|
||||
- [Other notable changes](#other-notable-changes-6)
|
||||
<!-- END MUNGE: GENERATED_TOC -->
|
||||
|
||||
<!-- NEW RELEASE NOTES ENTRY -->
|
||||
|
||||
|
||||
# v1.8.2
|
||||
|
||||
[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.8/examples)
|
||||
|
||||
## Downloads for v1.8.2
|
||||
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes.tar.gz) | `06a800c414e776640a7861baa4f0b6edbd898c13ad3ebcd33860fe5d949bbdee`
|
||||
[kubernetes-src.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-src.tar.gz) | `fbfb65a4eb1ddff32e302a0821204fa780ebb5b27298e31699c43c19da48191e`
|
||||
|
||||
### Client Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-darwin-386.tar.gz) | `3eb81f1178ff73ca683738606acea1d9537a33c6e3d15571795a24af6c53dbd7`
|
||||
[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-darwin-amd64.tar.gz) | `15da279f018a73f93b857639931c4ba8a714c86e5c5738c33840c47df44ac2a4`
|
||||
[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-386.tar.gz) | `bd9f144e6ddfc715fa77d9cb0310763e49f8121e894ed33714658fb2d6eb2675`
|
||||
[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-amd64.tar.gz) | `7c20d4a3859c07aadf9a1676876bafdf56187478a69d3bfca5277fb275febb96`
|
||||
[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-arm64.tar.gz) | `395c3fb5992509191cacbaf6e7ed4fd0fbee5c0b9c890f496879784454f88aa3`
|
||||
[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-arm.tar.gz) | `a1cff2f8ab5f77f000e20f87b00a3723a8323fec82926afcc984722ab3f8d714`
|
||||
[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-ppc64le.tar.gz) | `832a1e399802bfd8871cd911f17dbb6b2264680e9477c2944d442a3f9e5fa6f2`
|
||||
[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-linux-s390x.tar.gz) | `6afc2c4a331ee70e095a6d1e1f11bf69923afb1830840d110459e32b849b1b6c`
|
||||
[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-windows-386.tar.gz) | `ecaadb5a4c08357685dbaee288d1220bd60ff0f86281ec88a5467da6eebf213b`
|
||||
[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-client-windows-amd64.tar.gz) | `b8ff337615f740b1501cf7284d7f0a51a82880dcf23fff2464f8d37045c27f3f`
|
||||
|
||||
### Server Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-server-linux-amd64.tar.gz) | `8ccd4912473e0d334694434936a5ca9547caddaa39d771a1fb94620c5d6002d4`
|
||||
[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-server-linux-arm64.tar.gz) | `39b3c61927c905f142d74fe69391156e6bf61cc5e7a798cdf2c295a76e72161d`
|
||||
[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-server-linux-arm.tar.gz) | `fc6b01b233f8d0c61dd485d8d571c9a2e1a5b085f0d0db734a84c42b71416537`
|
||||
[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-server-linux-ppc64le.tar.gz) | `6f6d8dcef0334736021d9f6cc2bbfdb78500483f8961e7ff14b09f1c67d37056`
|
||||
[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-server-linux-s390x.tar.gz) | `6f1b6b5fb818fdb787cdf65ff3da81235b5b4db5b4a9b5579920d11dc8a3fa73`
|
||||
|
||||
### Node Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-linux-amd64.tar.gz) | `93c6b5d2a5e4aaf8776f56e5b8f40038c76d3d03709124fb8900f83acb49c782`
|
||||
[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-linux-arm64.tar.gz) | `ab4535e19825e0e9b76987dbb11d9fd746281e45a90f90b453dbc7d6fecb2c69`
|
||||
[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-linux-arm.tar.gz) | `96acd6ec41d4a3ec7ea6f95acecf116755340915e3d261de760d9ed84708e3f0`
|
||||
[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-linux-ppc64le.tar.gz) | `4256a8c315de083435fcdfc8ee2ae370bd603fa976218edadbf7bfe11adcf223`
|
||||
[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-linux-s390x.tar.gz) | `30f2254bf442fc36fc23bd962930eb48fd000c9ffce81c26c0d64d4a0fd0c193`
|
||||
[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.8.2/kubernetes-node-windows-amd64.tar.gz) | `b92c2670ce8dd75f744537abb6e98df84ce5a18da7df6b70741e92d9e57098bf`
|
||||
|
||||
## Changelog since v1.8.1
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* Allow for configuring etcd hostname in the manifest ([#54403](https://github.com/kubernetes/kubernetes/pull/54403), [@wojtek-t](https://github.com/wojtek-t))
|
||||
* Allow standard flags in client-gen. ([#53999](https://github.com/kubernetes/kubernetes/pull/53999), [@sttts](https://github.com/sttts))
|
||||
* Cluster Autoscaler 1.0.1 ([#54298](https://github.com/kubernetes/kubernetes/pull/54298), [@mwielgus](https://github.com/mwielgus))
|
||||
* Resolves forbidden error when accessing replicasets and daemonsets via the apps API group ([#54309](https://github.com/kubernetes/kubernetes/pull/54309), [@liggitt](https://github.com/liggitt))
|
||||
* kubelet: prevent removal of default labels from Node API objects on startup ([#54073](https://github.com/kubernetes/kubernetes/pull/54073), [@liggitt](https://github.com/liggitt))
|
||||
* Fix a bug that prevents client-go metrics from being registered in prometheus in multiple components. ([#53434](https://github.com/kubernetes/kubernetes/pull/53434), [@crassirostris](https://github.com/crassirostris))
|
||||
* Webhook always retries connection reset error. ([#53947](https://github.com/kubernetes/kubernetes/pull/53947), [@crassirostris](https://github.com/crassirostris))
|
||||
* Adjust batching audit webhook default parameters: increase queue size, batch size, and initial backoff. Add throttling to the batching audit webhook. Default rate limit is 10 QPS. ([#53417](https://github.com/kubernetes/kubernetes/pull/53417), [@crassirostris](https://github.com/crassirostris))
|
||||
* Address a bug which allowed the horizontal pod autoscaler to allocate `desiredReplicas` > `maxReplicas` in certain instances. ([#53690](https://github.com/kubernetes/kubernetes/pull/53690), [@mattjmcnaughton](https://github.com/mattjmcnaughton))
|
||||
* Fix metrics API group name in audit configuration ([#53493](https://github.com/kubernetes/kubernetes/pull/53493), [@piosz](https://github.com/piosz))
|
||||
* Use separate client for leader election in scheduler to avoid starving leader election by regular scheduler operations. ([#53793](https://github.com/kubernetes/kubernetes/pull/53793), [@wojtek-t](https://github.com/wojtek-t))
|
||||
* kubeadm: Strip bootstrap tokens from the `kubeadm-config` ConfigMap ([#53559](https://github.com/kubernetes/kubernetes/pull/53559), [@fabriziopandini](https://github.com/fabriziopandini))
|
||||
|
||||
|
||||
|
||||
# v1.8.1
|
||||
|
||||
[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/release-1.8/examples)
|
||||
|
|
@ -1689,7 +1763,7 @@ filename | sha256 hash
|
|||
* Reduce amount of noise in Stackdriver Logging, generated by the event-exporter component in the fluentd-gcp addon. ([#48712](https://github.com/kubernetes/kubernetes/pull/48712), [@crassirostris](https://github.com/crassirostris))
|
||||
* To allow the userspace proxy to work correctly on multi-interface hosts when using the non-default-route interface, you may now set the `bindAddress` configuration option to an IP address assigned to a network interface. The proxy will use that IP address for any required NAT operations instead of the IP address of the interface which has the default route. ([#48613](https://github.com/kubernetes/kubernetes/pull/48613), [@dcbw](https://github.com/dcbw))
|
||||
* Move Mesos Cloud Provider out of Kubernetes Repo ([#47232](https://github.com/kubernetes/kubernetes/pull/47232), [@gyliu513](https://github.com/gyliu513))
|
||||
* - kubeadm now can accept versions like "1.6.4" where previously it strictly required "v1.6.4" ([#48507](https://github.com/kubernetes/kubernetes/pull/48507), [@kad](https://github.com/kad))
|
||||
* kubeadm now can accept versions like "1.6.4" where previously it strictly required "v1.6.4" ([#48507](https://github.com/kubernetes/kubernetes/pull/48507), [@kad](https://github.com/kad))
|
||||
* kubeadm: Implementing the certificates phase fully ([#48196](https://github.com/kubernetes/kubernetes/pull/48196), [@fabriziopandini](https://github.com/fabriziopandini))
|
||||
* Added case on 'terminated-but-not-yet-deleted' for Admit. ([#48322](https://github.com/kubernetes/kubernetes/pull/48322), [@k82cn](https://github.com/k82cn))
|
||||
* `kubectl run --env` no longer supports CSV parsing. To provide multiple env vars, use the `--env` flag multiple times instead of having env vars separated by commas. E.g. `--env ONE=1 --env TWO=2` instead of `--env ONE=1,TWO=2`. ([#47460](https://github.com/kubernetes/kubernetes/pull/47460), [@mengqiy](https://github.com/mengqiy))
|
||||
|
|
|
|||
282
vendor/k8s.io/kubernetes/CHANGELOG-1.9.md
generated
vendored
282
vendor/k8s.io/kubernetes/CHANGELOG-1.9.md
generated
vendored
|
|
@ -1,282 +0,0 @@
|
|||
<!-- BEGIN MUNGE: GENERATED_TOC -->
|
||||
- [v1.9.0-alpha.1](#v190-alpha1)
|
||||
- [Downloads for v1.9.0-alpha.1](#downloads-for-v190-alpha1)
|
||||
- [Client Binaries](#client-binaries)
|
||||
- [Server Binaries](#server-binaries)
|
||||
- [Node Binaries](#node-binaries)
|
||||
- [Changelog since v1.8.0-alpha.3](#changelog-since-v180-alpha3)
|
||||
- [Action Required](#action-required)
|
||||
- [Other notable changes](#other-notable-changes)
|
||||
<!-- END MUNGE: GENERATED_TOC -->
|
||||
|
||||
<!-- NEW RELEASE NOTES ENTRY -->
|
||||
|
||||
|
||||
# v1.9.0-alpha.1
|
||||
|
||||
[Documentation](https://docs.k8s.io) & [Examples](https://releases.k8s.io/master/examples)
|
||||
|
||||
## Downloads for v1.9.0-alpha.1
|
||||
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes.tar.gz) | `e2dc3eebf79368c783b64f5b6642a287cc2fd777547d99f240a35cce1f620ffc`
|
||||
[kubernetes-src.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-src.tar.gz) | `ca8659187047f2d38a7c0ee313189c19ec35646c6ebaa8f59f2f098eca33dca0`
|
||||
|
||||
### Client Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-client-darwin-386.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-darwin-386.tar.gz) | `51e0df7e6611ff4a9b3759b05e65c80555317bff03282ef39a9b53b27cdeff42`
|
||||
[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-darwin-amd64.tar.gz) | `c6c57cc92cc456a644c0965a6aa2bd260125807b450d69376e0edb6c98aaf4d7`
|
||||
[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-386.tar.gz) | `399c8cb448d76accb71edcb00bee474f172d416c8c4f5253994e4e2d71e0dece`
|
||||
[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-amd64.tar.gz) | `fde75d7267592b34609299a93ee7e54b26a948e6f9a1f64ced666c0aae4455aa`
|
||||
[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-arm64.tar.gz) | `b38810cf87735efb0af027b7c77e4e8c8f5821f235cf33ae9eee346e6d1a0b84`
|
||||
[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-arm.tar.gz) | `a36427c2f2b81d42702a12392070f7dd3635b651bb04ae925d0bdf3ec50f83aa`
|
||||
[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-ppc64le.tar.gz) | `9dee0f636eef09bfec557a50e4f8f4b69e0588bbd0b77f6da50cc155e1679880`
|
||||
[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-linux-s390x.tar.gz) | `4a6246d5de5c3957ed41b8943fa03e74fb646595346f7c72beaf7b030fe6872e`
|
||||
[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-windows-386.tar.gz) | `1ee384f4bb02e614c86bf84cdfdc42faffa659aaba4a1c759ec26f03eb438149`
|
||||
[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-client-windows-amd64.tar.gz) | `e70d8935abefea0307780e899238bb10ec27c8f0d77702cf25de230b6abf7fb4`
|
||||
|
||||
### Server Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-server-linux-amd64.tar.gz) | `7fff06370c4f37e1fe789cc160fce0c93535991f63d7fe7d001378f17027d9d8`
|
||||
[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-server-linux-arm64.tar.gz) | `65cd60512ea0bf508aa65f8d22a6f3094db394f00b3cd6bd63fe02b795514ab2`
|
||||
[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-server-linux-arm.tar.gz) | `0ecb341a047f1a9dface197f11f05f15853570cfb474c82538c7d61b40bd53ae`
|
||||
[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-server-linux-ppc64le.tar.gz) | `cea9eed4c24e7f29994ecc12674bff69d108692d3c9be3e8bd939b3c4f281892`
|
||||
[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-server-linux-s390x.tar.gz) | `4d50799e5989de6d9ec316d2051497a3617b635e89fa44e01e64fed544d96e07`
|
||||
|
||||
### Node Binaries
|
||||
|
||||
filename | sha256 hash
|
||||
-------- | -----------
|
||||
[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-linux-amd64.tar.gz) | `e956b9c1e5b47f800953ad0f82fae23774a2f43079dc02d98a90d5bfdca0bad6`
|
||||
[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-linux-arm64.tar.gz) | `ede6a85db555dd84e8d7180bdd58712933c38567ab6c97a80d0845be2974d968`
|
||||
[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-linux-arm.tar.gz) | `4ac6a1784fa1e20be8a4e7fa0ff8b4defc725e6c058ff97068bf7bfa6a11c77d`
|
||||
[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-linux-ppc64le.tar.gz) | `0d9c8c7e0892d7b678f3b4b7736087da91cb40c5f169e4302e9f4637c516207a`
|
||||
[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-linux-s390x.tar.gz) | `2fdde192a84410c784e5d1e813985e9a19ce62e3d9bb2215481cbce9286329da`
|
||||
[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.9.0-alpha.1/kubernetes-node-windows-amd64.tar.gz) | `543110cc69b57471f3824d96cbd16b003ac2cddaa19ca4bdefced0af61fd24f2`
|
||||
|
||||
## Changelog since v1.8.0-alpha.3
|
||||
|
||||
### Action Required
|
||||
|
||||
* New GCE or GKE clusters created with `cluster/kube-up.sh` will not enable the legacy ABAC authorizer by default. If you would like to enable the legacy ABAC authorizer, export ENABLE_LEGACY_ABAC=true before running `cluster/kube-up.sh`. ([#51367](https://github.com/kubernetes/kubernetes/pull/51367), [@cjcullen](https://github.com/cjcullen))
|
||||
* The OwnerReferencesPermissionEnforcement admission plugin now requires `update` permission on the `finalizers` subresource of the referenced owner in order to set `blockOwnerDeletion` on an owner reference. ([#49133](https://github.com/kubernetes/kubernetes/pull/49133), [@deads2k](https://github.com/deads2k))
|
||||
* The deprecated alpha and beta initContainer annotations are no longer supported. Init containers must be specified using the initContainers field in the pod spec. ([#51816](https://github.com/kubernetes/kubernetes/pull/51816), [@liggitt](https://github.com/liggitt))
|
||||
* Action required: validation rule on metadata.initializers.pending[x].name is tightened. The initializer name needs to contain at least three segments separated by dots. If you create objects with pending initializers, (i.e., not relying on apiserver adding pending initializers according to initializerconfiguration), you need to update the initializer name in existing objects and in configuration files to comply to the new validation rule. ([#51283](https://github.com/kubernetes/kubernetes/pull/51283), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Audit policy supports matching subresources and resource names, but the top level resource no longer matches the subresouce. For example "pods" no longer matches requests to the logs subresource of pods. Use "pods/logs" to match subresources. ([#48836](https://github.com/kubernetes/kubernetes/pull/48836), [@ericchiang](https://github.com/ericchiang))
|
||||
* Protobuf serialization does not distinguish between `[]` and `null`. ([#45294](https://github.com/kubernetes/kubernetes/pull/45294), [@liggitt](https://github.com/liggitt))
|
||||
* API fields previously capable of storing and returning either `[]` and `null` via JSON API requests (for example, the Endpoints `subsets` field) can now store only `null` when created using the protobuf content-type or stored in etcd using protobuf serialization (the default in 1.6+). JSON API clients should tolerate `null` values for such fields, and treat `null` and `[]` as equivalent in meaning unless specifically documented otherwise for a particular field.
|
||||
|
||||
### Other notable changes
|
||||
|
||||
* PersistentVolumeLabel admission controller is now deprecated. ([#52618](https://github.com/kubernetes/kubernetes/pull/52618), [@dims](https://github.com/dims))
|
||||
* Mark the LBaaS v1 of OpenStack cloud provider deprecated. ([#52821](https://github.com/kubernetes/kubernetes/pull/52821), [@FengyunPan](https://github.com/FengyunPan))
|
||||
* NONE ([#52819](https://github.com/kubernetes/kubernetes/pull/52819), [@verult](https://github.com/verult))
|
||||
* Mark image as deliberately optional in v1 Container struct. Many objects in the Kubernetes API inherit the container struct and only Pods require the field to be set. ([#48406](https://github.com/kubernetes/kubernetes/pull/48406), [@gyliu513](https://github.com/gyliu513))
|
||||
* [fluentd-gcp addon] Update Stackdriver plugin to version 0.6.7 ([#52565](https://github.com/kubernetes/kubernetes/pull/52565), [@crassirostris](https://github.com/crassirostris))
|
||||
* Remove duplicate proto errors in kubelet. ([#52132](https://github.com/kubernetes/kubernetes/pull/52132), [@adityadani](https://github.com/adityadani))
|
||||
* [fluentd-gcp addon] Remove audit logs from the fluentd configuration ([#52777](https://github.com/kubernetes/kubernetes/pull/52777), [@crassirostris](https://github.com/crassirostris))
|
||||
* Set defaults for successfulJobsHistoryLimit (3) and failedJobsHistoryLimit (1) in batch/v1beta1.CronJobs ([#52533](https://github.com/kubernetes/kubernetes/pull/52533), [@soltysh](https://github.com/soltysh))
|
||||
* Fix: update system spec to support Docker 17.03 ([#52666](https://github.com/kubernetes/kubernetes/pull/52666), [@yguo0905](https://github.com/yguo0905))
|
||||
* Fix panic in ControllerManager on GCE when it has a problem with creating external loadbalancer healthcheck ([#52646](https://github.com/kubernetes/kubernetes/pull/52646), [@gmarek](https://github.com/gmarek))
|
||||
* PSP: add support for using `*` as a value in `allowedCapabilities` to allow to request any capabilities ([#51337](https://github.com/kubernetes/kubernetes/pull/51337), [@php-coder](https://github.com/php-coder))
|
||||
* [fluentd-gcp addon] By default ingest apiserver audit logs written to file in JSON format. ([#52541](https://github.com/kubernetes/kubernetes/pull/52541), [@crassirostris](https://github.com/crassirostris))
|
||||
* The autoscaling/v2beta1 API group is now enabled by default. ([#52549](https://github.com/kubernetes/kubernetes/pull/52549), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* Add CLUSTER_SIGNING_DURATION environment variable to cluster ([#52497](https://github.com/kubernetes/kubernetes/pull/52497), [@jcbsmpsn](https://github.com/jcbsmpsn))
|
||||
* configuration scripts to allow configuration of signing duration of
|
||||
* certificates issued via the Certificate Signing Request API.
|
||||
* Introduce policy to allow the HPA to consume the metrics.k8s.io and custom.metrics.k8s.io API groups. ([#52572](https://github.com/kubernetes/kubernetes/pull/52572), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* kubelet to master communication when doing node status updates now has a timeout to prevent indefinite hangs ([#52176](https://github.com/kubernetes/kubernetes/pull/52176), [@liggitt](https://github.com/liggitt))
|
||||
* Introduced Metrics Server in version v0.2.0. For more details see https://github.com/kubernetes-incubator/metrics-server/releases/tag/v0.2.0. ([#52548](https://github.com/kubernetes/kubernetes/pull/52548), [@piosz](https://github.com/piosz))
|
||||
* Adds ROTATE_CERTIFICATES environment variable to kube-up.sh script for GCE ([#52115](https://github.com/kubernetes/kubernetes/pull/52115), [@jcbsmpsn](https://github.com/jcbsmpsn))
|
||||
* clusters. When that var is set to true, the command line flag enabling kubelet
|
||||
* client certificate rotation will be added to the kubelet command line.
|
||||
* Make sure that resources being updated are handled correctly by Quota system ([#52452](https://github.com/kubernetes/kubernetes/pull/52452), [@gnufied](https://github.com/gnufied))
|
||||
* WATCHLIST calls are now reported as WATCH verbs in prometheus for the apiserver_request_* series. A new "scope" label is added to all apiserver_request_* values that is either 'cluster', 'resource', or 'namespace' depending on which level the query is performed at. ([#52237](https://github.com/kubernetes/kubernetes/pull/52237), [@smarterclayton](https://github.com/smarterclayton))
|
||||
* Fixed the webhook admission plugin so that it works even if the apiserver and the nodes are in two networks (e.g., in GKE). ([#50476](https://github.com/kubernetes/kubernetes/pull/50476), [@caesarxuchao](https://github.com/caesarxuchao))
|
||||
* Fixed the webhook admission plugin so that webhook author could use the DNS name of the service as the CommonName when generating the server cert for the webhook.
|
||||
* Action required:
|
||||
* Anyone who generated server cert for admission webhooks need to regenerate the cert. Previously, when generating server cert for the admission webhook, the CN value doesn't matter. Now you must set it to the DNS name of the webhook service, i.e., `<service.Name>.<service.Namespace>.svc`.
|
||||
* Ignore pods marked for deletion that exceed their grace period in ResourceQuota ([#46542](https://github.com/kubernetes/kubernetes/pull/46542), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* custom resources that use unconventional pluralization now work properly with kubectl and garbage collection ([#50012](https://github.com/kubernetes/kubernetes/pull/50012), [@deads2k](https://github.com/deads2k))
|
||||
* [fluentd-gcp addon] Fluentd will trim lines exceeding 100KB instead of dropping them. ([#52289](https://github.com/kubernetes/kubernetes/pull/52289), [@crassirostris](https://github.com/crassirostris))
|
||||
* dockershim: check the error when syncing the checkpoint. ([#52125](https://github.com/kubernetes/kubernetes/pull/52125), [@yujuhong](https://github.com/yujuhong))
|
||||
* By default, clusters on GCE no longer sends RequestReceived audit event, if advanced audit is configured. ([#52343](https://github.com/kubernetes/kubernetes/pull/52343), [@crassirostris](https://github.com/crassirostris))
|
||||
* [BugFix] Soft Eviction timer works correctly ([#52046](https://github.com/kubernetes/kubernetes/pull/52046), [@dashpole](https://github.com/dashpole))
|
||||
* Azuredisk mount on windows node ([#51252](https://github.com/kubernetes/kubernetes/pull/51252), [@andyzhangx](https://github.com/andyzhangx))
|
||||
* [fluentd-gcp addon] Bug with event-exporter leaking memory on metrics in clusters with CA is fixed. ([#52263](https://github.com/kubernetes/kubernetes/pull/52263), [@crassirostris](https://github.com/crassirostris))
|
||||
* kubeadm: Enable kubelet client certificate rotation ([#52196](https://github.com/kubernetes/kubernetes/pull/52196), [@luxas](https://github.com/luxas))
|
||||
* Scheduler predicate developer should respect equivalence class cache ([#52146](https://github.com/kubernetes/kubernetes/pull/52146), [@resouer](https://github.com/resouer))
|
||||
* The `kube-cloud-controller-manager` flag `--service-account-private-key-file` was non-functional and is now deprecated. ([#50289](https://github.com/kubernetes/kubernetes/pull/50289), [@liggitt](https://github.com/liggitt))
|
||||
* The `kube-cloud-controller-manager` flag `--use-service-account-credentials` is now honored consistently, regardless of whether `--service-account-private-key-file` was specified.
|
||||
* Fix credentials providers for docker sandbox image. ([#51870](https://github.com/kubernetes/kubernetes/pull/51870), [@feiskyer](https://github.com/feiskyer))
|
||||
* NONE ([#52120](https://github.com/kubernetes/kubernetes/pull/52120), [@abgworrall](https://github.com/abgworrall))
|
||||
* Fixed an issue looking up cronjobs when they existed in more than one API version ([#52227](https://github.com/kubernetes/kubernetes/pull/52227), [@liggitt](https://github.com/liggitt))
|
||||
* Add priority-based preemption to the scheduler. ([#50949](https://github.com/kubernetes/kubernetes/pull/50949), [@bsalamat](https://github.com/bsalamat))
|
||||
* Add CLUSTER_SIGNING_DURATION environment variable to cluster configuration scripts ([#51844](https://github.com/kubernetes/kubernetes/pull/51844), [@jcbsmpsn](https://github.com/jcbsmpsn))
|
||||
* to allow configuration of signing duration of certificates issued via the Certificate
|
||||
* Signing Request API.
|
||||
* Adding German translation for kubectl ([#51867](https://github.com/kubernetes/kubernetes/pull/51867), [@Steffen911](https://github.com/Steffen911))
|
||||
* The ScaleIO volume plugin can now read the SDC GUID value as node label scaleio.sdcGuid; if binary drv_cfg is not installed, the plugin will still work properly; if node label not found, it defaults to drv_cfg if installed. ([#50780](https://github.com/kubernetes/kubernetes/pull/50780), [@vladimirvivien](https://github.com/vladimirvivien))
|
||||
* A policy with 0 rules should return an error ([#51782](https://github.com/kubernetes/kubernetes/pull/51782), [@charrywanganthony](https://github.com/charrywanganthony))
|
||||
* Log a warning when --audit-policy-file not passed to apiserver ([#52071](https://github.com/kubernetes/kubernetes/pull/52071), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* Fixes an issue with upgrade requests made via pod/service/node proxy subresources sending a non-absolute HTTP request-uri to backends ([#52065](https://github.com/kubernetes/kubernetes/pull/52065), [@liggitt](https://github.com/liggitt))
|
||||
* kubeadm: add `kubeadm phase addons` command ([#51171](https://github.com/kubernetes/kubernetes/pull/51171), [@andrewrynhard](https://github.com/andrewrynhard))
|
||||
* Fix for Nodes in vSphere lacking an InternalIP. ([#48760](https://github.com/kubernetes/kubernetes/pull/48760)) ([#49202](https://github.com/kubernetes/kubernetes/pull/49202), [@cbonte](https://github.com/cbonte))
|
||||
* v2 of the autoscaling API group, including improvements to the HorizontalPodAutoscaler, has moved from alpha1 to beta1. ([#50708](https://github.com/kubernetes/kubernetes/pull/50708), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* Fixed a bug where some alpha features were enabled by default. ([#51839](https://github.com/kubernetes/kubernetes/pull/51839), [@jennybuckley](https://github.com/jennybuckley))
|
||||
* Implement StatsProvider interface using CRI stats ([#51557](https://github.com/kubernetes/kubernetes/pull/51557), [@yguo0905](https://github.com/yguo0905))
|
||||
* set AdvancedAuditing feature gate to true by default ([#51943](https://github.com/kubernetes/kubernetes/pull/51943), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* Migrate the metrics/v1alpha1 API to metrics/v1beta1. The HorizontalPodAutoscaler ([#51653](https://github.com/kubernetes/kubernetes/pull/51653), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* controller REST client now uses that version. For v1beta1, the API is now known as
|
||||
* resource-metrics.metrics.k8s.io.
|
||||
* In GCE with COS, increase TasksMax for Docker service to raise cap on number of threads/processes used by containers. ([#51986](https://github.com/kubernetes/kubernetes/pull/51986), [@yujuhong](https://github.com/yujuhong))
|
||||
* Fixes an issue with APIService auto-registration affecting rolling HA apiserver restarts that add or remove API groups being served. ([#51921](https://github.com/kubernetes/kubernetes/pull/51921), [@liggitt](https://github.com/liggitt))
|
||||
* Sharing a PID namespace between containers in a pod is disabled by default in 1.8. To enable for a node, use the --docker-disable-shared-pid=false kubelet flag. Note that PID namespace sharing requires docker >= 1.13.1. ([#51634](https://github.com/kubernetes/kubernetes/pull/51634), [@verb](https://github.com/verb))
|
||||
* Build test targets for all server platforms ([#51873](https://github.com/kubernetes/kubernetes/pull/51873), [@luxas](https://github.com/luxas))
|
||||
* Add EgressRule to NetworkPolicy ([#51351](https://github.com/kubernetes/kubernetes/pull/51351), [@cmluciano](https://github.com/cmluciano))
|
||||
* Allow DNS resolution of service name for COS using containerized mounter. It fixed the issue with DNS resolution of NFS and Gluster services. ([#51645](https://github.com/kubernetes/kubernetes/pull/51645), [@jingxu97](https://github.com/jingxu97))
|
||||
* Fix journalctl leak on kubelet restart ([#51751](https://github.com/kubernetes/kubernetes/pull/51751), [@dashpole](https://github.com/dashpole))
|
||||
* Fix container memory rss
|
||||
* Add hugepages monitoring support
|
||||
* Fix incorrect CPU usage metrics with 4.7 kernel
|
||||
* Add tmpfs monitoring support
|
||||
* Support for Huge pages in empty_dir volume plugin ([#50072](https://github.com/kubernetes/kubernetes/pull/50072), [@squall0gd](https://github.com/squall0gd))
|
||||
* [Huge pages](https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt) can now be used with empty dir volume plugin.
|
||||
* Alpha support for pre-allocated hugepages ([#50859](https://github.com/kubernetes/kubernetes/pull/50859), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* add support for client-side spam filtering of events ([#47367](https://github.com/kubernetes/kubernetes/pull/47367), [@derekwaynecarr](https://github.com/derekwaynecarr))
|
||||
* Provide a way to omit Event stages in audit policy ([#49280](https://github.com/kubernetes/kubernetes/pull/49280), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* Introduced Metrics Server ([#51792](https://github.com/kubernetes/kubernetes/pull/51792), [@piosz](https://github.com/piosz))
|
||||
* Implement Controller for growing persistent volumes ([#49727](https://github.com/kubernetes/kubernetes/pull/49727), [@gnufied](https://github.com/gnufied))
|
||||
* Kubernetes 1.8 supports docker version 1.11.x, 1.12.x and 1.13.x. And also supports overlay2. ([#51845](https://github.com/kubernetes/kubernetes/pull/51845), [@Random-Liu](https://github.com/Random-Liu))
|
||||
* The Deployment, DaemonSet, and ReplicaSet kinds in the extensions/v1beta1 group version are now deprecated, as are the Deployment, StatefulSet, and ControllerRevision kinds in apps/v1beta1. As they will not be removed until after a GA version becomes available, you may continue to use these kinds in existing code. However, all new code should be developed against the apps/v1beta2 group version. ([#51828](https://github.com/kubernetes/kubernetes/pull/51828), [@kow3ns](https://github.com/kow3ns))
|
||||
* kubeadm: Detect kubelet readiness and error out if the kubelet is unhealthy ([#51369](https://github.com/kubernetes/kubernetes/pull/51369), [@luxas](https://github.com/luxas))
|
||||
* Fix providerID update validation ([#51761](https://github.com/kubernetes/kubernetes/pull/51761), [@karataliu](https://github.com/karataliu))
|
||||
* Calico has been updated to v2.5, RBAC added, and is now automatically scaled when GCE clusters are resized. ([#51237](https://github.com/kubernetes/kubernetes/pull/51237), [@gunjan5](https://github.com/gunjan5))
|
||||
* Add backoff policy and failed pod limit for a job ([#51153](https://github.com/kubernetes/kubernetes/pull/51153), [@clamoriniere1A](https://github.com/clamoriniere1A))
|
||||
* Adds a new alpha EventRateLimit admission control that is used to limit the number of event queries that are accepted by the API Server. ([#50925](https://github.com/kubernetes/kubernetes/pull/50925), [@staebler](https://github.com/staebler))
|
||||
* The OpenID Connect authenticator can now use a custom prefix, or omit the default prefix, for username and groups claims through the --oidc-username-prefix and --oidc-groups-prefix flags. For example, the authenticator can map a user with the username "jane" to "google:jane" by supplying the "google:" username prefix. ([#50875](https://github.com/kubernetes/kubernetes/pull/50875), [@ericchiang](https://github.com/ericchiang))
|
||||
* Implemented `kubeadm upgrade plan` for checking whether you can upgrade your cluster to a newer version ([#48899](https://github.com/kubernetes/kubernetes/pull/48899), [@luxas](https://github.com/luxas))
|
||||
* Implemented `kubeadm upgrade apply` for upgrading your cluster from one version to an other
|
||||
* Switch to audit.k8s.io/v1beta1 in audit. ([#51719](https://github.com/kubernetes/kubernetes/pull/51719), [@soltysh](https://github.com/soltysh))
|
||||
* update QEMU version to v2.9.1 ([#50597](https://github.com/kubernetes/kubernetes/pull/50597), [@dixudx](https://github.com/dixudx))
|
||||
* controllers backoff better in face of quota denial ([#49142](https://github.com/kubernetes/kubernetes/pull/49142), [@joelsmith](https://github.com/joelsmith))
|
||||
* The event table output under `kubectl describe` has been simplified to show only the most essential info. ([#51748](https://github.com/kubernetes/kubernetes/pull/51748), [@smarterclayton](https://github.com/smarterclayton))
|
||||
* Use arm32v7|arm64v8 images instead of the deprecated armhf|aarch64 image organizations ([#50602](https://github.com/kubernetes/kubernetes/pull/50602), [@dixudx](https://github.com/dixudx))
|
||||
* audit newest impersonated user info in the ResponseStarted, ResponseComplete audit stage ([#48184](https://github.com/kubernetes/kubernetes/pull/48184), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* Fixed bug in AWS provider to handle multiple IPs when using more than 1 network interface per ec2 instance. ([#50112](https://github.com/kubernetes/kubernetes/pull/50112), [@jlz27](https://github.com/jlz27))
|
||||
* Add flag "--include-uninitialized" to kubectl annotate, apply, edit-last-applied, delete, describe, edit, get, label, set. "--include-uninitialized=true" makes kubectl commands apply to uninitialized objects, which by default are ignored if the names of the objects are not provided. "--all" also makes kubectl commands apply to uninitialized objects. Please see the [initializer](https://kubernetes.io/docs/admin/extensible-admission-controllers/) doc for more details. ([#50497](https://github.com/kubernetes/kubernetes/pull/50497), [@dixudx](https://github.com/dixudx))
|
||||
* GCE: Service object now supports "Network Tiers" as an Alpha feature via annotations. ([#51301](https://github.com/kubernetes/kubernetes/pull/51301), [@yujuhong](https://github.com/yujuhong))
|
||||
* When using kube-up.sh on GCE, user could set env `ENABLE_POD_PRIORITY=true` to enable pod priority feature gate. ([#51069](https://github.com/kubernetes/kubernetes/pull/51069), [@MrHohn](https://github.com/MrHohn))
|
||||
* The names generated for ControllerRevision and ReplicaSet are consistent with the GenerateName functionality of the API Server and will not contain "bad words". ([#51538](https://github.com/kubernetes/kubernetes/pull/51538), [@kow3ns](https://github.com/kow3ns))
|
||||
* PersistentVolumeClaim metrics like "volume_stats_inodes" and "volume_stats_capacity_bytes" are now reported via kubelet prometheus ([#51553](https://github.com/kubernetes/kubernetes/pull/51553), [@wongma7](https://github.com/wongma7))
|
||||
* When using IP aliases, use a secondary range rather than subnetwork to reserve cluster IPs. ([#51690](https://github.com/kubernetes/kubernetes/pull/51690), [@bowei](https://github.com/bowei))
|
||||
* IPAM controller unifies handling of node pod CIDR range allocation. ([#51374](https://github.com/kubernetes/kubernetes/pull/51374), [@bowei](https://github.com/bowei))
|
||||
* It is intended to supersede the logic that is currently in range_allocator
|
||||
* and cloud_cidr_allocator. (ALPHA FEATURE)
|
||||
* Note: for this change, the other allocators still exist and are the default.
|
||||
* It supports two modes:
|
||||
* CIDR range allocations done within the cluster that are then propagated out to the cloud provider.
|
||||
* Cloud provider managed IPAM that is then reflected into the cluster.
|
||||
* The Kubernetes API server now supports the ability to break large LIST calls into multiple smaller chunks. A client can specify a limit to the number of results to return, and if more results exist a token will be returned that allows the client to continue the previous list call repeatedly until all results are retrieved. The resulting list is identical to a list call that does not perform chunking thanks to capabilities provided by etcd3. This allows the server to use less memory and CPU responding with very large lists. This feature is gated as APIListChunking and is not enabled by default. The 1.9 release will begin using this by default from all informers. ([#48921](https://github.com/kubernetes/kubernetes/pull/48921), [@smarterclayton](https://github.com/smarterclayton))
|
||||
* add reconcile command to kubectl auth ([#51636](https://github.com/kubernetes/kubernetes/pull/51636), [@deads2k](https://github.com/deads2k))
|
||||
* Advanced audit allows logging failed login attempts ([#51119](https://github.com/kubernetes/kubernetes/pull/51119), [@soltysh](https://github.com/soltysh))
|
||||
* kubeadm: Add support for using an external CA whose key is never stored in the cluster ([#50832](https://github.com/kubernetes/kubernetes/pull/50832), [@nckturner](https://github.com/nckturner))
|
||||
* the custom metrics API (custom.metrics.k8s.io) has moved from v1alpha1 to v1beta1 ([#50920](https://github.com/kubernetes/kubernetes/pull/50920), [@DirectXMan12](https://github.com/DirectXMan12))
|
||||
* Add backoff policy and failed pod limit for a job ([#48075](https://github.com/kubernetes/kubernetes/pull/48075), [@clamoriniere1A](https://github.com/clamoriniere1A))
|
||||
* Performs validation (when applying for example) against OpenAPI schema rather than Swagger 1.0. ([#51364](https://github.com/kubernetes/kubernetes/pull/51364), [@apelisse](https://github.com/apelisse))
|
||||
* Make all e2e tests lookup image to use from a centralized place. In that centralized place, add support for multiple platforms. ([#49457](https://github.com/kubernetes/kubernetes/pull/49457), [@mkumatag](https://github.com/mkumatag))
|
||||
* kubelet has alpha support for mount propagation. It is disabled by default and it is there for testing only. This feature may be redesigned or even removed in a future release. ([#46444](https://github.com/kubernetes/kubernetes/pull/46444), [@jsafrane](https://github.com/jsafrane))
|
||||
* Add selfsubjectrulesreview API for allowing users to query which permissions they have in a given namespace. ([#48051](https://github.com/kubernetes/kubernetes/pull/48051), [@xilabao](https://github.com/xilabao))
|
||||
* Kubelet re-binds /var/lib/kubelet directory with rshared mount propagation during startup if it is not shared yet. ([#45724](https://github.com/kubernetes/kubernetes/pull/45724), [@jsafrane](https://github.com/jsafrane))
|
||||
* Deviceplugin jiayingz ([#51209](https://github.com/kubernetes/kubernetes/pull/51209), [@jiayingz](https://github.com/jiayingz))
|
||||
* Make logdump support kubemark and support gke with 'use_custom_instance_list' ([#51834](https://github.com/kubernetes/kubernetes/pull/51834), [@shyamjvs](https://github.com/shyamjvs))
|
||||
* add apps/v1beta2 conversion test ([#49645](https://github.com/kubernetes/kubernetes/pull/49645), [@dixudx](https://github.com/dixudx))
|
||||
* Fixed an issue ([#47800](https://github.com/kubernetes/kubernetes/pull/47800)) where `kubectl logs -f` failed with `unexpected stream type ""`. ([#50381](https://github.com/kubernetes/kubernetes/pull/50381), [@sczizzo](https://github.com/sczizzo))
|
||||
* GCE: Internal load balancer IPs are now reserved during service sync to prevent losing the address to another service. ([#51055](https://github.com/kubernetes/kubernetes/pull/51055), [@nicksardo](https://github.com/nicksardo))
|
||||
* Switch JSON marshal/unmarshal to json-iterator library. Performance should be close to previous with no generated code. ([#48287](https://github.com/kubernetes/kubernetes/pull/48287), [@thockin](https://github.com/thockin))
|
||||
* Adds optional group and version information to the discovery interface, so that if an endpoint uses non-default values, the proper value of "kind" can be determined. Scale is a common example. ([#49971](https://github.com/kubernetes/kubernetes/pull/49971), [@deads2k](https://github.com/deads2k))
|
||||
* Fix security holes in GCE metadata proxy. ([#51302](https://github.com/kubernetes/kubernetes/pull/51302), [@ihmccreery](https://github.com/ihmccreery))
|
||||
* [#43077](https://github.com/kubernetes/kubernetes/pull/43077) introduced a condition where DaemonSet controller did not respect the TerminationGracePeriodSeconds of the Pods it created. This is now corrected. ([#51279](https://github.com/kubernetes/kubernetes/pull/51279), [@kow3ns](https://github.com/kow3ns))
|
||||
* Tainted nodes by conditions as following: ([#49257](https://github.com/kubernetes/kubernetes/pull/49257), [@k82cn](https://github.com/k82cn))
|
||||
* 'node.kubernetes.io/network-unavailable=:NoSchedule' if NetworkUnavailable is true
|
||||
* 'node.kubernetes.io/disk-pressure=:NoSchedule' if DiskPressure is true
|
||||
* 'node.kubernetes.io/memory-pressure=:NoSchedule' if MemoryPressure is true
|
||||
* 'node.kubernetes.io/out-of-disk=:NoSchedule' if OutOfDisk is true
|
||||
* rbd: default image format to v2 instead of deprecated v1 ([#51574](https://github.com/kubernetes/kubernetes/pull/51574), [@dillaman](https://github.com/dillaman))
|
||||
* Surface reasonable error when client detects connection closed. ([#51381](https://github.com/kubernetes/kubernetes/pull/51381), [@mengqiy](https://github.com/mengqiy))
|
||||
* Allow PSP's to specify a whitelist of allowed paths for host volume ([#50212](https://github.com/kubernetes/kubernetes/pull/50212), [@jhorwit2](https://github.com/jhorwit2))
|
||||
* For Deployment, ReplicaSet, and DaemonSet, selectors are now immutable when updating via the new `apps/v1beta2` API. For backward compatibility, selectors can still be changed when updating via `apps/v1beta1` or `extensions/v1beta1`. ([#50719](https://github.com/kubernetes/kubernetes/pull/50719), [@crimsonfaith91](https://github.com/crimsonfaith91))
|
||||
* Allows kubectl to use http caching mechanism for the OpenAPI schema. The cache directory can be configured through `--cache-dir` command line flag to kubectl. If set to empty string, caching will be disabled. ([#50404](https://github.com/kubernetes/kubernetes/pull/50404), [@apelisse](https://github.com/apelisse))
|
||||
* Pod log attempts are now reported in apiserver prometheus metrics with verb `CONNECT` since they can run for very long periods of time. ([#50123](https://github.com/kubernetes/kubernetes/pull/50123), [@WIZARD-CXY](https://github.com/WIZARD-CXY))
|
||||
* The `emptyDir.sizeLimit` field is now correctly omitted from API requests and responses when unset. ([#50163](https://github.com/kubernetes/kubernetes/pull/50163), [@jingxu97](https://github.com/jingxu97))
|
||||
* Promote CronJobs to batch/v1beta1. ([#51465](https://github.com/kubernetes/kubernetes/pull/51465), [@soltysh](https://github.com/soltysh))
|
||||
* Add local ephemeral storage support to LimitRange ([#50757](https://github.com/kubernetes/kubernetes/pull/50757), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* Add mount options field to StorageClass. The options listed there are automatically added to PVs provisioned using the class. ([#51228](https://github.com/kubernetes/kubernetes/pull/51228), [@wongma7](https://github.com/wongma7))
|
||||
* Add 'kubectl set env' command for setting environment variables inside containers for resources embedding pod templates ([#50998](https://github.com/kubernetes/kubernetes/pull/50998), [@zjj2wry](https://github.com/zjj2wry))
|
||||
* Implement IPVS-based in-cluster service load balancing ([#46580](https://github.com/kubernetes/kubernetes/pull/46580), [@dujun1990](https://github.com/dujun1990))
|
||||
* Release the kubelet client certificate rotation as beta. ([#51045](https://github.com/kubernetes/kubernetes/pull/51045), [@jcbsmpsn](https://github.com/jcbsmpsn))
|
||||
* Adds --append-hash flag to kubectl create configmap/secret, which will append a short hash of the configmap/secret contents to the name during creation. ([#49961](https://github.com/kubernetes/kubernetes/pull/49961), [@mtaufen](https://github.com/mtaufen))
|
||||
* Add validation for CustomResources via JSON Schema. ([#47263](https://github.com/kubernetes/kubernetes/pull/47263), [@nikhita](https://github.com/nikhita))
|
||||
* enqueue a sync task to wake up jobcontroller to check job ActiveDeadlineSeconds in time ([#48454](https://github.com/kubernetes/kubernetes/pull/48454), [@weiwei04](https://github.com/weiwei04))
|
||||
* Remove previous local ephemeral storage resource names: "ResourceStorageOverlay" and "ResourceStorageScratch" ([#51425](https://github.com/kubernetes/kubernetes/pull/51425), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* Add `retainKeys` to patchStrategy for v1 Volumes and extentions/v1beta1 DeploymentStrategy. ([#50296](https://github.com/kubernetes/kubernetes/pull/50296), [@mengqiy](https://github.com/mengqiy))
|
||||
* Add mount options field to PersistentVolume spec ([#50919](https://github.com/kubernetes/kubernetes/pull/50919), [@wongma7](https://github.com/wongma7))
|
||||
* Use of the alpha initializers feature now requires enabling the `Initializers` feature gate. This feature gate is auto-enabled if the `Initialzers` admission plugin is enabled. ([#51436](https://github.com/kubernetes/kubernetes/pull/51436), [@liggitt](https://github.com/liggitt))
|
||||
* Fix inconsistent Prometheus cAdvisor metrics ([#51473](https://github.com/kubernetes/kubernetes/pull/51473), [@bboreham](https://github.com/bboreham))
|
||||
* Add local ephemeral storage to downward API ([#50435](https://github.com/kubernetes/kubernetes/pull/50435), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* kubectl zsh autocompletion will work with compinit ([#50561](https://github.com/kubernetes/kubernetes/pull/50561), [@cblecker](https://github.com/cblecker))
|
||||
* [Experiment Only] When using kube-up.sh on GCE, user could set env `KUBE_PROXY_DAEMONSET=true` to run kube-proxy as a DaemonSet. kube-proxy is run as static pods by default. ([#50705](https://github.com/kubernetes/kubernetes/pull/50705), [@MrHohn](https://github.com/MrHohn))
|
||||
* Add --request-timeout to kube-apiserver to make global request timeout configurable. ([#51415](https://github.com/kubernetes/kubernetes/pull/51415), [@jpbetz](https://github.com/jpbetz))
|
||||
* Deprecate auto detecting cloud providers in kubelet. Auto detecting cloud providers go against the initiative for out-of-tree cloud providers as we'll now depend on cAdvisor integrations with cloud providers instead of the core repo. In the near future, `--cloud-provider` for kubelet will either be an empty string or `external`. ([#51312](https://github.com/kubernetes/kubernetes/pull/51312), [@andrewsykim](https://github.com/andrewsykim))
|
||||
* Add local ephemeral storage support to Quota ([#49610](https://github.com/kubernetes/kubernetes/pull/49610), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* Kubelet updates default labels if those are deprecated ([#47044](https://github.com/kubernetes/kubernetes/pull/47044), [@mrIncompetent](https://github.com/mrIncompetent))
|
||||
* Add error count and time-taken metrics for storage operations such as mount and attach, per-volume-plugin. ([#50036](https://github.com/kubernetes/kubernetes/pull/50036), [@wongma7](https://github.com/wongma7))
|
||||
* A new predicates, named 'CheckNodeCondition', was added to replace node condition filter. 'NetworkUnavailable', 'OutOfDisk' and 'NotReady' maybe reported as a reason when failed to schedule pods. ([#51117](https://github.com/kubernetes/kubernetes/pull/51117), [@k82cn](https://github.com/k82cn))
|
||||
* Add support for configurable groups for bootstrap token authentication. ([#50933](https://github.com/kubernetes/kubernetes/pull/50933), [@mattmoyer](https://github.com/mattmoyer))
|
||||
* Fix forbidden message format ([#49006](https://github.com/kubernetes/kubernetes/pull/49006), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* make volumesInUse sorted in node status updates ([#49849](https://github.com/kubernetes/kubernetes/pull/49849), [@dixudx](https://github.com/dixudx))
|
||||
* Adds `InstanceExists` and `InstanceExistsByProviderID` to cloud provider interface for the cloud controller manager ([#51087](https://github.com/kubernetes/kubernetes/pull/51087), [@prydie](https://github.com/prydie))
|
||||
* Dynamic Flexvolume plugin discovery. Flexvolume plugins can now be discovered on the fly rather than only at system initialization time. ([#50031](https://github.com/kubernetes/kubernetes/pull/50031), [@verult](https://github.com/verult))
|
||||
* add fieldSelector spec.schedulerName ([#50582](https://github.com/kubernetes/kubernetes/pull/50582), [@dixudx](https://github.com/dixudx))
|
||||
* Change eviction manager to manage one single local ephemeral storage resource ([#50889](https://github.com/kubernetes/kubernetes/pull/50889), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* Cloud Controller Manager now sets Node.Spec.ProviderID ([#50730](https://github.com/kubernetes/kubernetes/pull/50730), [@andrewsykim](https://github.com/andrewsykim))
|
||||
* Paramaterize session affinity timeout seconds in service API for Client IP based session affinity. ([#49850](https://github.com/kubernetes/kubernetes/pull/49850), [@m1093782566](https://github.com/m1093782566))
|
||||
* Changing scheduling part of the alpha feature 'LocalStorageCapacityIsolation' to manage one single local ephemeral storage resource ([#50819](https://github.com/kubernetes/kubernetes/pull/50819), [@NickrenREN](https://github.com/NickrenREN))
|
||||
* set --audit-log-format default to json ([#50971](https://github.com/kubernetes/kubernetes/pull/50971), [@CaoShuFeng](https://github.com/CaoShuFeng))
|
||||
* kubeadm: Implement a `--dry-run` mode and flag for `kubeadm` ([#51122](https://github.com/kubernetes/kubernetes/pull/51122), [@luxas](https://github.com/luxas))
|
||||
* kubectl rollout `history`, `status`, and `undo` subcommands now support StatefulSets. ([#49674](https://github.com/kubernetes/kubernetes/pull/49674), [@crimsonfaith91](https://github.com/crimsonfaith91))
|
||||
* Add IPBlock to Network Policy ([#50033](https://github.com/kubernetes/kubernetes/pull/50033), [@cmluciano](https://github.com/cmluciano))
|
||||
* Adding Italian translation for kubectl ([#50155](https://github.com/kubernetes/kubernetes/pull/50155), [@lucab85](https://github.com/lucab85))
|
||||
* Simplify capabilities handling in FlexVolume. ([#51169](https://github.com/kubernetes/kubernetes/pull/51169), [@MikaelCluseau](https://github.com/MikaelCluseau))
|
||||
* NONE ([#50669](https://github.com/kubernetes/kubernetes/pull/50669), [@jiulongzaitian](https://github.com/jiulongzaitian))
|
||||
* cloudprovider.Zones should support external cloud providers ([#50858](https://github.com/kubernetes/kubernetes/pull/50858), [@andrewsykim](https://github.com/andrewsykim))
|
||||
* Finalizers are now honored on custom resources, and on other resources even when garbage collection is disabled via the apiserver flag `--enable-garbage-collector=false` ([#51148](https://github.com/kubernetes/kubernetes/pull/51148), [@ironcladlou](https://github.com/ironcladlou))
|
||||
* Renamed the API server flag `--experimental-bootstrap-token-auth` to `--enable-bootstrap-token-auth`. The old value is accepted with a warning in 1.8 and will be removed in 1.9. ([#51198](https://github.com/kubernetes/kubernetes/pull/51198), [@mattmoyer](https://github.com/mattmoyer))
|
||||
* Azure file persistent volumes can use a new `secretNamespace` field to reference a secret in a different namespace than the one containing their bound persistent volume claim. The azure file persistent volume provisioner honors a corresponding `secretNamespace` storage class parameter to determine where to place secrets containing the storage account key. ([#47660](https://github.com/kubernetes/kubernetes/pull/47660), [@rootfs](https://github.com/rootfs))
|
||||
* Bumped gRPC version to 1.3.0 ([#51154](https://github.com/kubernetes/kubernetes/pull/51154), [@RenaudWasTaken](https://github.com/RenaudWasTaken))
|
||||
* Delete load balancers if the UIDs for services don't match. ([#50539](https://github.com/kubernetes/kubernetes/pull/50539), [@brendandburns](https://github.com/brendandburns))
|
||||
* Show events when describing service accounts ([#51035](https://github.com/kubernetes/kubernetes/pull/51035), [@mrogers950](https://github.com/mrogers950))
|
||||
* implement proposal 34058: hostPath volume type ([#46597](https://github.com/kubernetes/kubernetes/pull/46597), [@dixudx](https://github.com/dixudx))
|
||||
* HostAlias is now supported for both non-HostNetwork Pods and HostNetwork Pods. ([#50646](https://github.com/kubernetes/kubernetes/pull/50646), [@rickypai](https://github.com/rickypai))
|
||||
* CRDs support metadata.generation and implement spec/status split ([#50764](https://github.com/kubernetes/kubernetes/pull/50764), [@nikhita](https://github.com/nikhita))
|
||||
* Allow attach of volumes to multiple nodes for vSphere ([#51066](https://github.com/kubernetes/kubernetes/pull/51066), [@BaluDontu](https://github.com/BaluDontu))
|
||||
|
||||
|
||||
Please see the [Releases Page](https://github.com/kubernetes/kubernetes/releases) for older releases.
|
||||
|
||||
Release notes of older releases can be found in:
|
||||
- [CHANGELOG-1.2.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.2.md)
|
||||
- [CHANGELOG-1.3.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.3.md)
|
||||
- [CHANGELOG-1.4.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.4.md)
|
||||
- [CHANGELOG-1.5.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.5.md)
|
||||
- [CHANGELOG-1.6.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.6.md)
|
||||
- [CHANGELOG-1.7.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md)
|
||||
- [CHANGELOG-1.8.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md)
|
||||
|
||||
[]()
|
||||
18
vendor/k8s.io/kubernetes/CHANGELOG.md
generated
vendored
18
vendor/k8s.io/kubernetes/CHANGELOG.md
generated
vendored
|
|
@ -1,18 +0,0 @@
|
|||
## Development releases:
|
||||
|
||||
- [CHANGELOG-1.9.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md)
|
||||
|
||||
## Current release:
|
||||
|
||||
- [CHANGELOG-1.8.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md)
|
||||
|
||||
## Older releases:
|
||||
|
||||
- [CHANGELOG-1.7.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md)
|
||||
- [CHANGELOG-1.6.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.6.md)
|
||||
- [CHANGELOG-1.5.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.5.md)
|
||||
- [CHANGELOG-1.4.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.4.md)
|
||||
- [CHANGELOG-1.3.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.3.md)
|
||||
- [CHANGELOG-1.2.md](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.2.md)
|
||||
|
||||
[]()
|
||||
1
vendor/k8s.io/kubernetes/OWNERS_ALIASES
generated
vendored
1
vendor/k8s.io/kubernetes/OWNERS_ALIASES
generated
vendored
|
|
@ -174,5 +174,4 @@ aliases:
|
|||
- steveperry-53
|
||||
- radhikpac
|
||||
- jpbetz
|
||||
- cmluciano
|
||||
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/README.md
generated
vendored
2
vendor/k8s.io/kubernetes/README.md
generated
vendored
|
|
@ -1,6 +1,6 @@
|
|||
# Kubernetes
|
||||
|
||||
[![Submit Queue Widget]][Submit Queue] [![GoDoc Widget]][GoDoc] [](https://bestpractices.coreinfrastructure.org/projects/569)
|
||||
[![Submit Queue Widget]][Submit Queue] [![GoDoc Widget]][GoDoc]
|
||||
|
||||
<img src="https://github.com/kubernetes/kubernetes/raw/master/logo/logo.png" width="100">
|
||||
|
||||
|
|
|
|||
13
vendor/k8s.io/kubernetes/pkg/.import-restrictions
generated
vendored
13
vendor/k8s.io/kubernetes/pkg/.import-restrictions
generated
vendored
|
|
@ -1,13 +0,0 @@
|
|||
{
|
||||
"Rules": [
|
||||
{
|
||||
"SelectorRegexp": "k8s[.]io/kubernetes",
|
||||
"AllowedPrefixes": [
|
||||
""
|
||||
],
|
||||
"ForbiddenPrefixes": [
|
||||
"k8s.io/kubernetes/cmd"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
47
vendor/k8s.io/kubernetes/pkg/api/BUILD
generated
vendored
47
vendor/k8s.io/kubernetes/pkg/api/BUILD
generated
vendored
|
|
@ -15,7 +15,6 @@ go_library(
|
|||
"types.go",
|
||||
"zz_generated.deepcopy.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/api",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
|
|
@ -37,10 +36,53 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["taint_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api",
|
||||
library = ":go_default_library",
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_xtest",
|
||||
srcs = [
|
||||
"conversion_test.go",
|
||||
"copy_test.go",
|
||||
"deep_copy_test.go",
|
||||
"defaulting_test.go",
|
||||
"meta_test.go",
|
||||
"serialization_proto_test.go",
|
||||
"serialization_test.go",
|
||||
"unstructured_test.go",
|
||||
],
|
||||
deps = [
|
||||
":go_default_library",
|
||||
"//pkg/api/testapi:go_default_library",
|
||||
"//pkg/api/testing:go_default_library",
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/apis/extensions:go_default_library",
|
||||
"//pkg/apis/extensions/v1beta1:go_default_library",
|
||||
"//vendor/github.com/gogo/protobuf/proto:go_default_library",
|
||||
"//vendor/github.com/golang/protobuf/proto:go_default_library",
|
||||
"//vendor/github.com/google/gofuzz:go_default_library",
|
||||
"//vendor/github.com/json-iterator/go:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/conversion/unstructured:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
|
|
@ -65,6 +107,7 @@ filegroup(
|
|||
"//pkg/api/testapi:all-srcs",
|
||||
"//pkg/api/testing:all-srcs",
|
||||
"//pkg/api/unversioned:all-srcs",
|
||||
"//pkg/api/util:all-srcs",
|
||||
"//pkg/api/v1:all-srcs",
|
||||
"//pkg/api/validation:all-srcs",
|
||||
],
|
||||
|
|
|
|||
117
vendor/k8s.io/kubernetes/pkg/api/conversion_test.go
generated
vendored
Normal file
117
vendor/k8s.io/kubernetes/pkg/api/conversion_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
Copyright 2015 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 api_test
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"testing"
|
||||
|
||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
kapitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
)
|
||||
|
||||
func BenchmarkPodConversion(b *testing.B) {
|
||||
apiObjectFuzzer := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(benchmarkSeed), api.Codecs)
|
||||
items := make([]api.Pod, 4)
|
||||
for i := range items {
|
||||
apiObjectFuzzer.Fuzz(&items[i])
|
||||
items[i].Spec.InitContainers = nil
|
||||
items[i].Status.InitContainerStatuses = nil
|
||||
}
|
||||
|
||||
// add a fixed item
|
||||
items = append(items, benchmarkPod)
|
||||
width := len(items)
|
||||
|
||||
scheme := api.Scheme
|
||||
for i := 0; i < b.N; i++ {
|
||||
pod := &items[i%width]
|
||||
versionedObj, err := scheme.UnsafeConvertToVersion(pod, api.Registry.GroupOrDie(api.GroupName).GroupVersion)
|
||||
if err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
if _, err = scheme.UnsafeConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion()); err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkNodeConversion(b *testing.B) {
|
||||
data, err := ioutil.ReadFile("node_example.json")
|
||||
if err != nil {
|
||||
b.Fatalf("Unexpected error while reading file: %v", err)
|
||||
}
|
||||
var node api.Node
|
||||
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil {
|
||||
b.Fatalf("Unexpected error decoding node: %v", err)
|
||||
}
|
||||
|
||||
scheme := api.Scheme
|
||||
var result *api.Node
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
versionedObj, err := scheme.UnsafeConvertToVersion(&node, api.Registry.GroupOrDie(api.GroupName).GroupVersion)
|
||||
if err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
obj, err := scheme.UnsafeConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion())
|
||||
if err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
result = obj.(*api.Node)
|
||||
}
|
||||
b.StopTimer()
|
||||
if !apiequality.Semantic.DeepDerivative(node, *result) {
|
||||
b.Fatalf("Incorrect conversion: %s", diff.ObjectDiff(node, *result))
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkReplicationControllerConversion(b *testing.B) {
|
||||
data, err := ioutil.ReadFile("replication_controller_example.json")
|
||||
if err != nil {
|
||||
b.Fatalf("Unexpected error while reading file: %v", err)
|
||||
}
|
||||
var replicationController api.ReplicationController
|
||||
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil {
|
||||
b.Fatalf("Unexpected error decoding node: %v", err)
|
||||
}
|
||||
|
||||
scheme := api.Scheme
|
||||
var result *api.ReplicationController
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
versionedObj, err := scheme.UnsafeConvertToVersion(&replicationController, api.Registry.GroupOrDie(api.GroupName).GroupVersion)
|
||||
if err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
obj, err := scheme.UnsafeConvertToVersion(versionedObj, testapi.Default.InternalGroupVersion())
|
||||
if err != nil {
|
||||
b.Fatalf("Conversion error: %v", err)
|
||||
}
|
||||
result = obj.(*api.ReplicationController)
|
||||
}
|
||||
b.StopTimer()
|
||||
if !apiequality.Semantic.DeepDerivative(replicationController, *result) {
|
||||
b.Fatalf("Incorrect conversion: expected %v, got %v", replicationController, *result)
|
||||
}
|
||||
}
|
||||
87
vendor/k8s.io/kubernetes/pkg/api/copy_test.go
generated
vendored
Normal file
87
vendor/k8s.io/kubernetes/pkg/api/copy_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
Copyright 2015 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 api_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/google/gofuzz"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||
"k8s.io/apimachinery/pkg/api/testing/roundtrip"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
kapitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
)
|
||||
|
||||
func TestDeepCopyApiObjects(t *testing.T) {
|
||||
for i := 0; i < *roundtrip.FuzzIters; i++ {
|
||||
for _, version := range []schema.GroupVersion{testapi.Default.InternalGroupVersion(), api.Registry.GroupOrDie(api.GroupName).GroupVersion} {
|
||||
f := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(rand.Int63()), api.Codecs)
|
||||
for kind := range api.Scheme.KnownTypes(version) {
|
||||
doDeepCopyTest(t, version.WithKind(kind), f)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func doDeepCopyTest(t *testing.T, kind schema.GroupVersionKind, f *fuzz.Fuzzer) {
|
||||
item, err := api.Scheme.New(kind)
|
||||
if err != nil {
|
||||
t.Fatalf("Could not create a %v: %s", kind, err)
|
||||
}
|
||||
f.Fuzz(item)
|
||||
itemCopy := item.DeepCopyObject()
|
||||
if !reflect.DeepEqual(item, itemCopy) {
|
||||
t.Errorf("\nexpected: %#v\n\ngot: %#v\n\ndiff: %v", item, itemCopy, diff.ObjectReflectDiff(item, itemCopy))
|
||||
}
|
||||
|
||||
prefuzzData := &bytes.Buffer{}
|
||||
if err := api.Codecs.LegacyCodec(kind.GroupVersion()).Encode(item, prefuzzData); err != nil {
|
||||
t.Errorf("Could not encode a %v: %s", kind, err)
|
||||
return
|
||||
}
|
||||
|
||||
// Refuzz the copy, which should have no effect on the original
|
||||
f.Fuzz(itemCopy)
|
||||
|
||||
postfuzzData := &bytes.Buffer{}
|
||||
if err := api.Codecs.LegacyCodec(kind.GroupVersion()).Encode(item, postfuzzData); err != nil {
|
||||
t.Errorf("Could not encode a %v: %s", kind, err)
|
||||
return
|
||||
}
|
||||
|
||||
if bytes.Compare(prefuzzData.Bytes(), postfuzzData.Bytes()) != 0 {
|
||||
t.Log(diff.StringDiff(prefuzzData.String(), postfuzzData.String()))
|
||||
t.Errorf("Fuzzing copy modified original of %#v", kind)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeepCopySingleType(t *testing.T) {
|
||||
for i := 0; i < *roundtrip.FuzzIters; i++ {
|
||||
for _, version := range []schema.GroupVersion{testapi.Default.InternalGroupVersion(), api.Registry.GroupOrDie(api.GroupName).GroupVersion} {
|
||||
f := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(rand.Int63()), api.Codecs)
|
||||
doDeepCopyTest(t, version.WithKind("Pod"), f)
|
||||
}
|
||||
}
|
||||
}
|
||||
177
vendor/k8s.io/kubernetes/pkg/api/deep_copy_test.go
generated
vendored
Normal file
177
vendor/k8s.io/kubernetes/pkg/api/deep_copy_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
Copyright 2015 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 api_test
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
)
|
||||
|
||||
func parseTimeOrDie(ts string) metav1.Time {
|
||||
t, err := time.Parse(time.RFC3339, ts)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return metav1.Time{Time: t}
|
||||
}
|
||||
|
||||
var benchmarkPod api.Pod = api.Pod{
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
Kind: "Pod",
|
||||
APIVersion: "v1",
|
||||
},
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "etcd-server-e2e-test-wojtekt-master",
|
||||
Namespace: "default",
|
||||
SelfLink: "/api/v1/namespaces/default/pods/etcd-server-e2e-test-wojtekt-master",
|
||||
UID: types.UID("a671734a-e8e5-11e4-8fde-42010af09327"),
|
||||
ResourceVersion: "22",
|
||||
CreationTimestamp: parseTimeOrDie("2015-04-22T11:49:36Z"),
|
||||
},
|
||||
Spec: api.PodSpec{
|
||||
Volumes: []api.Volume{
|
||||
{
|
||||
Name: "varetcd",
|
||||
VolumeSource: api.VolumeSource{
|
||||
HostPath: &api.HostPathVolumeSource{
|
||||
Path: "/mnt/master-pd/var/etcd",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Containers: []api.Container{
|
||||
{
|
||||
Name: "etcd-container",
|
||||
Image: "gcr.io/google_containers/etcd:2.0.9",
|
||||
Command: []string{
|
||||
"/usr/local/bin/etcd",
|
||||
"--addr",
|
||||
"127.0.0.1:2379",
|
||||
"--bind-addr",
|
||||
"127.0.0.1:2379",
|
||||
"--data-dir",
|
||||
"/var/etcd/data",
|
||||
},
|
||||
Ports: []api.ContainerPort{
|
||||
{
|
||||
Name: "serverport",
|
||||
HostPort: 2380,
|
||||
ContainerPort: 2380,
|
||||
Protocol: "TCP",
|
||||
},
|
||||
{
|
||||
Name: "clientport",
|
||||
HostPort: 2379,
|
||||
ContainerPort: 2379,
|
||||
Protocol: "TCP",
|
||||
},
|
||||
},
|
||||
VolumeMounts: []api.VolumeMount{
|
||||
{
|
||||
Name: "varetcd",
|
||||
MountPath: "/var/etcd",
|
||||
},
|
||||
},
|
||||
TerminationMessagePath: "/dev/termination-log",
|
||||
ImagePullPolicy: api.PullIfNotPresent,
|
||||
},
|
||||
},
|
||||
RestartPolicy: api.RestartPolicyAlways,
|
||||
DNSPolicy: api.DNSClusterFirst,
|
||||
NodeName: "e2e-test-wojtekt-master",
|
||||
},
|
||||
Status: api.PodStatus{
|
||||
Phase: api.PodRunning,
|
||||
Conditions: []api.PodCondition{
|
||||
{
|
||||
Type: api.PodReady,
|
||||
Status: api.ConditionTrue,
|
||||
},
|
||||
},
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Name: "etcd-container",
|
||||
State: api.ContainerState{
|
||||
Running: &api.ContainerStateRunning{
|
||||
StartedAt: parseTimeOrDie("2015-04-22T11:49:32Z"),
|
||||
},
|
||||
},
|
||||
Ready: true,
|
||||
RestartCount: 0,
|
||||
Image: "gcr.io/google_containers/etcd:2.0.9",
|
||||
ImageID: "docker://b6b9a86dc06aa1361357ca1b105feba961f6a4145adca6c54e142c0be0fe87b0",
|
||||
ContainerID: "docker://3cbbf818f1addfc252957b4504f56ef2907a313fe6afc47fc75373674255d46d",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func BenchmarkPodCopy(b *testing.B) {
|
||||
var result *api.Pod
|
||||
for i := 0; i < b.N; i++ {
|
||||
result = benchmarkPod.DeepCopy()
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(benchmarkPod, *result) {
|
||||
b.Fatalf("Incorrect copy: expected %v, got %v", benchmarkPod, *result)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkNodeCopy(b *testing.B) {
|
||||
data, err := ioutil.ReadFile("node_example.json")
|
||||
if err != nil {
|
||||
b.Fatalf("Unexpected error while reading file: %v", err)
|
||||
}
|
||||
var node api.Node
|
||||
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &node); err != nil {
|
||||
b.Fatalf("Unexpected error decoding node: %v", err)
|
||||
}
|
||||
|
||||
var result *api.Node
|
||||
for i := 0; i < b.N; i++ {
|
||||
result = node.DeepCopy()
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(node, *result) {
|
||||
b.Fatalf("Incorrect copy: expected %v, got %v", node, *result)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkReplicationControllerCopy(b *testing.B) {
|
||||
data, err := ioutil.ReadFile("replication_controller_example.json")
|
||||
if err != nil {
|
||||
b.Fatalf("Unexpected error while reading file: %v", err)
|
||||
}
|
||||
var replicationController api.ReplicationController
|
||||
if err := runtime.DecodeInto(testapi.Default.Codec(), data, &replicationController); err != nil {
|
||||
b.Fatalf("Unexpected error decoding node: %v", err)
|
||||
}
|
||||
|
||||
var result *api.ReplicationController
|
||||
for i := 0; i < b.N; i++ {
|
||||
result = replicationController.DeepCopy()
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(replicationController, *result) {
|
||||
b.Fatalf("Incorrect copy: expected %v, got %v", replicationController, *result)
|
||||
}
|
||||
}
|
||||
225
vendor/k8s.io/kubernetes/pkg/api/defaulting_test.go
generated
vendored
Normal file
225
vendor/k8s.io/kubernetes/pkg/api/defaulting_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
/*
|
||||
Copyright 2016 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 api_test
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"sort"
|
||||
"testing"
|
||||
|
||||
fuzz "github.com/google/gofuzz"
|
||||
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
|
||||
roundtrip "k8s.io/apimachinery/pkg/api/testing/roundtrip"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
type orderedGroupVersionKinds []schema.GroupVersionKind
|
||||
|
||||
func (o orderedGroupVersionKinds) Len() int { return len(o) }
|
||||
func (o orderedGroupVersionKinds) Swap(i, j int) { o[i], o[j] = o[j], o[i] }
|
||||
func (o orderedGroupVersionKinds) Less(i, j int) bool {
|
||||
return o[i].String() < o[j].String()
|
||||
}
|
||||
|
||||
// TODO: add a reflexive test that verifies that all SetDefaults functions are registered
|
||||
func TestDefaulting(t *testing.T) {
|
||||
// these are the known types with defaulters - you must add to this list if you add a top level defaulter
|
||||
typesWithDefaulting := map[schema.GroupVersionKind]struct{}{
|
||||
{Group: "", Version: "v1", Kind: "ConfigMap"}: {},
|
||||
{Group: "", Version: "v1", Kind: "ConfigMapList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Endpoints"}: {},
|
||||
{Group: "", Version: "v1", Kind: "EndpointsList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Namespace"}: {},
|
||||
{Group: "", Version: "v1", Kind: "NamespaceList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Node"}: {},
|
||||
{Group: "", Version: "v1", Kind: "NodeList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PersistentVolume"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PersistentVolumeList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PersistentVolumeClaim"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PersistentVolumeClaimList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PodAttachOptions"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PodExecOptions"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Pod"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PodList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PodTemplate"}: {},
|
||||
{Group: "", Version: "v1", Kind: "PodTemplateList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "ReplicationController"}: {},
|
||||
{Group: "", Version: "v1", Kind: "ReplicationControllerList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Secret"}: {},
|
||||
{Group: "", Version: "v1", Kind: "SecretList"}: {},
|
||||
{Group: "", Version: "v1", Kind: "Service"}: {},
|
||||
{Group: "", Version: "v1", Kind: "ServiceList"}: {},
|
||||
{Group: "apps", Version: "v1beta1", Kind: "StatefulSet"}: {},
|
||||
{Group: "apps", Version: "v1beta1", Kind: "StatefulSetList"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "StatefulSet"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "StatefulSetList"}: {},
|
||||
{Group: "autoscaling", Version: "v1", Kind: "HorizontalPodAutoscaler"}: {},
|
||||
{Group: "autoscaling", Version: "v1", Kind: "HorizontalPodAutoscalerList"}: {},
|
||||
{Group: "autoscaling", Version: "v2beta1", Kind: "HorizontalPodAutoscaler"}: {},
|
||||
{Group: "autoscaling", Version: "v2beta1", Kind: "HorizontalPodAutoscalerList"}: {},
|
||||
{Group: "batch", Version: "v1", Kind: "Job"}: {},
|
||||
{Group: "batch", Version: "v1", Kind: "JobList"}: {},
|
||||
{Group: "batch", Version: "v1beta1", Kind: "CronJob"}: {},
|
||||
{Group: "batch", Version: "v1beta1", Kind: "CronJobList"}: {},
|
||||
{Group: "batch", Version: "v1beta1", Kind: "JobTemplate"}: {},
|
||||
{Group: "batch", Version: "v2alpha1", Kind: "CronJob"}: {},
|
||||
{Group: "batch", Version: "v2alpha1", Kind: "CronJobList"}: {},
|
||||
{Group: "batch", Version: "v2alpha1", Kind: "JobTemplate"}: {},
|
||||
{Group: "certificates.k8s.io", Version: "v1beta1", Kind: "CertificateSigningRequest"}: {},
|
||||
{Group: "certificates.k8s.io", Version: "v1beta1", Kind: "CertificateSigningRequestList"}: {},
|
||||
{Group: "componentconfig", Version: "v1alpha1", Kind: "KubeProxyConfiguration"}: {},
|
||||
{Group: "componentconfig", Version: "v1alpha1", Kind: "KubeSchedulerConfiguration"}: {},
|
||||
{Group: "componentconfig", Version: "v1alpha1", Kind: "KubeletConfiguration"}: {},
|
||||
{Group: "kubeadm.k8s.io", Version: "v1alpha1", Kind: "MasterConfiguration"}: {},
|
||||
// This object contains only int fields which currently breaks the defaulting test because
|
||||
// it's pretty stupid. Once we add non integer fields, we should uncomment this.
|
||||
// {Group: "kubeadm.k8s.io", Version: "v1alpha1", Kind: "NodeConfiguration"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "DaemonSet"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "DaemonSetList"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "DaemonSet"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "DaemonSetList"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "Deployment"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "DeploymentList"}: {},
|
||||
{Group: "apps", Version: "v1beta1", Kind: "Deployment"}: {},
|
||||
{Group: "apps", Version: "v1beta1", Kind: "DeploymentList"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "Deployment"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "DeploymentList"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicy"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "PodSecurityPolicyList"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "ReplicaSet"}: {},
|
||||
{Group: "apps", Version: "v1beta2", Kind: "ReplicaSetList"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "ReplicaSet"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "ReplicaSetList"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "NetworkPolicy"}: {},
|
||||
{Group: "extensions", Version: "v1beta1", Kind: "NetworkPolicyList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "ClusterRoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "ClusterRoleBindingList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "RoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1alpha1", Kind: "RoleBindingList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "ClusterRoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "ClusterRoleBindingList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "RoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1beta1", Kind: "RoleBindingList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBindingList"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBinding"}: {},
|
||||
{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBindingList"}: {},
|
||||
{Group: "settings.k8s.io", Version: "v1alpha1", Kind: "PodPreset"}: {},
|
||||
{Group: "settings.k8s.io", Version: "v1alpha1", Kind: "PodPresetList"}: {},
|
||||
{Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ExternalAdmissionHookConfiguration"}: {},
|
||||
{Group: "admissionregistration.k8s.io", Version: "v1alpha1", Kind: "ExternalAdmissionHookConfigurationList"}: {},
|
||||
{Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicy"}: {},
|
||||
{Group: "networking.k8s.io", Version: "v1", Kind: "NetworkPolicyList"}: {},
|
||||
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "StorageClass"}: {},
|
||||
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "StorageClassList"}: {},
|
||||
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClass"}: {},
|
||||
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClassList"}: {},
|
||||
}
|
||||
|
||||
f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1))
|
||||
f.Funcs(
|
||||
func(s *runtime.RawExtension, c fuzz.Continue) {},
|
||||
func(s *metav1.LabelSelector, c fuzz.Continue) {
|
||||
c.FuzzNoCustom(s)
|
||||
s.MatchExpressions = nil // need to fuzz this specially
|
||||
},
|
||||
func(s *apiv1.ListOptions, c fuzz.Continue) {
|
||||
c.FuzzNoCustom(s)
|
||||
s.LabelSelector = "" // need to fuzz requirement strings specially
|
||||
s.FieldSelector = "" // need to fuzz requirement strings specially
|
||||
},
|
||||
func(s *extensionsv1beta1.ScaleStatus, c fuzz.Continue) {
|
||||
c.FuzzNoCustom(s)
|
||||
s.TargetSelector = "" // need to fuzz requirement strings specially
|
||||
},
|
||||
)
|
||||
|
||||
scheme := api.Scheme
|
||||
var testTypes orderedGroupVersionKinds
|
||||
for gvk := range scheme.AllKnownTypes() {
|
||||
if gvk.Version == runtime.APIVersionInternal {
|
||||
continue
|
||||
}
|
||||
testTypes = append(testTypes, gvk)
|
||||
}
|
||||
sort.Sort(testTypes)
|
||||
|
||||
for _, gvk := range testTypes {
|
||||
_, expectedChanged := typesWithDefaulting[gvk]
|
||||
iter := 0
|
||||
changedOnce := false
|
||||
for {
|
||||
if iter > *roundtrip.FuzzIters {
|
||||
if !expectedChanged || changedOnce {
|
||||
break
|
||||
}
|
||||
if iter > 300 {
|
||||
t.Errorf("expected %s to trigger defaulting due to fuzzing", gvk)
|
||||
break
|
||||
}
|
||||
// if we expected defaulting, continue looping until the fuzzer gives us one
|
||||
// at worst, we will timeout
|
||||
}
|
||||
iter++
|
||||
|
||||
src, err := scheme.New(gvk)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
f.Fuzz(src)
|
||||
|
||||
src.GetObjectKind().SetGroupVersionKind(schema.GroupVersionKind{})
|
||||
|
||||
original := src.DeepCopyObject()
|
||||
|
||||
// get internal
|
||||
withDefaults := src.DeepCopyObject()
|
||||
scheme.Default(withDefaults.(runtime.Object))
|
||||
|
||||
if !reflect.DeepEqual(original, withDefaults) {
|
||||
changedOnce = true
|
||||
if !expectedChanged {
|
||||
t.Errorf("{Group: \"%s\", Version: \"%s\", Kind: \"%s\"} did not expect defaults to be set - update expected or check defaulter registering: %s", gvk.Group, gvk.Version, gvk.Kind, diff.ObjectReflectDiff(original, withDefaults))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkPodDefaulting(b *testing.B) {
|
||||
f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1))
|
||||
items := make([]apiv1.Pod, 100)
|
||||
for i := range items {
|
||||
f.Fuzz(&items[i])
|
||||
}
|
||||
|
||||
scheme := api.Scheme
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
pod := &items[i%len(items)]
|
||||
|
||||
scheme.Default(pod)
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
2
vendor/k8s.io/kubernetes/pkg/api/helper/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/api/helper/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["helpers_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/helper",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
@ -21,7 +20,6 @@ go_test(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["helpers.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/helper",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
|
|
|
|||
5
vendor/k8s.io/kubernetes/pkg/api/helper/helpers.go
generated
vendored
5
vendor/k8s.io/kubernetes/pkg/api/helper/helpers.go
generated
vendored
|
|
@ -265,11 +265,6 @@ func IsIntegerResourceName(str string) bool {
|
|||
return integerResources.Has(str) || IsExtendedResourceName(api.ResourceName(str))
|
||||
}
|
||||
|
||||
// Extended and HugePages resources
|
||||
func IsScalarResourceName(name api.ResourceName) bool {
|
||||
return IsExtendedResourceName(name) || IsHugePageResourceName(name)
|
||||
}
|
||||
|
||||
// this function aims to check if the service's ClusterIP is set or not
|
||||
// the objective is not to perform validation here
|
||||
func IsServiceIPSet(service *api.Service) bool {
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/api/install/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/api/install/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["install.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/install",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/api/v1:go_default_library",
|
||||
|
|
@ -23,7 +22,6 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["install_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/install",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
|
|||
103
vendor/k8s.io/kubernetes/pkg/api/meta_test.go
generated
vendored
Normal file
103
vendor/k8s.io/kubernetes/pkg/api/meta_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
Copyright 2014 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 api_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
var _ metav1.Object = &metav1.ObjectMeta{}
|
||||
|
||||
func TestAccessorImplementations(t *testing.T) {
|
||||
for _, gv := range api.Registry.EnabledVersions() {
|
||||
internalGV := schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal}
|
||||
for _, gv := range []schema.GroupVersion{gv, internalGV} {
|
||||
for kind, knownType := range api.Scheme.KnownTypes(gv) {
|
||||
value := reflect.New(knownType)
|
||||
obj := value.Interface()
|
||||
if _, ok := obj.(runtime.Object); !ok {
|
||||
t.Errorf("%v (%v) does not implement runtime.Object", gv.WithKind(kind), knownType)
|
||||
}
|
||||
lm, isLM := obj.(meta.ListMetaAccessor)
|
||||
om, isOM := obj.(metav1.ObjectMetaAccessor)
|
||||
switch {
|
||||
case isLM && isOM:
|
||||
t.Errorf("%v (%v) implements ListMetaAccessor and ObjectMetaAccessor", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
case isLM:
|
||||
m := lm.GetListMeta()
|
||||
if m == nil {
|
||||
t.Errorf("%v (%v) returns nil ListMeta", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
m.SetResourceVersion("102030")
|
||||
if m.GetResourceVersion() != "102030" {
|
||||
t.Errorf("%v (%v) did not preserve resource version", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
m.SetSelfLink("102030")
|
||||
if m.GetSelfLink() != "102030" {
|
||||
t.Errorf("%v (%v) did not preserve self link", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
case isOM:
|
||||
m := om.GetObjectMeta()
|
||||
if m == nil {
|
||||
t.Errorf("%v (%v) returns nil ObjectMeta", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
m.SetResourceVersion("102030")
|
||||
if m.GetResourceVersion() != "102030" {
|
||||
t.Errorf("%v (%v) did not preserve resource version", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
m.SetSelfLink("102030")
|
||||
if m.GetSelfLink() != "102030" {
|
||||
t.Errorf("%v (%v) did not preserve self link", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
labels := map[string]string{"a": "b"}
|
||||
m.SetLabels(labels)
|
||||
if !reflect.DeepEqual(m.GetLabels(), labels) {
|
||||
t.Errorf("%v (%v) did not preserve labels", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
default:
|
||||
if _, ok := obj.(metav1.ListMetaAccessor); ok {
|
||||
continue
|
||||
}
|
||||
if _, ok := value.Elem().Type().FieldByName("ObjectMeta"); ok {
|
||||
t.Errorf("%v (%v) has ObjectMeta but does not implement ObjectMetaAccessor", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
if _, ok := value.Elem().Type().FieldByName("ListMeta"); ok {
|
||||
t.Errorf("%v (%v) has ListMeta but does not implement ListMetaAccessor", gv.WithKind(kind), knownType)
|
||||
continue
|
||||
}
|
||||
t.Logf("%v (%v) does not implement ListMetaAccessor or ObjectMetaAccessor", gv.WithKind(kind), knownType)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
49
vendor/k8s.io/kubernetes/pkg/api/node_example.json
generated
vendored
Normal file
49
vendor/k8s.io/kubernetes/pkg/api/node_example.json
generated
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"kind": "Node",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "e2e-test-wojtekt-node-etd6",
|
||||
"selfLink": "/api/v1/nodes/e2e-test-wojtekt-node-etd6",
|
||||
"uid": "a7e89222-e8e5-11e4-8fde-42010af09327",
|
||||
"resourceVersion": "379",
|
||||
"creationTimestamp": "2015-04-22T11:49:39Z"
|
||||
},
|
||||
"spec": {
|
||||
"externalID": "15488322946290398375"
|
||||
},
|
||||
"status": {
|
||||
"capacity": {
|
||||
"cpu": "1",
|
||||
"memory": "1745152Ki"
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"type": "Ready",
|
||||
"status": "True",
|
||||
"lastHeartbeatTime": "2015-04-22T11:58:17Z",
|
||||
"lastTransitionTime": "2015-04-22T11:49:52Z",
|
||||
"reason": "kubelet is posting ready status"
|
||||
}
|
||||
],
|
||||
"addresses": [
|
||||
{
|
||||
"type": "ExternalIP",
|
||||
"address": "104.197.49.213"
|
||||
},
|
||||
{
|
||||
"type": "LegacyHostIP",
|
||||
"address": "104.197.20.11"
|
||||
}
|
||||
],
|
||||
"nodeInfo": {
|
||||
"machineID": "",
|
||||
"systemUUID": "D59FA3FA-7B5B-7287-5E1A-1D79F13CB577",
|
||||
"bootID": "44a832f3-8cfb-4de5-b7d2-d66030b6cd95",
|
||||
"kernelVersion": "3.16.0-0.bpo.4-amd64",
|
||||
"osImage": "Debian GNU/Linux 7 (wheezy)",
|
||||
"containerRuntimeVersion": "docker://1.5.0",
|
||||
"kubeletVersion": "v0.15.0-484-g0c8ee980d705a3-dirty",
|
||||
"kubeProxyVersion": "v0.15.0-484-g0c8ee980d705a3-dirty"
|
||||
}
|
||||
}
|
||||
}
|
||||
83
vendor/k8s.io/kubernetes/pkg/api/replication_controller_example.json
generated
vendored
Normal file
83
vendor/k8s.io/kubernetes/pkg/api/replication_controller_example.json
generated
vendored
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
"kind": "ReplicationController",
|
||||
"apiVersion": "v1",
|
||||
"metadata": {
|
||||
"name": "elasticsearch-logging-controller",
|
||||
"namespace": "default",
|
||||
"selfLink": "/api/v1/namespaces/default/replicationcontrollers/elasticsearch-logging-controller",
|
||||
"uid": "aa76f162-e8e5-11e4-8fde-42010af09327",
|
||||
"resourceVersion": "98",
|
||||
"creationTimestamp": "2015-04-22T11:49:43Z",
|
||||
"labels": {
|
||||
"kubernetes.io/cluster-service": "true",
|
||||
"name": "elasticsearch-logging"
|
||||
}
|
||||
},
|
||||
"spec": {
|
||||
"replicas": 1,
|
||||
"selector": {
|
||||
"name": "elasticsearch-logging"
|
||||
},
|
||||
"template": {
|
||||
"metadata": {
|
||||
"creationTimestamp": null,
|
||||
"labels": {
|
||||
"kubernetes.io/cluster-service": "true",
|
||||
"name": "elasticsearch-logging"
|
||||
}
|
||||
},
|
||||
"spec": {
|
||||
"volumes": [
|
||||
{
|
||||
"name": "es-persistent-storage",
|
||||
"hostPath": null,
|
||||
"emptyDir": {
|
||||
"medium": ""
|
||||
},
|
||||
"gcePersistentDisk": null,
|
||||
"awsElasticBlockStore": null,
|
||||
"gitRepo": null,
|
||||
"secret": null,
|
||||
"nfs": null,
|
||||
"iscsi": null,
|
||||
"glusterfs": null,
|
||||
"quobyte": null
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
{
|
||||
"name": "elasticsearch-logging",
|
||||
"image": "gcr.io/google_containers/elasticsearch:1.0",
|
||||
"ports": [
|
||||
{
|
||||
"name": "db",
|
||||
"containerPort": 9200,
|
||||
"protocol": "TCP"
|
||||
},
|
||||
{
|
||||
"name": "transport",
|
||||
"containerPort": 9300,
|
||||
"protocol": "TCP"
|
||||
}
|
||||
],
|
||||
"resources": {},
|
||||
"volumeMounts": [
|
||||
{
|
||||
"name": "es-persistent-storage",
|
||||
"mountPath": "/data"
|
||||
}
|
||||
],
|
||||
"terminationMessagePath": "/dev/termination-log",
|
||||
"imagePullPolicy": "IfNotPresent",
|
||||
"capabilities": {}
|
||||
}
|
||||
],
|
||||
"restartPolicy": "Always",
|
||||
"dnsPolicy": "ClusterFirst"
|
||||
}
|
||||
}
|
||||
},
|
||||
"status": {
|
||||
"replicas": 1
|
||||
}
|
||||
}
|
||||
217
vendor/k8s.io/kubernetes/pkg/api/serialization_proto_test.go
generated
vendored
Normal file
217
vendor/k8s.io/kubernetes/pkg/api/serialization_proto_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
/*
|
||||
Copyright 2015 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 api_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"k8s.io/api/core/v1"
|
||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/runtime/serializer/protobuf"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
kapitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
_ "k8s.io/kubernetes/pkg/apis/extensions"
|
||||
_ "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
||||
)
|
||||
|
||||
func TestUniversalDeserializer(t *testing.T) {
|
||||
expected := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test"}}
|
||||
d := api.Codecs.UniversalDeserializer()
|
||||
for _, mediaType := range []string{"application/json", "application/yaml", "application/vnd.kubernetes.protobuf"} {
|
||||
info, ok := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), mediaType)
|
||||
if !ok {
|
||||
t.Fatal(mediaType)
|
||||
}
|
||||
buf := &bytes.Buffer{}
|
||||
if err := info.Serializer.Encode(expected, buf); err != nil {
|
||||
t.Fatalf("%s: %v", mediaType, err)
|
||||
}
|
||||
obj, _, err := d.Decode(buf.Bytes(), &schema.GroupVersionKind{Kind: "Pod", Version: "v1"}, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("%s: %v", mediaType, err)
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(expected, obj) {
|
||||
t.Fatalf("%s: %#v", mediaType, obj)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllFieldsHaveTags(t *testing.T) {
|
||||
for gvk, obj := range api.Scheme.AllKnownTypes() {
|
||||
if gvk.Version == runtime.APIVersionInternal {
|
||||
// internal versions are not serialized to protobuf
|
||||
continue
|
||||
}
|
||||
if gvk.Group == "componentconfig" {
|
||||
// component config is not serialized to protobuf
|
||||
continue
|
||||
}
|
||||
if err := fieldsHaveProtobufTags(obj); err != nil {
|
||||
t.Errorf("type %s as gvk %v is missing tags: %v", obj, gvk, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fieldsHaveProtobufTags(obj reflect.Type) error {
|
||||
switch obj.Kind() {
|
||||
case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Array:
|
||||
return fieldsHaveProtobufTags(obj.Elem())
|
||||
case reflect.Struct:
|
||||
for i := 0; i < obj.NumField(); i++ {
|
||||
f := obj.Field(i)
|
||||
if f.Name == "TypeMeta" && f.Type.Name() == "TypeMeta" {
|
||||
// TypeMeta is not included in external protobuf because we use an envelope type with TypeMeta
|
||||
continue
|
||||
}
|
||||
if len(f.Tag.Get("json")) > 0 && len(f.Tag.Get("protobuf")) == 0 {
|
||||
return fmt.Errorf("field %s in %s has a 'json' tag but no protobuf tag", f.Name, obj)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func TestProtobufRoundTrip(t *testing.T) {
|
||||
obj := &v1.Pod{}
|
||||
fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(benchmarkSeed), api.Codecs).Fuzz(obj)
|
||||
// InitContainers are turned into annotations by conversion.
|
||||
obj.Spec.InitContainers = nil
|
||||
obj.Status.InitContainerStatuses = nil
|
||||
data, err := obj.Marshal()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
out := &v1.Pod{}
|
||||
if err := out.Unmarshal(data); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !apiequality.Semantic.Equalities.DeepEqual(out, obj) {
|
||||
t.Logf("marshal\n%s", hex.Dump(data))
|
||||
t.Fatalf("Unmarshal is unequal\n%s", diff.ObjectGoPrintDiff(out, obj))
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkEncodeCodec measures the cost of performing a codec encode, which includes
|
||||
// reflection (to clear APIVersion and Kind)
|
||||
func BenchmarkEncodeCodecProtobuf(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
s := protobuf.NewSerializer(nil, nil, "application/arbitrary.content.type")
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Encode(s, &items[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkEncodeCodecFromInternalProtobuf measures the cost of performing a codec encode,
|
||||
// including conversions and any type setting. This is a "full" encode.
|
||||
func BenchmarkEncodeCodecFromInternalProtobuf(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encodable := make([]api.Pod, width)
|
||||
for i := range items {
|
||||
if err := api.Scheme.Convert(&items[i], &encodable[i], nil); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
s := protobuf.NewSerializer(nil, nil, "application/arbitrary.content.type")
|
||||
codec := api.Codecs.EncoderForVersion(s, v1.SchemeGroupVersion)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Encode(codec, &encodable[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkEncodeProtobufGeneratedMarshal(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := items[i%width].Marshal(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkDecodeCodecToInternalProtobuf measures the cost of performing a codec decode,
|
||||
// including conversions and any type setting. This is a "full" decode.
|
||||
func BenchmarkDecodeCodecToInternalProtobuf(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
s := protobuf.NewSerializer(api.Scheme, api.Scheme, "application/arbitrary.content.type")
|
||||
encoder := api.Codecs.EncoderForVersion(s, v1.SchemeGroupVersion)
|
||||
var encoded [][]byte
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(encoder, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded = append(encoded, data)
|
||||
}
|
||||
|
||||
decoder := api.Codecs.DecoderToVersion(s, api.SchemeGroupVersion)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Decode(decoder, encoded[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance
|
||||
func BenchmarkDecodeIntoProtobuf(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := (&items[i]).Marshal()
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
validate := &v1.Pod{}
|
||||
if err := proto.Unmarshal(data, validate); err != nil {
|
||||
b.Fatalf("Failed to unmarshal %d: %v\n%#v", i, err, items[i])
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
obj := v1.Pod{}
|
||||
if err := proto.Unmarshal(encoded[i%width], &obj); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
561
vendor/k8s.io/kubernetes/pkg/api/serialization_test.go
generated
vendored
Normal file
561
vendor/k8s.io/kubernetes/pkg/api/serialization_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,561 @@
|
|||
/*
|
||||
Copyright 2014 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 api_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
jsoniter "github.com/json-iterator/go"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/api/extensions/v1beta1"
|
||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||
"k8s.io/apimachinery/pkg/api/meta"
|
||||
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||
"k8s.io/apimachinery/pkg/api/testing/roundtrip"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/conversion"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apimachinery/pkg/runtime/serializer/streaming"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apimachinery/pkg/watch"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
kapitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
k8s_v1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
||||
)
|
||||
|
||||
// fuzzInternalObject fuzzes an arbitrary runtime object using the appropriate
|
||||
// fuzzer registered with the apitesting package.
|
||||
func fuzzInternalObject(t *testing.T, forVersion schema.GroupVersion, item runtime.Object, seed int64) runtime.Object {
|
||||
fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(seed), api.Codecs).Fuzz(item)
|
||||
|
||||
j, err := meta.TypeAccessor(item)
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error %v for %#v", err, item)
|
||||
}
|
||||
j.SetKind("")
|
||||
j.SetAPIVersion("")
|
||||
|
||||
return item
|
||||
}
|
||||
|
||||
// dataAsString returns the given byte array as a string; handles detecting
|
||||
// protocol buffers.
|
||||
func dataAsString(data []byte) string {
|
||||
dataString := string(data)
|
||||
if !strings.HasPrefix(dataString, "{") {
|
||||
dataString = "\n" + hex.Dump(data)
|
||||
proto.NewBuffer(make([]byte, 0, 1024)).DebugPrint("decoded object", data)
|
||||
}
|
||||
return dataString
|
||||
}
|
||||
|
||||
func Convert_v1beta1_ReplicaSet_to_api_ReplicationController(in *v1beta1.ReplicaSet, out *api.ReplicationController, s conversion.Scope) error {
|
||||
intermediate1 := &extensions.ReplicaSet{}
|
||||
if err := k8s_v1beta1.Convert_v1beta1_ReplicaSet_To_extensions_ReplicaSet(in, intermediate1, s); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
intermediate2 := &v1.ReplicationController{}
|
||||
if err := k8s_api_v1.Convert_extensions_ReplicaSet_to_v1_ReplicationController(intermediate1, intermediate2, s); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return k8s_api_v1.Convert_v1_ReplicationController_To_api_ReplicationController(intermediate2, out, s)
|
||||
}
|
||||
|
||||
func TestSetControllerConversion(t *testing.T) {
|
||||
if err := api.Scheme.AddConversionFuncs(Convert_v1beta1_ReplicaSet_to_api_ReplicationController); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
rs := &extensions.ReplicaSet{}
|
||||
rc := &api.ReplicationController{}
|
||||
|
||||
extGroup := testapi.Extensions
|
||||
defaultGroup := testapi.Default
|
||||
|
||||
fuzzInternalObject(t, extGroup.InternalGroupVersion(), rs, rand.Int63())
|
||||
|
||||
t.Logf("rs._internal.extensions -> rs.v1beta1.extensions")
|
||||
data, err := runtime.Encode(extGroup.Codec(), rs)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected encoding error: %v", err)
|
||||
}
|
||||
|
||||
decoder := api.Codecs.DecoderToVersion(
|
||||
api.Codecs.UniversalDeserializer(),
|
||||
runtime.NewMultiGroupVersioner(
|
||||
*defaultGroup.GroupVersion(),
|
||||
schema.GroupKind{Group: defaultGroup.GroupVersion().Group},
|
||||
schema.GroupKind{Group: extGroup.GroupVersion().Group},
|
||||
),
|
||||
)
|
||||
|
||||
t.Logf("rs.v1beta1.extensions -> rc._internal")
|
||||
if err := runtime.DecodeInto(decoder, data, rc); err != nil {
|
||||
t.Fatalf("unexpected decoding error: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("rc._internal -> rc.v1")
|
||||
data, err = runtime.Encode(defaultGroup.Codec(), rc)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected encoding error: %v", err)
|
||||
}
|
||||
|
||||
t.Logf("rc.v1 -> rs._internal.extensions")
|
||||
if err := runtime.DecodeInto(decoder, data, rs); err != nil {
|
||||
t.Fatalf("unexpected decoding error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// TestSpecificKind round-trips a single specific kind and is intended to help
|
||||
// debug issues that arise while adding a new API type.
|
||||
func TestSpecificKind(t *testing.T) {
|
||||
// Uncomment the following line to enable logging of which conversions
|
||||
// api.Scheme.Log(t)
|
||||
internalGVK := schema.GroupVersionKind{Group: "extensions", Version: runtime.APIVersionInternal, Kind: "DaemonSet"}
|
||||
|
||||
seed := rand.Int63()
|
||||
fuzzer := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(seed), api.Codecs)
|
||||
|
||||
roundtrip.RoundTripSpecificKind(t, internalGVK, api.Scheme, api.Codecs, fuzzer, nil)
|
||||
}
|
||||
|
||||
var nonRoundTrippableTypes = sets.NewString(
|
||||
"ExportOptions",
|
||||
"GetOptions",
|
||||
// WatchEvent does not include kind and version and can only be deserialized
|
||||
// implicitly (if the caller expects the specific object). The watch call defines
|
||||
// the schema by content type, rather than via kind/version included in each
|
||||
// object.
|
||||
"WatchEvent",
|
||||
// ListOptions is now part of the meta group
|
||||
"ListOptions",
|
||||
// Delete options is only read in metav1
|
||||
"DeleteOptions",
|
||||
)
|
||||
|
||||
var commonKinds = []string{"Status", "ListOptions", "DeleteOptions", "ExportOptions"}
|
||||
|
||||
// TestCommonKindsRegistered verifies that all group/versions registered with
|
||||
// the testapi package have the common kinds.
|
||||
func TestCommonKindsRegistered(t *testing.T) {
|
||||
for _, kind := range commonKinds {
|
||||
for _, group := range testapi.Groups {
|
||||
gv := group.GroupVersion()
|
||||
gvk := gv.WithKind(kind)
|
||||
obj, err := api.Scheme.New(gvk)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
defaults := gv.WithKind("")
|
||||
var got *schema.GroupVersionKind
|
||||
if obj, got, err = api.Codecs.LegacyCodec().Decode([]byte(`{"kind":"`+kind+`"}`), &defaults, obj); err != nil || gvk != *got {
|
||||
t.Errorf("expected %v: %v %v", gvk, got, err)
|
||||
}
|
||||
data, err := runtime.Encode(api.Codecs.LegacyCodec(*gv), obj)
|
||||
if err != nil {
|
||||
t.Errorf("expected %v: %v\n%s", gvk, err, string(data))
|
||||
continue
|
||||
}
|
||||
if !bytes.Contains(data, []byte(`"kind":"`+kind+`","apiVersion":"`+gv.String()+`"`)) {
|
||||
if kind != "Status" {
|
||||
t.Errorf("expected %v: %v\n%s", gvk, err, string(data))
|
||||
continue
|
||||
}
|
||||
// TODO: this is wrong, but legacy clients expect it
|
||||
if !bytes.Contains(data, []byte(`"kind":"`+kind+`","apiVersion":"v1"`)) {
|
||||
t.Errorf("expected %v: %v\n%s", gvk, err, string(data))
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestRoundTripTypes applies the round-trip test to all round-trippable Kinds
|
||||
// in all of the API groups registered for test in the testapi package.
|
||||
func TestRoundTripTypes(t *testing.T) {
|
||||
seed := rand.Int63()
|
||||
fuzzer := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(seed), api.Codecs)
|
||||
|
||||
nonRoundTrippableTypes := map[schema.GroupVersionKind]bool{
|
||||
{Group: "componentconfig", Version: runtime.APIVersionInternal, Kind: "KubeProxyConfiguration"}: true,
|
||||
{Group: "componentconfig", Version: runtime.APIVersionInternal, Kind: "KubeSchedulerConfiguration"}: true,
|
||||
}
|
||||
|
||||
roundtrip.RoundTripTypes(t, api.Scheme, api.Codecs, fuzzer, nonRoundTrippableTypes)
|
||||
}
|
||||
|
||||
// TestEncodePtr tests that a pointer to a golang type can be encoded and
|
||||
// decoded without information loss or mutation.
|
||||
func TestEncodePtr(t *testing.T) {
|
||||
grace := int64(30)
|
||||
pod := &api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Labels: map[string]string{"name": "foo"},
|
||||
},
|
||||
Spec: api.PodSpec{
|
||||
RestartPolicy: api.RestartPolicyAlways,
|
||||
DNSPolicy: api.DNSClusterFirst,
|
||||
|
||||
TerminationGracePeriodSeconds: &grace,
|
||||
|
||||
SecurityContext: &api.PodSecurityContext{},
|
||||
SchedulerName: api.DefaultSchedulerName,
|
||||
},
|
||||
}
|
||||
obj := runtime.Object(pod)
|
||||
data, err := runtime.Encode(testapi.Default.Codec(), obj)
|
||||
obj2, err2 := runtime.Decode(testapi.Default.Codec(), data)
|
||||
if err != nil || err2 != nil {
|
||||
t.Fatalf("Failure: '%v' '%v'", err, err2)
|
||||
}
|
||||
if _, ok := obj2.(*api.Pod); !ok {
|
||||
t.Fatalf("Got wrong type")
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(obj2, pod) {
|
||||
t.Errorf("\nExpected:\n\n %#v,\n\nGot:\n\n %#vDiff: %v\n\n", pod, obj2, diff.ObjectDiff(obj2, pod))
|
||||
}
|
||||
}
|
||||
|
||||
// TestBadJSONRejection establishes that a JSON object without a kind or with
|
||||
// an unknown kind will not be decoded without error.
|
||||
func TestBadJSONRejection(t *testing.T) {
|
||||
badJSONMissingKind := []byte(`{ }`)
|
||||
if _, err := runtime.Decode(testapi.Default.Codec(), badJSONMissingKind); err == nil {
|
||||
t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind)
|
||||
}
|
||||
badJSONUnknownType := []byte(`{"kind": "bar"}`)
|
||||
if _, err1 := runtime.Decode(testapi.Default.Codec(), badJSONUnknownType); err1 == nil {
|
||||
t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType)
|
||||
}
|
||||
/*badJSONKindMismatch := []byte(`{"kind": "Pod"}`)
|
||||
if err2 := DecodeInto(badJSONKindMismatch, &Node{}); err2 == nil {
|
||||
t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch)
|
||||
}*/
|
||||
}
|
||||
|
||||
// TestUnversionedTypes establishes that the default codec can encode and
|
||||
// decode unversioned objects.
|
||||
func TestUnversionedTypes(t *testing.T) {
|
||||
testcases := []runtime.Object{
|
||||
&metav1.Status{Status: "Failure", Message: "something went wrong"},
|
||||
&metav1.APIVersions{Versions: []string{"A", "B", "C"}},
|
||||
&metav1.APIGroupList{Groups: []metav1.APIGroup{{Name: "mygroup"}}},
|
||||
&metav1.APIGroup{Name: "mygroup"},
|
||||
&metav1.APIResourceList{GroupVersion: "mygroup/myversion"},
|
||||
}
|
||||
|
||||
for _, obj := range testcases {
|
||||
// Make sure the unversioned codec can encode
|
||||
unversionedJSON, err := runtime.Encode(testapi.Default.Codec(), obj)
|
||||
if err != nil {
|
||||
t.Errorf("%v: unexpected error: %v", obj, err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Make sure the versioned codec under test can decode
|
||||
versionDecodedObject, err := runtime.Decode(testapi.Default.Codec(), unversionedJSON)
|
||||
if err != nil {
|
||||
t.Errorf("%v: unexpected error: %v", obj, err)
|
||||
continue
|
||||
}
|
||||
// Make sure it decodes correctly
|
||||
if !reflect.DeepEqual(obj, versionDecodedObject) {
|
||||
t.Errorf("%v: expected %#v, got %#v", obj, obj, versionDecodedObject)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestObjectWatchFraming establishes that a watch event can be encoded and
|
||||
// decoded correctly through each of the supported RFC2046 media types.
|
||||
func TestObjectWatchFraming(t *testing.T) {
|
||||
f := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(benchmarkSeed), api.Codecs)
|
||||
secret := &api.Secret{}
|
||||
f.Fuzz(secret)
|
||||
secret.Data["binary"] = []byte{0x00, 0x10, 0x30, 0x55, 0xff, 0x00}
|
||||
secret.Data["utf8"] = []byte("a string with \u0345 characters")
|
||||
secret.Data["long"] = bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x00}, 1000)
|
||||
converted, _ := api.Scheme.ConvertToVersion(secret, v1.SchemeGroupVersion)
|
||||
v1secret := converted.(*v1.Secret)
|
||||
for _, info := range api.Codecs.SupportedMediaTypes() {
|
||||
if info.StreamSerializer == nil {
|
||||
continue
|
||||
}
|
||||
s := info.StreamSerializer
|
||||
framer := s.Framer
|
||||
embedded := info.Serializer
|
||||
if embedded == nil {
|
||||
t.Errorf("no embedded serializer for %s", info.MediaType)
|
||||
continue
|
||||
}
|
||||
innerDecode := api.Codecs.DecoderToVersion(embedded, api.SchemeGroupVersion)
|
||||
|
||||
// write a single object through the framer and back out
|
||||
obj := &bytes.Buffer{}
|
||||
if err := s.Encode(v1secret, obj); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
out := &bytes.Buffer{}
|
||||
w := framer.NewFrameWriter(out)
|
||||
if n, err := w.Write(obj.Bytes()); err != nil || n != len(obj.Bytes()) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sr := streaming.NewDecoder(framer.NewFrameReader(ioutil.NopCloser(out)), s)
|
||||
resultSecret := &v1.Secret{}
|
||||
res, _, err := sr.Decode(nil, resultSecret)
|
||||
if err != nil {
|
||||
t.Fatalf("%v:\n%s", err, hex.Dump(obj.Bytes()))
|
||||
}
|
||||
resultSecret.Kind = "Secret"
|
||||
resultSecret.APIVersion = "v1"
|
||||
if !apiequality.Semantic.DeepEqual(v1secret, res) {
|
||||
t.Fatalf("objects did not match: %s", diff.ObjectGoPrintDiff(v1secret, res))
|
||||
}
|
||||
|
||||
// write a watch event through the frame writer and read it back in
|
||||
// via the frame reader for this media type
|
||||
obj = &bytes.Buffer{}
|
||||
if err := embedded.Encode(v1secret, obj); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
event := &metav1.WatchEvent{Type: string(watch.Added)}
|
||||
event.Object.Raw = obj.Bytes()
|
||||
obj = &bytes.Buffer{}
|
||||
if err := s.Encode(event, obj); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
out = &bytes.Buffer{}
|
||||
w = framer.NewFrameWriter(out)
|
||||
if n, err := w.Write(obj.Bytes()); err != nil || n != len(obj.Bytes()) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sr = streaming.NewDecoder(framer.NewFrameReader(ioutil.NopCloser(out)), s)
|
||||
outEvent := &metav1.WatchEvent{}
|
||||
res, _, err = sr.Decode(nil, outEvent)
|
||||
if err != nil || outEvent.Type != string(watch.Added) {
|
||||
t.Fatalf("%v: %#v", err, outEvent)
|
||||
}
|
||||
if outEvent.Object.Object == nil && outEvent.Object.Raw != nil {
|
||||
outEvent.Object.Object, err = runtime.Decode(innerDecode, outEvent.Object.Raw)
|
||||
if err != nil {
|
||||
t.Fatalf("%v:\n%s", err, hex.Dump(outEvent.Object.Raw))
|
||||
}
|
||||
}
|
||||
|
||||
if !apiequality.Semantic.DeepEqual(secret, outEvent.Object.Object) {
|
||||
t.Fatalf("%s: did not match after frame decoding: %s", info.MediaType, diff.ObjectGoPrintDiff(secret, outEvent.Object.Object))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const benchmarkSeed = 100
|
||||
|
||||
func benchmarkItems(b *testing.B) []v1.Pod {
|
||||
apiObjectFuzzer := fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(benchmarkSeed), api.Codecs)
|
||||
items := make([]v1.Pod, 10)
|
||||
for i := range items {
|
||||
var pod api.Pod
|
||||
apiObjectFuzzer.Fuzz(&pod)
|
||||
pod.Spec.InitContainers, pod.Status.InitContainerStatuses = nil, nil
|
||||
out, err := api.Scheme.ConvertToVersion(&pod, v1.SchemeGroupVersion)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
items[i] = *out.(*v1.Pod)
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
// BenchmarkEncodeCodec measures the cost of performing a codec encode, which includes
|
||||
// reflection (to clear APIVersion and Kind)
|
||||
func BenchmarkEncodeCodec(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Encode(testapi.Default.Codec(), &items[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkEncodeCodecFromInternal measures the cost of performing a codec encode,
|
||||
// including conversions.
|
||||
func BenchmarkEncodeCodecFromInternal(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encodable := make([]api.Pod, width)
|
||||
for i := range items {
|
||||
if err := api.Scheme.Convert(&items[i], &encodable[i], nil); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Encode(testapi.Default.Codec(), &encodable[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkEncodeJSONMarshal provides a baseline for regular JSON encode performance
|
||||
func BenchmarkEncodeJSONMarshal(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := json.Marshal(&items[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkDecodeCodec(b *testing.B) {
|
||||
codec := testapi.Default.Codec()
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(codec, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
if _, err := runtime.Decode(codec, encoded[i%width]); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkDecodeIntoExternalCodec(b *testing.B) {
|
||||
codec := testapi.Default.Codec()
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(codec, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
obj := v1.Pod{}
|
||||
if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkDecodeIntoInternalCodec(b *testing.B) {
|
||||
codec := testapi.Default.Codec()
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(codec, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
obj := api.Pod{}
|
||||
if err := runtime.DecodeInto(codec, encoded[i%width], &obj); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance
|
||||
func BenchmarkDecodeIntoJSON(b *testing.B) {
|
||||
codec := testapi.Default.Codec()
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(codec, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
obj := v1.Pod{}
|
||||
if err := json.Unmarshal(encoded[i%width], &obj); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
// BenchmarkDecodeJSON provides a baseline for JSON decode performance
|
||||
func BenchmarkDecodeIntoJSONCodecGen(b *testing.B) {
|
||||
kcodec := testapi.Default.Codec()
|
||||
items := benchmarkItems(b)
|
||||
width := len(items)
|
||||
encoded := make([][]byte, width)
|
||||
for i := range items {
|
||||
data, err := runtime.Encode(kcodec, &items[i])
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
encoded[i] = data
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
obj := v1.Pod{}
|
||||
if err := jsoniter.ConfigFastest.Unmarshal(encoded[i%width], &obj); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
2
vendor/k8s.io/kubernetes/pkg/api/service/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/api/service/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["util.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/service",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/util/net/sets:go_default_library",
|
||||
|
|
@ -19,7 +18,6 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["util_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/service",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
|
|||
8
vendor/k8s.io/kubernetes/pkg/api/types.go
generated
vendored
8
vendor/k8s.io/kubernetes/pkg/api/types.go
generated
vendored
|
|
@ -1238,7 +1238,7 @@ type AzureDiskVolumeSource struct {
|
|||
// the ReadOnly setting in VolumeMounts.
|
||||
// +optional
|
||||
ReadOnly *bool
|
||||
// Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared
|
||||
// Expected values Shared: mulitple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared
|
||||
Kind *AzureDataDiskKind
|
||||
}
|
||||
|
||||
|
|
@ -2229,7 +2229,7 @@ type Taint struct {
|
|||
// TimeAdded represents the time at which the taint was added.
|
||||
// It is only written for NoExecute taints.
|
||||
// +optional
|
||||
TimeAdded *metav1.Time
|
||||
TimeAdded metav1.Time
|
||||
}
|
||||
|
||||
type TaintEffect string
|
||||
|
|
@ -3117,7 +3117,7 @@ type NodeConfigSource struct {
|
|||
type DaemonEndpoint struct {
|
||||
/*
|
||||
The port tag was not properly in quotes in earlier releases, so it must be
|
||||
uppercase for backwards compatibility (since it was falling back to var name of
|
||||
uppercased for backwards compat (since it was falling back to var name of
|
||||
'Port').
|
||||
*/
|
||||
|
||||
|
|
@ -4043,7 +4043,7 @@ const (
|
|||
// BasicAuthPasswordKey is the key of the password or token for SecretTypeBasicAuth secrets
|
||||
BasicAuthPasswordKey = "password"
|
||||
|
||||
// SecretTypeSSHAuth contains data needed for SSH authentication.
|
||||
// SecretTypeSSHAuth contains data needed for SSH authetication.
|
||||
//
|
||||
// Required field:
|
||||
// - Secret.Data["ssh-privatekey"] - private SSH key needed for authentication
|
||||
|
|
|
|||
174
vendor/k8s.io/kubernetes/pkg/api/unstructured_test.go
generated
vendored
Normal file
174
vendor/k8s.io/kubernetes/pkg/api/unstructured_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
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 api_test
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/google/gofuzz"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
|
||||
"k8s.io/apimachinery/pkg/conversion/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/apimachinery/pkg/util/json"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
kapitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
)
|
||||
|
||||
func doRoundTrip(t *testing.T, group testapi.TestGroup, kind string) {
|
||||
// We do fuzzing on the internal version of the object, and only then
|
||||
// convert to the external version. This is because custom fuzzing
|
||||
// function are only supported for internal objects.
|
||||
internalObj, err := api.Scheme.New(group.InternalGroupVersion().WithKind(kind))
|
||||
if err != nil {
|
||||
t.Fatalf("Couldn't create internal object %v: %v", kind, err)
|
||||
}
|
||||
seed := rand.Int63()
|
||||
fuzzer.FuzzerFor(kapitesting.FuzzerFuncs, rand.NewSource(seed), api.Codecs).
|
||||
// We are explicitly overwriting custom fuzzing functions, to ensure
|
||||
// that InitContainers and their statuses are not generated. This is
|
||||
// because in thise test we are simply doing json operations, in which
|
||||
// those disappear.
|
||||
Funcs(
|
||||
func(s *api.PodSpec, c fuzz.Continue) {
|
||||
c.FuzzNoCustom(s)
|
||||
s.InitContainers = nil
|
||||
},
|
||||
func(s *api.PodStatus, c fuzz.Continue) {
|
||||
c.FuzzNoCustom(s)
|
||||
s.InitContainerStatuses = nil
|
||||
},
|
||||
).Fuzz(internalObj)
|
||||
|
||||
item, err := api.Scheme.New(group.GroupVersion().WithKind(kind))
|
||||
if err != nil {
|
||||
t.Fatalf("Couldn't create external object %v: %v", kind, err)
|
||||
}
|
||||
if err := api.Scheme.Convert(internalObj, item, nil); err != nil {
|
||||
t.Fatalf("Conversion for %v failed: %v", kind, err)
|
||||
}
|
||||
|
||||
data, err := json.Marshal(item)
|
||||
if err != nil {
|
||||
t.Errorf("Error when marshaling object: %v", err)
|
||||
return
|
||||
}
|
||||
unstr := make(map[string]interface{})
|
||||
err = json.Unmarshal(data, &unstr)
|
||||
if err != nil {
|
||||
t.Errorf("Error when unmarshaling to unstructured: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
data, err = json.Marshal(unstr)
|
||||
if err != nil {
|
||||
t.Errorf("Error when marshaling unstructured: %v", err)
|
||||
return
|
||||
}
|
||||
unmarshalledObj := reflect.New(reflect.TypeOf(item).Elem()).Interface()
|
||||
err = json.Unmarshal(data, &unmarshalledObj)
|
||||
if err != nil {
|
||||
t.Errorf("Error when unmarshaling to object: %v", err)
|
||||
return
|
||||
}
|
||||
if !apiequality.Semantic.DeepEqual(item, unmarshalledObj) {
|
||||
t.Errorf("Object changed during JSON operations, diff: %v", diff.ObjectReflectDiff(item, unmarshalledObj))
|
||||
return
|
||||
}
|
||||
|
||||
newUnstr, err := unstructured.DefaultConverter.ToUnstructured(item)
|
||||
if err != nil {
|
||||
t.Errorf("ToUnstructured failed: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
newObj := reflect.New(reflect.TypeOf(item).Elem()).Interface().(runtime.Object)
|
||||
err = unstructured.DefaultConverter.FromUnstructured(newUnstr, newObj)
|
||||
if err != nil {
|
||||
t.Errorf("FromUnstructured failed: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if !apiequality.Semantic.DeepEqual(item, newObj) {
|
||||
t.Errorf("Object changed, diff: %v", diff.ObjectReflectDiff(item, newObj))
|
||||
}
|
||||
}
|
||||
|
||||
func TestRoundTrip(t *testing.T) {
|
||||
for groupKey, group := range testapi.Groups {
|
||||
for kind := range group.ExternalTypes() {
|
||||
if nonRoundTrippableTypes.Has(kind) {
|
||||
continue
|
||||
}
|
||||
t.Logf("Testing: %v in %v", kind, groupKey)
|
||||
for i := 0; i < 50; i++ {
|
||||
doRoundTrip(t, group, kind)
|
||||
if t.Failed() {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkToFromUnstructured(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
size := len(items)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
unstr, err := unstructured.DefaultConverter.ToUnstructured(&items[i%size])
|
||||
if err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
obj := v1.Pod{}
|
||||
if err := unstructured.DefaultConverter.FromUnstructured(unstr, &obj); err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkToFromUnstructuredViaJSON(b *testing.B) {
|
||||
items := benchmarkItems(b)
|
||||
size := len(items)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
data, err := json.Marshal(&items[i%size])
|
||||
if err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
unstr := map[string]interface{}{}
|
||||
if err := json.Unmarshal(data, &unstr); err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
data, err = json.Marshal(unstr)
|
||||
if err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
obj := v1.Pod{}
|
||||
if err := json.Unmarshal(data, &obj); err != nil {
|
||||
b.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
31
vendor/k8s.io/kubernetes/pkg/api/util/BUILD
generated
vendored
Normal file
31
vendor/k8s.io/kubernetes/pkg/api/util/BUILD
generated
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_library",
|
||||
"go_test",
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["group_version.go"],
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["group_version_test.go"],
|
||||
library = ":go_default_library",
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
3
vendor/k8s.io/kubernetes/pkg/api/util/OWNERS
generated
vendored
Executable file
3
vendor/k8s.io/kubernetes/pkg/api/util/OWNERS
generated
vendored
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
reviewers:
|
||||
- caesarxuchao
|
||||
- david-mcmahon
|
||||
48
vendor/k8s.io/kubernetes/pkg/api/util/group_version.go
generated
vendored
Normal file
48
vendor/k8s.io/kubernetes/pkg/api/util/group_version.go
generated
vendored
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
Copyright 2015 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.
|
||||
*/
|
||||
|
||||
// TODO: This GetVersion/GetGroup arrangement is temporary and will be replaced
|
||||
// with a GroupAndVersion type.
|
||||
package util
|
||||
|
||||
import "strings"
|
||||
|
||||
func GetVersion(groupVersion string) string {
|
||||
s := strings.Split(groupVersion, "/")
|
||||
if len(s) != 2 {
|
||||
// e.g. return "v1" for groupVersion="v1"
|
||||
return s[len(s)-1]
|
||||
}
|
||||
return s[1]
|
||||
}
|
||||
|
||||
func GetGroup(groupVersion string) string {
|
||||
s := strings.Split(groupVersion, "/")
|
||||
if len(s) == 1 {
|
||||
// e.g. return "" for groupVersion="v1"
|
||||
return ""
|
||||
}
|
||||
return s[0]
|
||||
}
|
||||
|
||||
// GetGroupVersion returns the "group/version". It returns "version" is if group
|
||||
// is empty. It returns "group/" if version is empty.
|
||||
func GetGroupVersion(group, version string) string {
|
||||
if len(group) == 0 {
|
||||
return version
|
||||
}
|
||||
return group + "/" + version
|
||||
}
|
||||
93
vendor/k8s.io/kubernetes/pkg/api/util/group_version_test.go
generated
vendored
Normal file
93
vendor/k8s.io/kubernetes/pkg/api/util/group_version_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
Copyright 2014 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 util
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGetVersion(t *testing.T) {
|
||||
testCases := []struct {
|
||||
groupVersion string
|
||||
output string
|
||||
}{
|
||||
{
|
||||
"v1",
|
||||
"v1",
|
||||
},
|
||||
{
|
||||
"extensions/v1beta1",
|
||||
"v1beta1",
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
actual := GetVersion(test.groupVersion)
|
||||
if test.output != actual {
|
||||
t.Errorf("expect version: %s, got: %s\n", test.output, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetGroup(t *testing.T) {
|
||||
testCases := []struct {
|
||||
groupVersion string
|
||||
output string
|
||||
}{
|
||||
{
|
||||
"v1",
|
||||
"",
|
||||
},
|
||||
{
|
||||
"extensions/v1beta1",
|
||||
"extensions",
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
actual := GetGroup(test.groupVersion)
|
||||
if test.output != actual {
|
||||
t.Errorf("expect version: %s, got: %s\n", test.output, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetGroupVersion(t *testing.T) {
|
||||
testCases := []struct {
|
||||
group string
|
||||
version string
|
||||
output string
|
||||
}{
|
||||
{
|
||||
"",
|
||||
"v1",
|
||||
"v1",
|
||||
},
|
||||
{
|
||||
"extensions",
|
||||
"",
|
||||
"extensions/",
|
||||
},
|
||||
{
|
||||
"extensions",
|
||||
"v1beta1",
|
||||
"extensions/v1beta1",
|
||||
},
|
||||
}
|
||||
for _, test := range testCases {
|
||||
actual := GetGroupVersion(test.group, test.version)
|
||||
if test.output != actual {
|
||||
t.Errorf("expect version: %s, got: %s\n", test.output, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
10
vendor/k8s.io/kubernetes/pkg/api/v1/BUILD
generated
vendored
10
vendor/k8s.io/kubernetes/pkg/api/v1/BUILD
generated
vendored
|
|
@ -12,11 +12,11 @@ go_library(
|
|||
"conversion.go",
|
||||
"defaults.go",
|
||||
"doc.go",
|
||||
"generate.go",
|
||||
"register.go",
|
||||
"zz_generated.conversion.go",
|
||||
"zz_generated.defaults.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/apis/extensions:go_default_library",
|
||||
|
|
@ -30,6 +30,7 @@ go_library(
|
|||
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||
],
|
||||
)
|
||||
|
|
@ -37,14 +38,16 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_xtest",
|
||||
srcs = [
|
||||
"backward_compatibility_test.go",
|
||||
"conversion_test.go",
|
||||
"defaults_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1_test",
|
||||
deps = [
|
||||
":go_default_library",
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/api/testapi:go_default_library",
|
||||
"//pkg/api/install:go_default_library",
|
||||
"//pkg/api/testing/compat:go_default_library",
|
||||
"//pkg/api/validation:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
|
|
@ -52,6 +55,7 @@ go_test(
|
|||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
|
|
|
|||
169
vendor/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go
generated
vendored
Normal file
169
vendor/k8s.io/kubernetes/pkg/api/v1/backward_compatibility_test.go
generated
vendored
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
Copyright 2015 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 v1_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testing/compat"
|
||||
"k8s.io/kubernetes/pkg/api/validation"
|
||||
|
||||
_ "k8s.io/kubernetes/pkg/api/install"
|
||||
)
|
||||
|
||||
func TestCompatibility_v1_PodSecurityContext(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
input string
|
||||
expectedKeys map[string]string
|
||||
absentKeys []string
|
||||
}{
|
||||
{
|
||||
name: "hostNetwork = true",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostNetwork": true,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
expectedKeys: map[string]string{
|
||||
"spec.hostNetwork": "true",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "hostNetwork = false",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostNetwork": false,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
absentKeys: []string{
|
||||
"spec.hostNetwork",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "hostIPC = true",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostIPC": true,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
expectedKeys: map[string]string{
|
||||
"spec.hostIPC": "true",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "hostIPC = false",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostIPC": false,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
absentKeys: []string{
|
||||
"spec.hostIPC",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "hostPID = true",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostPID": true,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
expectedKeys: map[string]string{
|
||||
"spec.hostPID": "true",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "hostPID = false",
|
||||
input: `
|
||||
{
|
||||
"kind":"Pod",
|
||||
"apiVersion":"v1",
|
||||
"metadata":{"name":"my-pod-name", "namespace":"my-pod-namespace"},
|
||||
"spec": {
|
||||
"hostPID": false,
|
||||
"containers":[{
|
||||
"name":"a",
|
||||
"image":"my-container-image"
|
||||
}]
|
||||
}
|
||||
}
|
||||
`,
|
||||
absentKeys: []string{
|
||||
"spec.hostPID",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
validator := func(obj runtime.Object) field.ErrorList {
|
||||
return validation.ValidatePodSpec(&(obj.(*api.Pod).Spec), field.NewPath("spec"))
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
t.Logf("Testing 1.0.0 backward compatibility for %v", tc.name)
|
||||
compat.TestCompatibility(t, v1.SchemeGroupVersion, []byte(tc.input), validator, tc.expectedKeys, tc.absentKeys)
|
||||
}
|
||||
}
|
||||
3
vendor/k8s.io/kubernetes/pkg/api/v1/conversion_test.go
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/api/v1/conversion_test.go
generated
vendored
|
|
@ -30,9 +30,6 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/diff"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1"
|
||||
|
||||
// enforce that all types are installed
|
||||
_ "k8s.io/kubernetes/pkg/api/testapi"
|
||||
)
|
||||
|
||||
func TestPodLogOptions(t *testing.T) {
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/api/v1/defaults_test.go
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/api/v1/defaults_test.go
generated
vendored
|
|
@ -28,9 +28,6 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/intstr"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1"
|
||||
|
||||
// enforce that all types are installed
|
||||
_ "k8s.io/kubernetes/pkg/api/testapi"
|
||||
)
|
||||
|
||||
func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
|
||||
|
|
|
|||
65
vendor/k8s.io/kubernetes/pkg/api/v1/generate.go
generated
vendored
Normal file
65
vendor/k8s.io/kubernetes/pkg/api/v1/generate.go
generated
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
Copyright 2014 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 v1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"k8s.io/api/core/v1"
|
||||
|
||||
utilrand "k8s.io/apimachinery/pkg/util/rand"
|
||||
)
|
||||
|
||||
// NameGenerator generates names for objects. Some backends may have more information
|
||||
// available to guide selection of new names and this interface hides those details.
|
||||
type NameGenerator interface {
|
||||
// GenerateName generates a valid name from the base name, adding a random suffix to the
|
||||
// the base. If base is valid, the returned name must also be valid. The generator is
|
||||
// responsible for knowing the maximum valid name length.
|
||||
GenerateName(base string) string
|
||||
}
|
||||
|
||||
// GenerateName will resolve the object name of the provided v1.ObjectMeta to a generated version if
|
||||
// necessary. It expects that validation for v1.ObjectMeta has already completed (that Base is a
|
||||
// valid name) and that the NameGenerator generates a name that is also valid.
|
||||
func GenerateName(u NameGenerator, meta *v1.ObjectMeta) {
|
||||
if len(meta.GenerateName) == 0 || len(meta.Name) != 0 {
|
||||
return
|
||||
}
|
||||
meta.Name = u.GenerateName(meta.GenerateName)
|
||||
}
|
||||
|
||||
// simpleNameGenerator generates random names.
|
||||
type simpleNameGenerator struct{}
|
||||
|
||||
// SimpleNameGenerator is a generator that returns the name plus a random suffix of five alphanumerics
|
||||
// when a name is requested. The string is guaranteed to not exceed the length of a standard Kubernetes
|
||||
// name (63 characters)
|
||||
var SimpleNameGenerator NameGenerator = simpleNameGenerator{}
|
||||
|
||||
const (
|
||||
// TODO: make this flexible for non-core resources with alternate naming rules.
|
||||
maxNameLength = 63
|
||||
randomLength = 5
|
||||
maxGeneratedNameLength = maxNameLength - randomLength
|
||||
)
|
||||
|
||||
func (simpleNameGenerator) GenerateName(base string) string {
|
||||
if len(base) > maxGeneratedNameLength {
|
||||
base = base[:maxGeneratedNameLength]
|
||||
}
|
||||
return fmt.Sprintf("%s%s", base, utilrand.String(randomLength))
|
||||
}
|
||||
2
vendor/k8s.io/kubernetes/pkg/api/v1/helper/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/api/v1/helper/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["helpers_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1/helper",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
@ -22,7 +21,6 @@ go_test(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["helpers.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1/helper",
|
||||
deps = [
|
||||
"//pkg/api/helper:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
|
|||
8
vendor/k8s.io/kubernetes/pkg/api/v1/helper/helpers.go
generated
vendored
8
vendor/k8s.io/kubernetes/pkg/api/v1/helper/helpers.go
generated
vendored
|
|
@ -88,18 +88,12 @@ func OpaqueIntResourceName(name string) v1.ResourceName {
|
|||
var overcommitBlacklist = sets.NewString(string(v1.ResourceNvidiaGPU))
|
||||
|
||||
// IsOvercommitAllowed returns true if the resource is in the default
|
||||
// namespace and not blacklisted and is not hugepages.
|
||||
// namespace and not blacklisted.
|
||||
func IsOvercommitAllowed(name v1.ResourceName) bool {
|
||||
return IsDefaultNamespaceResource(name) &&
|
||||
!IsHugePageResourceName(name) &&
|
||||
!overcommitBlacklist.Has(string(name))
|
||||
}
|
||||
|
||||
// Extended and Hugepages resources
|
||||
func IsScalarResourceName(name v1.ResourceName) bool {
|
||||
return IsExtendedResourceName(name) || IsHugePageResourceName(name)
|
||||
}
|
||||
|
||||
// this function aims to check if the service's ClusterIP is set or not
|
||||
// the objective is not to perform validation here
|
||||
func IsServiceIPSet(service *v1.Service) bool {
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["util.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1/pod",
|
||||
deps = [
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
|
|
@ -20,7 +19,6 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["util_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/v1/pod",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
|
|||
4
vendor/k8s.io/kubernetes/pkg/api/v1/zz_generated.conversion.go
generated
vendored
4
vendor/k8s.io/kubernetes/pkg/api/v1/zz_generated.conversion.go
generated
vendored
|
|
@ -5101,7 +5101,7 @@ func autoConvert_v1_Taint_To_api_Taint(in *v1.Taint, out *api.Taint, s conversio
|
|||
out.Key = in.Key
|
||||
out.Value = in.Value
|
||||
out.Effect = api.TaintEffect(in.Effect)
|
||||
out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded))
|
||||
out.TimeAdded = in.TimeAdded
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
@ -5114,7 +5114,7 @@ func autoConvert_api_Taint_To_v1_Taint(in *api.Taint, out *v1.Taint, s conversio
|
|||
out.Key = in.Key
|
||||
out.Value = in.Value
|
||||
out.Effect = v1.TaintEffect(in.Effect)
|
||||
out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded))
|
||||
out.TimeAdded = in.TimeAdded
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/api/validation/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/api/validation/BUILD
generated
vendored
|
|
@ -11,12 +11,12 @@ go_library(
|
|||
"events.go",
|
||||
"validation.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/validation",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/api/helper:go_default_library",
|
||||
"//pkg/api/service:go_default_library",
|
||||
"//pkg/api/util:go_default_library",
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/api/v1/helper:go_default_library",
|
||||
"//pkg/capabilities:go_default_library",
|
||||
|
|
@ -47,7 +47,6 @@ go_test(
|
|||
"events_test.go",
|
||||
"validation_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/api/validation",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
|
|||
11
vendor/k8s.io/kubernetes/pkg/api/validation/events.go
generated
vendored
11
vendor/k8s.io/kubernetes/pkg/api/validation/events.go
generated
vendored
|
|
@ -25,6 +25,7 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/validation"
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
apiutil "k8s.io/kubernetes/pkg/api/util"
|
||||
)
|
||||
|
||||
// ValidateEvent makes sure that the event makes sense.
|
||||
|
|
@ -62,16 +63,12 @@ func ValidateEvent(event *api.Event) field.ErrorList {
|
|||
|
||||
// Check whether the kind in groupVersion is scoped at the root of the api hierarchy
|
||||
func isNamespacedKind(kind, groupVersion string) (bool, error) {
|
||||
gv, err := schema.ParseGroupVersion(groupVersion)
|
||||
group := apiutil.GetGroup(groupVersion)
|
||||
g, err := api.Registry.Group(group)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
g, err := api.Registry.Group(gv.Group)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
restMapping, err := g.RESTMapper.RESTMapping(schema.GroupKind{Group: gv.Group, Kind: kind}, gv.Version)
|
||||
restMapping, err := g.RESTMapper.RESTMapping(schema.GroupKind{Group: group, Kind: kind}, apiutil.GetVersion(groupVersion))
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
|
|
|||
22
vendor/k8s.io/kubernetes/pkg/api/validation/validation.go
generated
vendored
22
vendor/k8s.io/kubernetes/pkg/api/validation/validation.go
generated
vendored
|
|
@ -1923,7 +1923,11 @@ func ValidateVolumeMounts(mounts []api.VolumeMount, volumes sets.String, contain
|
|||
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be unique"))
|
||||
}
|
||||
if !path.IsAbs(mnt.MountPath) {
|
||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be an absolute path"))
|
||||
// also allow windows absolute path
|
||||
p := mnt.MountPath
|
||||
if len(p) < 2 || ((p[0] < 'A' || p[0] > 'Z') && (p[0] < 'a' || p[0] > 'z')) || p[1] != ':' {
|
||||
allErrs = append(allErrs, field.Invalid(idxPath.Child("mountPath"), mnt.MountPath, "must be an absolute path"))
|
||||
}
|
||||
}
|
||||
mountpoints.Insert(mnt.MountPath)
|
||||
if len(mnt.SubPath) > 0 {
|
||||
|
|
@ -3148,22 +3152,6 @@ func ValidateService(service *api.Service) field.ErrorList {
|
|||
ports[key] = true
|
||||
}
|
||||
|
||||
// Check for duplicate TargetPort
|
||||
portsPath = specPath.Child("ports")
|
||||
targetPorts := make(map[api.ServicePort]bool)
|
||||
for i, port := range service.Spec.Ports {
|
||||
if (port.TargetPort.Type == intstr.Int && port.TargetPort.IntVal == 0) || (port.TargetPort.Type == intstr.String && port.TargetPort.StrVal == "") {
|
||||
continue
|
||||
}
|
||||
portPath := portsPath.Index(i)
|
||||
key := api.ServicePort{Protocol: port.Protocol, TargetPort: port.TargetPort}
|
||||
_, found := targetPorts[key]
|
||||
if found {
|
||||
allErrs = append(allErrs, field.Duplicate(portPath.Child("targetPort"), port.TargetPort))
|
||||
}
|
||||
targetPorts[key] = true
|
||||
}
|
||||
|
||||
// Validate SourceRange field and annotation
|
||||
_, ok := service.Annotations[api.AnnotationLoadBalancerSourceRangesKey]
|
||||
if len(service.Spec.LoadBalancerSourceRanges) > 0 || ok {
|
||||
|
|
|
|||
50
vendor/k8s.io/kubernetes/pkg/api/validation/validation_test.go
generated
vendored
50
vendor/k8s.io/kubernetes/pkg/api/validation/validation_test.go
generated
vendored
|
|
@ -3059,12 +3059,12 @@ func TestValidatePorts(t *testing.T) {
|
|||
"invalid protocol case": {
|
||||
[]api.ContainerPort{{ContainerPort: 80, Protocol: "tcp"}},
|
||||
field.ErrorTypeNotSupported,
|
||||
"protocol", `supported values: "TCP", "UDP"`,
|
||||
"protocol", "supported values: TCP, UDP",
|
||||
},
|
||||
"invalid protocol": {
|
||||
[]api.ContainerPort{{ContainerPort: 80, Protocol: "ICMP"}},
|
||||
field.ErrorTypeNotSupported,
|
||||
"protocol", `supported values: "TCP", "UDP"`,
|
||||
"protocol", "supported values: TCP, UDP",
|
||||
},
|
||||
"protocol required": {
|
||||
[]api.ContainerPort{{Name: "abc", ContainerPort: 80}},
|
||||
|
|
@ -3426,7 +3426,7 @@ func TestValidateEnv(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP"`,
|
||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: metadata.name, metadata.namespace, metadata.uid, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||
},
|
||||
{
|
||||
name: "invalid fieldPath annotations",
|
||||
|
|
@ -3439,7 +3439,7 @@ func TestValidateEnv(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.annotations": supported values: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP"`,
|
||||
expectedError: `[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.annotations": supported values: metadata.name, metadata.namespace, metadata.uid, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||
},
|
||||
{
|
||||
name: "unsupported fieldPath",
|
||||
|
|
@ -3452,7 +3452,7 @@ func TestValidateEnv(t *testing.T) {
|
|||
},
|
||||
},
|
||||
}},
|
||||
expectedError: `valueFrom.fieldRef.fieldPath: Unsupported value: "status.phase": supported values: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP"`,
|
||||
expectedError: `valueFrom.fieldRef.fieldPath: Unsupported value: "status.phase": supported values: metadata.name, metadata.namespace, metadata.uid, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP`,
|
||||
},
|
||||
}
|
||||
for _, tc := range errorCases {
|
||||
|
|
@ -5036,7 +5036,7 @@ func TestValidatePod(t *testing.T) {
|
|||
Name: "pod-forgiveness-invalid",
|
||||
Namespace: "ns",
|
||||
},
|
||||
Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.kubernetes.io/not-ready", Operator: "Exists", Effect: "NoExecute", TolerationSeconds: &[]int64{-2}[0]}}),
|
||||
Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.alpha.kubernetes.io/notReady", Operator: "Exists", Effect: "NoExecute", TolerationSeconds: &[]int64{-2}[0]}}),
|
||||
},
|
||||
{ // docker default seccomp profile
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
|
|
@ -5594,7 +5594,7 @@ func TestValidatePod(t *testing.T) {
|
|||
Name: "pod-forgiveness-invalid",
|
||||
Namespace: "ns",
|
||||
},
|
||||
Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.kubernetes.io/not-ready", Operator: "Exists", Effect: "NoSchedule", TolerationSeconds: &[]int64{20}[0]}}),
|
||||
Spec: extendPodSpecwithTolerations(validPodSpec(nil), []api.Toleration{{Key: "node.alpha.kubernetes.io/notReady", Operator: "Exists", Effect: "NoSchedule", TolerationSeconds: &[]int64{20}[0]}}),
|
||||
},
|
||||
},
|
||||
"must be a valid pod seccomp profile": {
|
||||
|
|
@ -7050,42 +7050,6 @@ func TestValidateService(t *testing.T) {
|
|||
},
|
||||
numErrs: 0,
|
||||
},
|
||||
{
|
||||
name: "invalid duplicate targetports (number with same protocol)",
|
||||
tweakSvc: func(s *api.Service) {
|
||||
s.Spec.Type = api.ServiceTypeClusterIP
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromInt(8080)})
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "TCP", TargetPort: intstr.FromInt(8080)})
|
||||
},
|
||||
numErrs: 1,
|
||||
},
|
||||
{
|
||||
name: "invalid duplicate targetports (name with same protocol)",
|
||||
tweakSvc: func(s *api.Service) {
|
||||
s.Spec.Type = api.ServiceTypeClusterIP
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromString("http")})
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "TCP", TargetPort: intstr.FromString("http")})
|
||||
},
|
||||
numErrs: 1,
|
||||
},
|
||||
{
|
||||
name: "valid duplicate targetports (number with different protocols)",
|
||||
tweakSvc: func(s *api.Service) {
|
||||
s.Spec.Type = api.ServiceTypeClusterIP
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromInt(8080)})
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "UDP", TargetPort: intstr.FromInt(8080)})
|
||||
},
|
||||
numErrs: 0,
|
||||
},
|
||||
{
|
||||
name: "valid duplicate targetports (name with different protocols)",
|
||||
tweakSvc: func(s *api.Service) {
|
||||
s.Spec.Type = api.ServiceTypeClusterIP
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "q", Port: 1, Protocol: "TCP", TargetPort: intstr.FromString("http")})
|
||||
s.Spec.Ports = append(s.Spec.Ports, api.ServicePort{Name: "r", Port: 2, Protocol: "UDP", TargetPort: intstr.FromString("http")})
|
||||
},
|
||||
numErrs: 0,
|
||||
},
|
||||
{
|
||||
name: "valid type - cluster",
|
||||
tweakSvc: func(s *api.Service) {
|
||||
|
|
|
|||
10
vendor/k8s.io/kubernetes/pkg/api/zz_generated.deepcopy.go
generated
vendored
10
vendor/k8s.io/kubernetes/pkg/api/zz_generated.deepcopy.go
generated
vendored
|
|
@ -5903,15 +5903,7 @@ func (in *TCPSocketAction) DeepCopy() *TCPSocketAction {
|
|||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Taint) DeepCopyInto(out *Taint) {
|
||||
*out = *in
|
||||
if in.TimeAdded != nil {
|
||||
in, out := &in.TimeAdded, &out.TimeAdded
|
||||
if *in == nil {
|
||||
*out = nil
|
||||
} else {
|
||||
*out = new(v1.Time)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
in.TimeAdded.DeepCopyInto(&out.TimeAdded)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["helpers_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/apis/extensions",
|
||||
library = ":go_default_library",
|
||||
)
|
||||
|
||||
|
|
@ -22,7 +21,6 @@ go_library(
|
|||
"types.go",
|
||||
"zz_generated.deepcopy.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/apis/extensions",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/apis/networking:go_default_library",
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go
generated
vendored
|
|
@ -759,7 +759,7 @@ type IngressBackend struct {
|
|||
// +genclient:method=UpdateScale,verb=update,subresource=scale,input=Scale,result=Scale
|
||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||
|
||||
// ReplicaSet ensures that a specified number of pod replicas are running at any given time.
|
||||
// ReplicaSet represents the configuration of a replica set.
|
||||
type ReplicaSet struct {
|
||||
metav1.TypeMeta
|
||||
// +optional
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD
generated
vendored
|
|
@ -13,7 +13,6 @@ go_library(
|
|||
"types.go",
|
||||
"zz_generated.deepcopy.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/apis/networking",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/apis/networking/OWNERS
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/apis/networking/OWNERS
generated
vendored
|
|
@ -1,5 +1,4 @@
|
|||
reviewers:
|
||||
- caseydavenport
|
||||
- cmluciano
|
||||
- danwinship
|
||||
- thockin
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/capabilities/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/capabilities/BUILD
generated
vendored
|
|
@ -12,14 +12,13 @@ go_library(
|
|||
"capabilities.go",
|
||||
"doc.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/capabilities",
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["capabilities_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/capabilities",
|
||||
library = ":go_default_library",
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD
generated
vendored
|
|
@ -12,7 +12,6 @@ go_library(
|
|||
"doc.go",
|
||||
"plugins.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/cloudprovider",
|
||||
deps = [
|
||||
"//pkg/controller:go_default_library",
|
||||
"//vendor/github.com/golang/glog:go_default_library",
|
||||
|
|
|
|||
4
vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS
generated
vendored
4
vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS
generated
vendored
|
|
@ -1,7 +1,5 @@
|
|||
approvers:
|
||||
- mikedanese
|
||||
- dims
|
||||
- wlan0
|
||||
reviewers:
|
||||
- thockin
|
||||
- lavalamp
|
||||
|
|
@ -36,8 +34,8 @@ reviewers:
|
|||
- jszczepkowski
|
||||
- markturansky
|
||||
- girishkalele
|
||||
- satnam6502
|
||||
- jdef
|
||||
- freehan
|
||||
- jingxu97
|
||||
- wlan0
|
||||
- cheftako
|
||||
|
|
|
|||
4
vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md
generated
vendored
4
vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md
generated
vendored
|
|
@ -4,7 +4,7 @@
|
|||
The mechanism for supporting cloud providers is currently in transition: the original method of implementing cloud provider-specific functionality within the main kubernetes tree (here) is no longer advised; however, the proposed solution is still in development.
|
||||
|
||||
#### Guidance for potential cloud providers:
|
||||
* Support for cloud providers is currently in a state of flux. Background information on motivation and the proposal for improving is in the github [proposal](https://git.k8s.io/community/contributors/design-proposals/cloud-provider/cloud-provider-refactoring.md).
|
||||
* Support for cloud providers is currently in a state of flux. Background information on motivation and the proposal for improving is in the github [proposal](https://git.k8s.io/community/contributors/design-proposals/cloud-provider-refactoring.md).
|
||||
* In support of this plan, a new cloud-controller-manager binary was added in 1.6. This was the first of several steps (see the proposal for more information).
|
||||
* Attempts to contribute new cloud providers or (to a lesser extent) persistent volumes to the core repo will likely meet with some pushback from reviewers/approvers.
|
||||
* It is understood that this is an unfortunate situation in which 'the old way is no longer supported but the new way is not ready yet', but the initial path is unsustainable, and contributors are encouraged to participate in the implementation of the proposed long-term solution, as there is risk that PRs for new cloud providers here will not be approved.
|
||||
|
|
@ -13,4 +13,4 @@ The mechanism for supporting cloud providers is currently in transition: the or
|
|||
#### Some additional context on status / direction:
|
||||
* 1.6 added a new cloud-controller-manager binary that may be used for testing the new out-of-core cloudprovider flow.
|
||||
* Setting cloud-provider=external allows for creation of a separate controller-manager binary
|
||||
* 1.7 adds [extensible admission control](https://git.k8s.io/community/contributors/design-proposals/api-machinery/admission_control_extension.md), further enabling topology customization.
|
||||
* 1.7 adds [extensible admission control](https://git.k8s.io/community/contributors/design-proposals/admission_control_extension.md), further enabling topology customization.
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go
generated
vendored
|
|
@ -176,7 +176,6 @@ type Routes interface {
|
|||
var (
|
||||
InstanceNotFound = errors.New("instance not found")
|
||||
DiskNotFound = errors.New("disk is not found")
|
||||
NotImplemented = errors.New("unimplemented")
|
||||
)
|
||||
|
||||
// Zone represents the location of a particular machine.
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/controller/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/controller/BUILD
generated
vendored
|
|
@ -12,7 +12,6 @@ go_test(
|
|||
"controller_ref_manager_test.go",
|
||||
"controller_utils_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/controller",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
@ -20,7 +19,6 @@ go_test(
|
|||
"//pkg/api/testapi:go_default_library",
|
||||
"//pkg/controller/testutil:go_default_library",
|
||||
"//pkg/securitycontext:go_default_library",
|
||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||
|
|
@ -50,7 +48,6 @@ go_library(
|
|||
"doc.go",
|
||||
"lookup_cache.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/controller",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/api/install:go_default_library",
|
||||
|
|
|
|||
149
vendor/k8s.io/kubernetes/pkg/controller/controller_utils_test.go
generated
vendored
149
vendor/k8s.io/kubernetes/pkg/controller/controller_utils_test.go
generated
vendored
|
|
@ -22,6 +22,7 @@ import (
|
|||
"math"
|
||||
"math/rand"
|
||||
"net/http/httptest"
|
||||
"reflect"
|
||||
"sort"
|
||||
"sync"
|
||||
"testing"
|
||||
|
|
@ -46,8 +47,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
"k8s.io/kubernetes/pkg/controller/testutil"
|
||||
"k8s.io/kubernetes/pkg/securitycontext"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
// NewFakeControllerExpectationsLookup creates a fake store for PodExpectations.
|
||||
|
|
@ -172,8 +171,9 @@ func TestControllerExpectations(t *testing.T) {
|
|||
|
||||
// RC fires off adds and deletes at apiserver, then sets expectations
|
||||
rcKey, err := KeyFunc(rc)
|
||||
assert.NoError(t, err, "Couldn't get key for object %#v: %v", rc, err)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Couldn't get key for object %#v: %v", rc, err)
|
||||
}
|
||||
e.SetExpectations(rcKey, adds, dels)
|
||||
var wg sync.WaitGroup
|
||||
for i := 0; i < adds+1; i++ {
|
||||
|
|
@ -188,8 +188,9 @@ func TestControllerExpectations(t *testing.T) {
|
|||
wg.Wait()
|
||||
|
||||
// There are still delete expectations
|
||||
assert.False(t, e.SatisfiedExpectations(rcKey), "Rc will sync before expectations are met")
|
||||
|
||||
if e.SatisfiedExpectations(rcKey) {
|
||||
t.Errorf("Rc will sync before expectations are met")
|
||||
}
|
||||
for i := 0; i < dels+1; i++ {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
|
|
@ -200,29 +201,34 @@ func TestControllerExpectations(t *testing.T) {
|
|||
wg.Wait()
|
||||
|
||||
// Expectations have been surpassed
|
||||
podExp, exists, err := e.GetExpectations(rcKey)
|
||||
assert.NoError(t, err, "Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
assert.True(t, exists, "Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
|
||||
add, del := podExp.GetExpectations()
|
||||
assert.Equal(t, int64(-1), add, "Unexpected pod expectations %#v", podExp)
|
||||
assert.Equal(t, int64(-1), del, "Unexpected pod expectations %#v", podExp)
|
||||
assert.True(t, e.SatisfiedExpectations(rcKey), "Expectations are met but the rc will not sync")
|
||||
if podExp, exists, err := e.GetExpectations(rcKey); err == nil && exists {
|
||||
add, del := podExp.GetExpectations()
|
||||
if add != -1 || del != -1 {
|
||||
t.Errorf("Unexpected pod expectations %#v", podExp)
|
||||
}
|
||||
} else {
|
||||
t.Errorf("Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
}
|
||||
if !e.SatisfiedExpectations(rcKey) {
|
||||
t.Errorf("Expectations are met but the rc will not sync")
|
||||
}
|
||||
|
||||
// Next round of rc sync, old expectations are cleared
|
||||
e.SetExpectations(rcKey, 1, 2)
|
||||
podExp, exists, err = e.GetExpectations(rcKey)
|
||||
assert.NoError(t, err, "Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
assert.True(t, exists, "Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
add, del = podExp.GetExpectations()
|
||||
|
||||
assert.Equal(t, int64(1), add, "Unexpected pod expectations %#v", podExp)
|
||||
assert.Equal(t, int64(2), del, "Unexpected pod expectations %#v", podExp)
|
||||
if podExp, exists, err := e.GetExpectations(rcKey); err == nil && exists {
|
||||
add, del := podExp.GetExpectations()
|
||||
if add != 1 || del != 2 {
|
||||
t.Errorf("Unexpected pod expectations %#v", podExp)
|
||||
}
|
||||
} else {
|
||||
t.Errorf("Could not get expectations for rc, exists %v and err %v", exists, err)
|
||||
}
|
||||
|
||||
// Expectations have expired because of ttl
|
||||
fakeClock.Step(ttl + 1)
|
||||
assert.True(t, e.SatisfiedExpectations(rcKey),
|
||||
"Expectations should have expired but didn't")
|
||||
if !e.SatisfiedExpectations(rcKey) {
|
||||
t.Errorf("Expectations should have expired but didn't")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIDExpectations(t *testing.T) {
|
||||
|
|
@ -260,20 +266,19 @@ func TestUIDExpectations(t *testing.T) {
|
|||
rcKeys[i], rcKeys[j] = rcKeys[j], rcKeys[i]
|
||||
}
|
||||
for _, rcKey := range rcKeys {
|
||||
assert.False(t, uidExp.SatisfiedExpectations(rcKey),
|
||||
"Controller %v satisfied expectations before deletion", rcKey)
|
||||
|
||||
if uidExp.SatisfiedExpectations(rcKey) {
|
||||
t.Errorf("Controller %v satisfied expectations before deletion", rcKey)
|
||||
}
|
||||
for _, p := range rcToPods[rcKey] {
|
||||
uidExp.DeletionObserved(rcKey, p)
|
||||
}
|
||||
|
||||
assert.True(t, uidExp.SatisfiedExpectations(rcKey),
|
||||
"Controller %v didn't satisfy expectations after deletion", rcKey)
|
||||
|
||||
if !uidExp.SatisfiedExpectations(rcKey) {
|
||||
t.Errorf("Controller %v didn't satisfy expectations after deletion", rcKey)
|
||||
}
|
||||
uidExp.DeleteExpectations(rcKey)
|
||||
|
||||
assert.Nil(t, uidExp.GetUIDs(rcKey),
|
||||
"Failed to delete uid expectations for %v", rcKey)
|
||||
if uidExp.GetUIDs(rcKey) != nil {
|
||||
t.Errorf("Failed to delete uid expectations for %v", rcKey)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -296,8 +301,9 @@ func TestCreatePods(t *testing.T) {
|
|||
controllerSpec := newReplicationController(1)
|
||||
|
||||
// Make sure createReplica sends a POST to the apiserver with a pod from the controllers pod template
|
||||
err := podControl.CreatePods(ns, controllerSpec.Spec.Template, controllerSpec)
|
||||
assert.NoError(t, err, "unexpected error: %v", err)
|
||||
if err := podControl.CreatePods(ns, controllerSpec.Spec.Template, controllerSpec); err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
expectedPod := v1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
|
|
@ -308,10 +314,14 @@ func TestCreatePods(t *testing.T) {
|
|||
}
|
||||
fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath("pods", metav1.NamespaceDefault, ""), "POST", nil)
|
||||
var actualPod = &v1.Pod{}
|
||||
err = json.Unmarshal([]byte(fakeHandler.RequestBody), actualPod)
|
||||
assert.NoError(t, err, "unexpected error: %v", err)
|
||||
assert.True(t, apiequality.Semantic.DeepDerivative(&expectedPod, actualPod),
|
||||
"Body: %s", fakeHandler.RequestBody)
|
||||
err := json.Unmarshal([]byte(fakeHandler.RequestBody), actualPod)
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error: %v", err)
|
||||
}
|
||||
if !apiequality.Semantic.DeepDerivative(&expectedPod, actualPod) {
|
||||
t.Logf("Body: %s", fakeHandler.RequestBody)
|
||||
t.Errorf("Unexpected mismatch. Expected\n %#v,\n Got:\n %#v", &expectedPod, actualPod)
|
||||
}
|
||||
}
|
||||
|
||||
func TestActivePodFiltering(t *testing.T) {
|
||||
|
|
@ -334,11 +344,9 @@ func TestActivePodFiltering(t *testing.T) {
|
|||
for _, pod := range got {
|
||||
gotNames.Insert(pod.Name)
|
||||
}
|
||||
|
||||
assert.Equal(t, 0, expectedNames.Difference(gotNames).Len(),
|
||||
"expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
assert.Equal(t, 0, gotNames.Difference(expectedNames).Len(),
|
||||
"expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
if expectedNames.Difference(gotNames).Len() != 0 || gotNames.Difference(expectedNames).Len() != 0 {
|
||||
t.Errorf("expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
}
|
||||
}
|
||||
|
||||
func TestSortingActivePods(t *testing.T) {
|
||||
|
|
@ -412,7 +420,9 @@ func TestSortingActivePods(t *testing.T) {
|
|||
sort.Sort(ActivePods(randomizedPods))
|
||||
actual := getOrder(randomizedPods)
|
||||
|
||||
assert.EqualValues(t, expected, actual, "expected %v, got %v", expected, actual)
|
||||
if !reflect.DeepEqual(actual, expected) {
|
||||
t.Errorf("expected %v, got %v", expected, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -433,10 +443,9 @@ func TestActiveReplicaSetsFiltering(t *testing.T) {
|
|||
gotNames.Insert(rs.Name)
|
||||
}
|
||||
|
||||
assert.Equal(t, 0, expectedNames.Difference(gotNames).Len(),
|
||||
"expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
assert.Equal(t, 0, gotNames.Difference(expectedNames).Len(),
|
||||
"expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
if expectedNames.Difference(gotNames).Len() != 0 || gotNames.Difference(expectedNames).Len() != 0 {
|
||||
t.Errorf("expected %v, got %v", expectedNames.List(), gotNames.List())
|
||||
}
|
||||
}
|
||||
|
||||
func int64P(num int64) *int64 {
|
||||
|
|
@ -471,7 +480,9 @@ func TestComputeHash(t *testing.T) {
|
|||
hash := ComputeHash(test.template, test.collisionCount)
|
||||
otherHash := ComputeHash(test.template, test.otherCollisionCount)
|
||||
|
||||
assert.NotEqual(t, hash, otherHash, "expected different hashes but got the same: %d", hash)
|
||||
if hash == otherHash {
|
||||
t.Errorf("expected different hashes but got the same: %d", hash)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -635,17 +646,20 @@ func TestRemoveTaintOffNode(t *testing.T) {
|
|||
}
|
||||
for _, test := range tests {
|
||||
node, _ := test.nodeHandler.Get(test.nodeName, metav1.GetOptions{})
|
||||
err := RemoveTaintOffNode(test.nodeHandler, test.nodeName, node, test.taintsToRemove...)
|
||||
assert.NoError(t, err, "%s: RemoveTaintOffNode() error = %v", test.name, err)
|
||||
if err := RemoveTaintOffNode(test.nodeHandler, test.nodeName, node, test.taintsToRemove...); err != nil {
|
||||
t.Errorf("%s: RemoveTaintOffNode() error = %v", test.name, err)
|
||||
}
|
||||
|
||||
node, _ = test.nodeHandler.Get(test.nodeName, metav1.GetOptions{})
|
||||
assert.EqualValues(t, test.expectedTaints, node.Spec.Taints,
|
||||
"%s: failed to remove taint off node: expected %+v, got %+v",
|
||||
test.name, test.expectedTaints, node.Spec.Taints)
|
||||
if !reflect.DeepEqual(node.Spec.Taints, test.expectedTaints) {
|
||||
t.Errorf("%s: failed to remove taint off node: expected %+v, got %+v",
|
||||
test.name, test.expectedTaints, node.Spec.Taints)
|
||||
}
|
||||
|
||||
assert.Equal(t, test.requestCount, test.nodeHandler.RequestCount,
|
||||
"%s: unexpected request count: expected %+v, got %+v",
|
||||
test.name, test.requestCount, test.nodeHandler.RequestCount)
|
||||
if test.nodeHandler.RequestCount != test.requestCount {
|
||||
t.Errorf("%s: unexpected request count: expected %+v, got %+v",
|
||||
test.name, test.requestCount, test.nodeHandler.RequestCount)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -810,16 +824,19 @@ func TestAddOrUpdateTaintOnNode(t *testing.T) {
|
|||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
err := AddOrUpdateTaintOnNode(test.nodeHandler, test.nodeName, test.taintsToAdd...)
|
||||
assert.NoError(t, err, "%s: AddOrUpdateTaintOnNode() error = %v", test.name, err)
|
||||
if err := AddOrUpdateTaintOnNode(test.nodeHandler, test.nodeName, test.taintsToAdd...); err != nil {
|
||||
t.Errorf("%s: AddOrUpdateTaintOnNode() error = %v", test.name, err)
|
||||
}
|
||||
|
||||
node, _ := test.nodeHandler.Get(test.nodeName, metav1.GetOptions{})
|
||||
assert.EqualValues(t, test.expectedTaints, node.Spec.Taints,
|
||||
"%s: failed to add taint to node: expected %+v, got %+v",
|
||||
test.name, test.expectedTaints, node.Spec.Taints)
|
||||
if !reflect.DeepEqual(node.Spec.Taints, test.expectedTaints) {
|
||||
t.Errorf("%s: failed to add taint to node: expected %+v, got %+v",
|
||||
test.name, test.expectedTaints, node.Spec.Taints)
|
||||
}
|
||||
|
||||
assert.Equal(t, test.requestCount, test.nodeHandler.RequestCount,
|
||||
"%s: unexpected request count: expected %+v, got %+v",
|
||||
test.name, test.requestCount, test.nodeHandler.RequestCount)
|
||||
if test.nodeHandler.RequestCount != test.requestCount {
|
||||
t.Errorf("%s: unexpected request count: expected %+v, got %+v",
|
||||
test.name, test.requestCount, test.nodeHandler.RequestCount)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/features/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/features/BUILD
generated
vendored
|
|
@ -8,7 +8,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["kube_features.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/features",
|
||||
deps = [
|
||||
"//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library",
|
||||
"//vendor/k8s.io/apiserver/pkg/features:go_default_library",
|
||||
|
|
|
|||
9
vendor/k8s.io/kubernetes/pkg/features/kube_features.go
generated
vendored
9
vendor/k8s.io/kubernetes/pkg/features/kube_features.go
generated
vendored
|
|
@ -163,6 +163,12 @@ const (
|
|||
//
|
||||
// Enable pods to consume pre-allocated huge pages of varying page sizes
|
||||
HugePages utilfeature.Feature = "HugePages"
|
||||
|
||||
// owner @brendandburns
|
||||
// alpha: v1.8
|
||||
//
|
||||
// Enable nodes to exclude themselves from service load balancers
|
||||
ServiceNodeExclusion utilfeature.Feature = "ServiceNodeExclusion"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
|
@ -194,6 +200,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS
|
|||
MountPropagation: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
ExpandPersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
CPUManager: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
ServiceNodeExclusion: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
|
||||
// inherited features from generic apiserver, relisted here to get a conflict if it is changed
|
||||
// unintentionally on either side:
|
||||
|
|
@ -201,7 +208,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS
|
|||
genericfeatures.AdvancedAuditing: {Default: true, PreRelease: utilfeature.Beta},
|
||||
genericfeatures.APIResponseCompression: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
genericfeatures.Initializers: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
genericfeatures.APIListChunking: {Default: true, PreRelease: utilfeature.Beta},
|
||||
genericfeatures.APIListChunking: {Default: false, PreRelease: utilfeature.Alpha},
|
||||
|
||||
// inherited features from apiextensions-apiserver, relisted here to get a conflict if it is changed
|
||||
// unintentionally on either side:
|
||||
|
|
|
|||
7
vendor/k8s.io/kubernetes/pkg/kubelet/BUILD
generated
vendored
7
vendor/k8s.io/kubernetes/pkg/kubelet/BUILD
generated
vendored
|
|
@ -28,8 +28,8 @@ go_library(
|
|||
"util.go",
|
||||
"volume_host.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet",
|
||||
deps = [
|
||||
"//cmd/kubelet/app/options:go_default_library",
|
||||
"//pkg/api:go_default_library",
|
||||
"//pkg/api/v1:go_default_library",
|
||||
"//pkg/api/v1/helper:go_default_library",
|
||||
|
|
@ -116,6 +116,7 @@ go_library(
|
|||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||
|
|
@ -129,12 +130,12 @@ go_library(
|
|||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
|
||||
"//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library",
|
||||
"//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/client-go/listers/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||
"//vendor/k8s.io/client-go/tools/record:go_default_library",
|
||||
"//vendor/k8s.io/client-go/tools/remotecommand:go_default_library",
|
||||
"//vendor/k8s.io/client-go/util/certificate:go_default_library",
|
||||
"//vendor/k8s.io/client-go/util/flowcontrol:go_default_library",
|
||||
"//vendor/k8s.io/client-go/util/integer:go_default_library",
|
||||
"//vendor/k8s.io/utils/exec:go_default_library",
|
||||
|
|
@ -164,7 +165,6 @@ go_test(
|
|||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
@ -288,7 +288,6 @@ filegroup(
|
|||
"//pkg/kubelet/types:all-srcs",
|
||||
"//pkg/kubelet/util:all-srcs",
|
||||
"//pkg/kubelet/volumemanager:all-srcs",
|
||||
"//pkg/kubelet/winstats:all-srcs",
|
||||
],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD
generated
vendored
|
|
@ -11,7 +11,6 @@ go_library(
|
|||
"well_known_annotations.go",
|
||||
"well_known_labels.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/apis",
|
||||
)
|
||||
|
||||
filegroup(
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/BUILD
generated
vendored
|
|
@ -8,7 +8,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["services.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/apis/cri",
|
||||
deps = ["//pkg/kubelet/apis/cri/v1alpha1/runtime:go_default_library"],
|
||||
)
|
||||
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/BUILD
generated
vendored
|
|
@ -11,7 +11,6 @@ go_library(
|
|||
"api.pb.go",
|
||||
"constants.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime",
|
||||
deps = [
|
||||
"//vendor/github.com/gogo/protobuf/gogoproto:go_default_library",
|
||||
"//vendor/github.com/gogo/protobuf/proto:go_default_library",
|
||||
|
|
|
|||
718
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go
generated
vendored
718
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/api.pb.go
generated
vendored
|
|
@ -1397,7 +1397,6 @@ type LinuxContainerSecurityContext struct {
|
|||
SupplementalGroups []int64 `protobuf:"varint,8,rep,packed,name=supplemental_groups,json=supplementalGroups" json:"supplemental_groups,omitempty"`
|
||||
// AppArmor profile for the container, candidate values are:
|
||||
// * runtime/default: equivalent to not specifying a profile.
|
||||
// * unconfined: no profiles are loaded
|
||||
// * localhost/<profile_name>: profile loaded on the node
|
||||
// (localhost) by name. The possible profile names are detailed at
|
||||
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
|
||||
|
|
@ -2377,17 +2376,7 @@ type ExecRequest struct {
|
|||
// Whether to exec the command in a TTY.
|
||||
Tty bool `protobuf:"varint,3,opt,name=tty,proto3" json:"tty,omitempty"`
|
||||
// Whether to stream stdin.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
Stdin bool `protobuf:"varint,4,opt,name=stdin,proto3" json:"stdin,omitempty"`
|
||||
// Whether to stream stdout.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
Stdout bool `protobuf:"varint,5,opt,name=stdout,proto3" json:"stdout,omitempty"`
|
||||
// Whether to stream stderr.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
// If `tty` is true, `stderr` MUST be false. Multiplexing is not supported
|
||||
// in this case. The output of stdout and stderr will be combined to a
|
||||
// single stream.
|
||||
Stderr bool `protobuf:"varint,6,opt,name=stderr,proto3" json:"stderr,omitempty"`
|
||||
}
|
||||
|
||||
func (m *ExecRequest) Reset() { *m = ExecRequest{} }
|
||||
|
|
@ -2422,20 +2411,6 @@ func (m *ExecRequest) GetStdin() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (m *ExecRequest) GetStdout() bool {
|
||||
if m != nil {
|
||||
return m.Stdout
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *ExecRequest) GetStderr() bool {
|
||||
if m != nil {
|
||||
return m.Stderr
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type ExecResponse struct {
|
||||
// Fully qualified URL of the exec streaming server.
|
||||
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
|
||||
|
|
@ -2456,20 +2431,10 @@ type AttachRequest struct {
|
|||
// ID of the container to which to attach.
|
||||
ContainerId string `protobuf:"bytes,1,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"`
|
||||
// Whether to stream stdin.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
Stdin bool `protobuf:"varint,2,opt,name=stdin,proto3" json:"stdin,omitempty"`
|
||||
// Whether the process being attached is running in a TTY.
|
||||
// This must match the TTY setting in the ContainerConfig.
|
||||
Tty bool `protobuf:"varint,3,opt,name=tty,proto3" json:"tty,omitempty"`
|
||||
// Whether to stream stdout.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
Stdout bool `protobuf:"varint,4,opt,name=stdout,proto3" json:"stdout,omitempty"`
|
||||
// Whether to stream stderr.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
// If `tty` is true, `stderr` MUST be false. Multiplexing is not supported
|
||||
// in this case. The output of stdout and stderr will be combined to a
|
||||
// single stream.
|
||||
Stderr bool `protobuf:"varint,5,opt,name=stderr,proto3" json:"stderr,omitempty"`
|
||||
}
|
||||
|
||||
func (m *AttachRequest) Reset() { *m = AttachRequest{} }
|
||||
|
|
@ -2497,20 +2462,6 @@ func (m *AttachRequest) GetTty() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (m *AttachRequest) GetStdout() bool {
|
||||
if m != nil {
|
||||
return m.Stdout
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *AttachRequest) GetStderr() bool {
|
||||
if m != nil {
|
||||
return m.Stderr
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type AttachResponse struct {
|
||||
// Fully qualified URL of the attach streaming server.
|
||||
Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
|
||||
|
|
@ -7070,26 +7021,6 @@ func (m *ExecRequest) MarshalTo(dAtA []byte) (int, error) {
|
|||
}
|
||||
i++
|
||||
}
|
||||
if m.Stdout {
|
||||
dAtA[i] = 0x28
|
||||
i++
|
||||
if m.Stdout {
|
||||
dAtA[i] = 1
|
||||
} else {
|
||||
dAtA[i] = 0
|
||||
}
|
||||
i++
|
||||
}
|
||||
if m.Stderr {
|
||||
dAtA[i] = 0x30
|
||||
i++
|
||||
if m.Stderr {
|
||||
dAtA[i] = 1
|
||||
} else {
|
||||
dAtA[i] = 0
|
||||
}
|
||||
i++
|
||||
}
|
||||
return i, nil
|
||||
}
|
||||
|
||||
|
|
@ -7158,26 +7089,6 @@ func (m *AttachRequest) MarshalTo(dAtA []byte) (int, error) {
|
|||
}
|
||||
i++
|
||||
}
|
||||
if m.Stdout {
|
||||
dAtA[i] = 0x20
|
||||
i++
|
||||
if m.Stdout {
|
||||
dAtA[i] = 1
|
||||
} else {
|
||||
dAtA[i] = 0
|
||||
}
|
||||
i++
|
||||
}
|
||||
if m.Stderr {
|
||||
dAtA[i] = 0x28
|
||||
i++
|
||||
if m.Stderr {
|
||||
dAtA[i] = 1
|
||||
} else {
|
||||
dAtA[i] = 0
|
||||
}
|
||||
i++
|
||||
}
|
||||
return i, nil
|
||||
}
|
||||
|
||||
|
|
@ -9506,12 +9417,6 @@ func (m *ExecRequest) Size() (n int) {
|
|||
if m.Stdin {
|
||||
n += 2
|
||||
}
|
||||
if m.Stdout {
|
||||
n += 2
|
||||
}
|
||||
if m.Stderr {
|
||||
n += 2
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
|
|
@ -9538,12 +9443,6 @@ func (m *AttachRequest) Size() (n int) {
|
|||
if m.Tty {
|
||||
n += 2
|
||||
}
|
||||
if m.Stdout {
|
||||
n += 2
|
||||
}
|
||||
if m.Stderr {
|
||||
n += 2
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
|
|
@ -10892,8 +10791,6 @@ func (this *ExecRequest) String() string {
|
|||
`Cmd:` + fmt.Sprintf("%v", this.Cmd) + `,`,
|
||||
`Tty:` + fmt.Sprintf("%v", this.Tty) + `,`,
|
||||
`Stdin:` + fmt.Sprintf("%v", this.Stdin) + `,`,
|
||||
`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`,
|
||||
`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`,
|
||||
`}`,
|
||||
}, "")
|
||||
return s
|
||||
|
|
@ -10916,8 +10813,6 @@ func (this *AttachRequest) String() string {
|
|||
`ContainerId:` + fmt.Sprintf("%v", this.ContainerId) + `,`,
|
||||
`Stdin:` + fmt.Sprintf("%v", this.Stdin) + `,`,
|
||||
`Tty:` + fmt.Sprintf("%v", this.Tty) + `,`,
|
||||
`Stdout:` + fmt.Sprintf("%v", this.Stdout) + `,`,
|
||||
`Stderr:` + fmt.Sprintf("%v", this.Stderr) + `,`,
|
||||
`}`,
|
||||
}, "")
|
||||
return s
|
||||
|
|
@ -20438,46 +20333,6 @@ func (m *ExecRequest) Unmarshal(dAtA []byte) error {
|
|||
}
|
||||
}
|
||||
m.Stdin = bool(v != 0)
|
||||
case 5:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType)
|
||||
}
|
||||
var v int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowApi
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
v |= (int(b) & 0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
m.Stdout = bool(v != 0)
|
||||
case 6:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType)
|
||||
}
|
||||
var v int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowApi
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
v |= (int(b) & 0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
m.Stderr = bool(v != 0)
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipApi(dAtA[iNdEx:])
|
||||
|
|
@ -20676,46 +20531,6 @@ func (m *AttachRequest) Unmarshal(dAtA []byte) error {
|
|||
}
|
||||
}
|
||||
m.Tty = bool(v != 0)
|
||||
case 4:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType)
|
||||
}
|
||||
var v int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowApi
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
v |= (int(b) & 0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
m.Stdout = bool(v != 0)
|
||||
case 5:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType)
|
||||
}
|
||||
var v int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowApi
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
v |= (int(b) & 0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
m.Stderr = bool(v != 0)
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipApi(dAtA[iNdEx:])
|
||||
|
|
@ -24753,274 +24568,273 @@ var (
|
|||
func init() { proto.RegisterFile("api.proto", fileDescriptorApi) }
|
||||
|
||||
var fileDescriptorApi = []byte{
|
||||
// 4300 bytes of a gzipped FileDescriptorProto
|
||||
// 4276 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x4d, 0x6f, 0x1b, 0x49,
|
||||
0x76, 0x22, 0xa9, 0x0f, 0xf2, 0x51, 0xa4, 0xa8, 0x92, 0x2c, 0x51, 0xb4, 0x2d, 0xcb, 0xed, 0xf1,
|
||||
0x8c, 0xed, 0x5d, 0x7b, 0x3c, 0x9a, 0x1d, 0x4f, 0xc6, 0xf3, 0x65, 0x8e, 0x24, 0x3b, 0x1a, 0xdb,
|
||||
0x94, 0xb6, 0x29, 0xcd, 0xee, 0x62, 0x03, 0x74, 0x5a, 0xec, 0x12, 0xd5, 0x33, 0x64, 0x77, 0x4f,
|
||||
0x77, 0xb5, 0x6d, 0x05, 0x39, 0x24, 0x97, 0x20, 0x08, 0x10, 0x60, 0x73, 0x4c, 0x4e, 0x39, 0x04,
|
||||
0x58, 0xe4, 0x92, 0x43, 0x0e, 0x41, 0x7e, 0x41, 0xb0, 0x97, 0x05, 0x02, 0x04, 0x08, 0x92, 0x5b,
|
||||
0xd6, 0x39, 0xe4, 0x10, 0x20, 0xbf, 0x21, 0xa8, 0xaf, 0xee, 0xea, 0x2f, 0x5a, 0xf2, 0x0c, 0x76,
|
||||
0x7d, 0x62, 0xd7, 0xab, 0x57, 0xaf, 0x5e, 0xbd, 0xf7, 0xea, 0xd5, 0x7b, 0xaf, 0x8a, 0x50, 0x33,
|
||||
0x3d, 0xfb, 0x8e, 0xe7, 0xbb, 0xc4, 0x45, 0x73, 0x7e, 0xe8, 0x10, 0x7b, 0x8c, 0x3b, 0xb7, 0x87,
|
||||
0x36, 0x39, 0x09, 0x8f, 0xee, 0x0c, 0xdc, 0xf1, 0xbb, 0x43, 0x77, 0xe8, 0xbe, 0xcb, 0xfa, 0x8f,
|
||||
0xc2, 0x63, 0xd6, 0x62, 0x0d, 0xf6, 0xc5, 0xc7, 0x69, 0xb7, 0xa0, 0xf9, 0x15, 0xf6, 0x03, 0xdb,
|
||||
0x75, 0x74, 0xfc, 0x6d, 0x88, 0x03, 0x82, 0xda, 0x30, 0xf7, 0x8c, 0x43, 0xda, 0xa5, 0x8d, 0xd2,
|
||||
0x8d, 0x9a, 0x2e, 0x9b, 0xda, 0x2f, 0x4b, 0xb0, 0x10, 0x21, 0x07, 0x9e, 0xeb, 0x04, 0xb8, 0x18,
|
||||
0x1b, 0x5d, 0x85, 0x79, 0xc1, 0x93, 0xe1, 0x98, 0x63, 0xdc, 0x2e, 0xb3, 0xee, 0xba, 0x80, 0xf5,
|
||||
0xcc, 0x31, 0x46, 0xef, 0xc0, 0x82, 0x44, 0x91, 0x44, 0x2a, 0x0c, 0xab, 0x29, 0xc0, 0x62, 0x36,
|
||||
0x74, 0x07, 0x96, 0x24, 0xa2, 0xe9, 0xd9, 0x11, 0xf2, 0x34, 0x43, 0x5e, 0x14, 0x5d, 0x5d, 0xcf,
|
||||
0x16, 0xf8, 0xda, 0xcf, 0xa1, 0xb6, 0xdd, 0xeb, 0x6f, 0xb9, 0xce, 0xb1, 0x3d, 0xa4, 0x2c, 0x06,
|
||||
0xd8, 0xa7, 0x63, 0xda, 0xa5, 0x8d, 0x0a, 0x65, 0x51, 0x34, 0x51, 0x07, 0xaa, 0x01, 0x36, 0xfd,
|
||||
0xc1, 0x09, 0x0e, 0xda, 0x65, 0xd6, 0x15, 0xb5, 0xe9, 0x28, 0xd7, 0x23, 0xb6, 0xeb, 0x04, 0xed,
|
||||
0x0a, 0x1f, 0x25, 0x9a, 0xda, 0x5f, 0x97, 0xa0, 0xbe, 0xef, 0xfa, 0xe4, 0xa9, 0xe9, 0x79, 0xb6,
|
||||
0x33, 0x44, 0xb7, 0xa1, 0xca, 0x64, 0x39, 0x70, 0x47, 0x4c, 0x06, 0xcd, 0xcd, 0xc5, 0x3b, 0x82,
|
||||
0xa5, 0x3b, 0xfb, 0xa2, 0x43, 0x8f, 0x50, 0xd0, 0x75, 0x68, 0x0e, 0x5c, 0x87, 0x98, 0xb6, 0x83,
|
||||
0x7d, 0xc3, 0x73, 0x7d, 0xc2, 0x24, 0x33, 0xa3, 0x37, 0x22, 0x28, 0x25, 0x8e, 0x2e, 0x42, 0xed,
|
||||
0xc4, 0x0d, 0x08, 0xc7, 0xa8, 0x30, 0x8c, 0x2a, 0x05, 0xb0, 0xce, 0x55, 0x98, 0x63, 0x9d, 0xb6,
|
||||
0x27, 0x64, 0x30, 0x4b, 0x9b, 0xbb, 0x9e, 0xf6, 0xeb, 0x12, 0xcc, 0x3c, 0x75, 0x43, 0x87, 0xa4,
|
||||
0xa6, 0x31, 0xc9, 0x89, 0xd0, 0x8f, 0x32, 0x8d, 0x49, 0x4e, 0xe2, 0x69, 0x28, 0x06, 0x57, 0x11,
|
||||
0x9f, 0x86, 0x76, 0x76, 0xa0, 0xea, 0x63, 0xd3, 0x72, 0x9d, 0xd1, 0x29, 0x63, 0xa1, 0xaa, 0x47,
|
||||
0x6d, 0xaa, 0xbb, 0x00, 0x8f, 0x6c, 0x27, 0x7c, 0x61, 0xf8, 0x78, 0x64, 0x1e, 0xe1, 0x11, 0x63,
|
||||
0xa5, 0xaa, 0x37, 0x05, 0x58, 0xe7, 0x50, 0xf4, 0x31, 0xd4, 0x3d, 0xdf, 0xf5, 0xcc, 0xa1, 0x49,
|
||||
0xc5, 0xd7, 0x9e, 0x61, 0x12, 0x5a, 0x8b, 0x24, 0xc4, 0xb8, 0xdd, 0x8f, 0x11, 0x74, 0x15, 0x5b,
|
||||
0xfb, 0x1a, 0x16, 0xa8, 0xa5, 0x04, 0x9e, 0x39, 0xc0, 0x7b, 0x4c, 0xfe, 0xd4, 0xae, 0x18, 0xc7,
|
||||
0x0e, 0x26, 0xcf, 0x5d, 0xff, 0x1b, 0xb6, 0xac, 0xaa, 0x5e, 0xa7, 0xb0, 0x1e, 0x07, 0xa1, 0x35,
|
||||
0xa8, 0xf2, 0x45, 0xd9, 0x16, 0x5b, 0x53, 0x55, 0x67, 0xe2, 0xda, 0xb7, 0xad, 0xa8, 0xcb, 0xf6,
|
||||
0x06, 0x62, 0x49, 0x73, 0x5c, 0x74, 0x03, 0x4d, 0x03, 0xd8, 0x75, 0xc8, 0xbd, 0x1f, 0x7d, 0x65,
|
||||
0x8e, 0x42, 0x8c, 0x96, 0x61, 0xe6, 0x19, 0xfd, 0x60, 0xf4, 0x2b, 0x3a, 0x6f, 0x68, 0x7f, 0x56,
|
||||
0x81, 0x8b, 0x4f, 0xe8, 0xea, 0xfa, 0xa6, 0x63, 0x1d, 0xb9, 0x2f, 0xfa, 0x78, 0x10, 0xfa, 0x36,
|
||||
0x39, 0xdd, 0x72, 0x1d, 0x82, 0x5f, 0x10, 0xb4, 0x03, 0x8b, 0x8e, 0xe4, 0xd7, 0x90, 0xf6, 0x43,
|
||||
0x29, 0xd4, 0x37, 0xdb, 0xd1, 0x92, 0x53, 0x2b, 0xd2, 0x5b, 0x4e, 0x12, 0x10, 0xa0, 0xcf, 0x63,
|
||||
0xe1, 0x4a, 0x22, 0x65, 0x46, 0x64, 0x25, 0x22, 0xd2, 0xdf, 0x61, 0x7c, 0x08, 0x12, 0x52, 0xe8,
|
||||
0x92, 0xc0, 0xfb, 0x40, 0x37, 0x9a, 0x61, 0x06, 0x46, 0x18, 0x60, 0x9f, 0xad, 0xb4, 0xbe, 0xb9,
|
||||
0x14, 0x0d, 0x8e, 0xd7, 0xa9, 0xd7, 0xfc, 0xd0, 0xe9, 0x06, 0x87, 0x01, 0xf6, 0xd9, 0x76, 0x14,
|
||||
0xea, 0x35, 0x7c, 0xd7, 0x25, 0xc7, 0x81, 0x54, 0xa9, 0x04, 0xeb, 0x0c, 0x8a, 0xde, 0x85, 0xa5,
|
||||
0x20, 0xf4, 0xbc, 0x11, 0x1e, 0x63, 0x87, 0x98, 0x23, 0x63, 0xe8, 0xbb, 0xa1, 0x17, 0xb4, 0x67,
|
||||
0x36, 0x2a, 0x37, 0x2a, 0x3a, 0x52, 0xbb, 0x1e, 0xb1, 0x1e, 0xb4, 0x0e, 0xe0, 0xf9, 0xf6, 0x33,
|
||||
0x7b, 0x84, 0x87, 0xd8, 0x6a, 0xcf, 0x32, 0xa2, 0x0a, 0x04, 0xdd, 0x85, 0xe5, 0x00, 0x0f, 0x06,
|
||||
0xee, 0xd8, 0x33, 0x3c, 0xdf, 0x3d, 0xb6, 0x47, 0x98, 0x1b, 0xe4, 0x1c, 0x33, 0x48, 0x24, 0xfa,
|
||||
0xf6, 0x79, 0x17, 0x35, 0x4d, 0xed, 0x17, 0x65, 0xb8, 0xc0, 0x04, 0xb0, 0xef, 0x5a, 0x42, 0x17,
|
||||
0x62, 0xbb, 0x5f, 0x83, 0xc6, 0x80, 0x31, 0x64, 0x78, 0xa6, 0x8f, 0x1d, 0x22, 0xec, 0x7e, 0x9e,
|
||||
0x03, 0xf7, 0x19, 0x0c, 0xed, 0x41, 0x2b, 0x10, 0xaa, 0x33, 0x06, 0x5c, 0x77, 0x42, 0xc2, 0x6f,
|
||||
0x45, 0x42, 0x9a, 0xa0, 0x67, 0x7d, 0x21, 0xc8, 0x28, 0x7e, 0x2e, 0x38, 0x0d, 0x06, 0x64, 0xc4,
|
||||
0xdd, 0x45, 0x7d, 0xf3, 0x07, 0x49, 0x3a, 0x69, 0x36, 0xef, 0xf4, 0x39, 0xf6, 0x8e, 0x43, 0xfc,
|
||||
0x53, 0x5d, 0x8e, 0xed, 0xdc, 0x87, 0x79, 0xb5, 0x03, 0xb5, 0xa0, 0xf2, 0x0d, 0x3e, 0x15, 0x4b,
|
||||
0xa0, 0x9f, 0xb1, 0x5d, 0xf2, 0xcd, 0xca, 0x1b, 0xf7, 0xcb, 0xbf, 0x57, 0xd2, 0x7c, 0x40, 0xf1,
|
||||
0x2c, 0x4f, 0x31, 0x31, 0x2d, 0x93, 0x98, 0x08, 0xc1, 0x34, 0x73, 0xbf, 0x9c, 0x04, 0xfb, 0xa6,
|
||||
0x54, 0x43, 0xb1, 0x35, 0x6a, 0x3a, 0xfd, 0x44, 0x97, 0xa0, 0x16, 0x19, 0xa1, 0xf0, 0xc1, 0x31,
|
||||
0x80, 0xfa, 0x42, 0x93, 0x10, 0x3c, 0xf6, 0x08, 0x33, 0x88, 0x86, 0x2e, 0x9b, 0xda, 0x3f, 0x4f,
|
||||
0x43, 0x2b, 0xa3, 0x81, 0x0f, 0xa1, 0x3a, 0x16, 0xd3, 0x0b, 0xdb, 0xbf, 0x18, 0x3b, 0xc4, 0x0c,
|
||||
0x87, 0x7a, 0x84, 0x4c, 0xfd, 0x0d, 0xdd, 0x8c, 0xca, 0x71, 0x11, 0xb5, 0xa9, 0x5a, 0x47, 0xee,
|
||||
0xd0, 0xb0, 0x6c, 0x1f, 0x0f, 0x88, 0xeb, 0x9f, 0x0a, 0x2e, 0xe7, 0x47, 0xee, 0x70, 0x5b, 0xc2,
|
||||
0xd0, 0x7b, 0x00, 0x96, 0x13, 0x50, 0x8d, 0x1e, 0xdb, 0x43, 0xc6, 0x6b, 0x7d, 0x13, 0x45, 0x73,
|
||||
0x47, 0x47, 0x82, 0x5e, 0xb3, 0x9c, 0x40, 0x30, 0xfb, 0x11, 0x34, 0xa8, 0x8b, 0x35, 0xc6, 0xdc,
|
||||
0x9b, 0x73, 0x2b, 0xae, 0x6f, 0x2e, 0x2b, 0x1c, 0x47, 0xae, 0x5e, 0x9f, 0xf7, 0xe2, 0x46, 0x80,
|
||||
0x3e, 0x85, 0x59, 0xe6, 0xe2, 0x82, 0xf6, 0x2c, 0x1b, 0x73, 0x3d, 0x67, 0x95, 0x42, 0xdb, 0x4f,
|
||||
0x18, 0x1e, 0x57, 0xb6, 0x18, 0x84, 0x9e, 0x40, 0xdd, 0x74, 0x1c, 0x97, 0x98, 0x7c, 0x83, 0xcf,
|
||||
0x31, 0x1a, 0xb7, 0x8a, 0x69, 0x74, 0x63, 0x64, 0x4e, 0x48, 0x1d, 0x8e, 0x7e, 0x04, 0x33, 0xcc,
|
||||
0x03, 0xb4, 0xab, 0x6c, 0xd5, 0xeb, 0x93, 0xcd, 0x4f, 0xe7, 0xc8, 0x9d, 0x8f, 0xa0, 0xae, 0xb0,
|
||||
0x76, 0x1e, 0x73, 0xeb, 0x7c, 0x06, 0xad, 0x34, 0x47, 0xe7, 0x32, 0xd7, 0x5d, 0x58, 0xd6, 0x43,
|
||||
0x27, 0x66, 0x4c, 0xc6, 0x1f, 0xef, 0xc1, 0xac, 0xd0, 0x1f, 0xb7, 0x9d, 0xb5, 0x42, 0x89, 0xe8,
|
||||
0x02, 0x51, 0xfb, 0x14, 0x2e, 0xa4, 0x48, 0x89, 0xe8, 0xe4, 0x2d, 0x68, 0x7a, 0xae, 0x65, 0x04,
|
||||
0x1c, 0x6c, 0xd8, 0x96, 0x74, 0x06, 0x5e, 0x84, 0xbb, 0x6b, 0xd1, 0xe1, 0x7d, 0xe2, 0x7a, 0x59,
|
||||
0x56, 0xce, 0x36, 0xbc, 0x0d, 0x2b, 0xe9, 0xe1, 0x7c, 0x7a, 0xed, 0x73, 0x58, 0xd5, 0xf1, 0xd8,
|
||||
0x7d, 0x86, 0x5f, 0x97, 0x74, 0x07, 0xda, 0x59, 0x02, 0x31, 0xf1, 0x18, 0xda, 0x27, 0x26, 0x09,
|
||||
0x83, 0xf3, 0x11, 0xbf, 0xa9, 0x12, 0x10, 0x47, 0x27, 0xa7, 0x83, 0x9a, 0x50, 0xb6, 0x3d, 0x31,
|
||||
0xa8, 0x6c, 0x7b, 0xda, 0xe7, 0x50, 0x8b, 0x0e, 0x2d, 0xb4, 0x19, 0x47, 0x46, 0xe5, 0x57, 0x9c,
|
||||
0x6c, 0x51, 0xcc, 0xf4, 0x38, 0xe3, 0xad, 0xc5, 0x4c, 0x9b, 0x00, 0x91, 0x9f, 0x91, 0x27, 0x25,
|
||||
0xca, 0xd2, 0xd3, 0x15, 0x2c, 0xed, 0xef, 0x12, 0x4e, 0x47, 0x61, 0xd9, 0x8a, 0x58, 0xb6, 0x12,
|
||||
0x4e, 0xa8, 0x7c, 0x1e, 0x27, 0x74, 0x07, 0x66, 0x02, 0x62, 0x12, 0xee, 0x06, 0x9b, 0xca, 0xe2,
|
||||
0x92, 0x53, 0x62, 0x9d, 0xa3, 0xa1, 0xcb, 0x00, 0x03, 0x1f, 0x9b, 0x04, 0x5b, 0x86, 0xc9, 0xfd,
|
||||
0x63, 0x45, 0xaf, 0x09, 0x48, 0x97, 0xa0, 0xfb, 0x30, 0x27, 0x23, 0x95, 0x19, 0xc6, 0xc6, 0x46,
|
||||
0x0e, 0xc1, 0x84, 0xf4, 0x75, 0x39, 0x20, 0xde, 0xd3, 0xb3, 0x93, 0xf7, 0xb4, 0x18, 0xc7, 0x91,
|
||||
0x15, 0xb7, 0x34, 0x57, 0xe8, 0x96, 0xf8, 0x88, 0xb3, 0xb8, 0xa5, 0x6a, 0xa1, 0x5b, 0x12, 0x34,
|
||||
0x26, 0xba, 0xa5, 0xdf, 0xa5, 0x83, 0x79, 0x0a, 0xed, 0xec, 0x06, 0x11, 0x8e, 0xe1, 0x3d, 0x98,
|
||||
0x0d, 0x18, 0x64, 0x82, 0x93, 0x11, 0x43, 0x04, 0xa2, 0xf6, 0x10, 0x96, 0x53, 0x16, 0xc0, 0x03,
|
||||
0xc5, 0xc8, 0x5e, 0x4a, 0x67, 0xb2, 0x17, 0xed, 0xff, 0x4a, 0xaa, 0xf5, 0x3e, 0xb4, 0x47, 0x04,
|
||||
0xfb, 0x19, 0xeb, 0x7d, 0x5f, 0x12, 0xe5, 0xa6, 0x7b, 0xb9, 0x88, 0x28, 0x8f, 0xe1, 0x84, 0x25,
|
||||
0xf6, 0xa1, 0xc9, 0x74, 0x68, 0x04, 0x78, 0xc4, 0x0e, 0x44, 0x11, 0x8a, 0xfc, 0x30, 0x67, 0x34,
|
||||
0x9f, 0x97, 0x1b, 0x40, 0x5f, 0xa0, 0x73, 0xf5, 0x35, 0x46, 0x2a, 0xac, 0xf3, 0x00, 0x50, 0x16,
|
||||
0xe9, 0x5c, 0x7a, 0xf8, 0x92, 0xee, 0x7d, 0x9a, 0xb8, 0xe4, 0x78, 0xfa, 0x63, 0xc6, 0xc6, 0x04,
|
||||
0x25, 0x70, 0x3e, 0x75, 0x81, 0xa8, 0xfd, 0x6d, 0x05, 0x20, 0xee, 0x7c, 0x63, 0x37, 0xfd, 0x87,
|
||||
0xd1, 0x16, 0xe4, 0xd1, 0xc4, 0x95, 0x1c, 0x7a, 0xb9, 0x9b, 0xef, 0x61, 0x72, 0xf3, 0xf1, 0xb8,
|
||||
0xe2, 0xad, 0xbc, 0xd1, 0x6f, 0xec, 0xb6, 0xdb, 0x82, 0x95, 0xb4, 0xba, 0xc5, 0xa6, 0xbb, 0x09,
|
||||
0x33, 0x36, 0xc1, 0x63, 0x9e, 0x86, 0xab, 0xe9, 0x88, 0x82, 0xcb, 0x31, 0xb4, 0xab, 0x50, 0xdb,
|
||||
0x1d, 0x9b, 0x43, 0xdc, 0xf7, 0xf0, 0x80, 0xce, 0x65, 0xd3, 0x86, 0x98, 0x9f, 0x37, 0xb4, 0x4d,
|
||||
0xa8, 0x3e, 0xc6, 0xa7, 0x7c, 0x0f, 0x9e, 0x91, 0x3f, 0xed, 0x2f, 0xcb, 0xb0, 0xca, 0x7c, 0xe7,
|
||||
0x96, 0x4c, 0x82, 0x75, 0x1c, 0xb8, 0xa1, 0x3f, 0xc0, 0x01, 0x53, 0xa9, 0x17, 0x1a, 0x1e, 0xf6,
|
||||
0x6d, 0xd7, 0x12, 0x59, 0x5f, 0x6d, 0xe0, 0x85, 0xfb, 0x0c, 0x40, 0x13, 0x65, 0xda, 0xfd, 0x6d,
|
||||
0xe8, 0x0a, 0xdb, 0xaa, 0xe8, 0xd5, 0x81, 0x17, 0xfe, 0x98, 0xb6, 0xe5, 0xd8, 0xe0, 0xc4, 0xf4,
|
||||
0x71, 0xc0, 0x6c, 0x88, 0x8f, 0xed, 0x33, 0x00, 0x7a, 0x0f, 0x2e, 0x8c, 0xf1, 0xd8, 0xf5, 0x4f,
|
||||
0x8d, 0x91, 0x3d, 0xb6, 0x89, 0x61, 0x3b, 0xc6, 0xd1, 0x29, 0xc1, 0x81, 0x30, 0x1c, 0xc4, 0x3b,
|
||||
0x9f, 0xd0, 0xbe, 0x5d, 0xe7, 0x0b, 0xda, 0x83, 0x34, 0x68, 0xb8, 0xee, 0xd8, 0x08, 0x06, 0xae,
|
||||
0x8f, 0x0d, 0xd3, 0xfa, 0x9a, 0x1d, 0x1e, 0x15, 0xbd, 0xee, 0xba, 0xe3, 0x3e, 0x85, 0x75, 0xad,
|
||||
0xaf, 0xd1, 0x15, 0xa8, 0x0f, 0xbc, 0x30, 0xc0, 0xc4, 0xa0, 0x3f, 0xec, 0x90, 0xa8, 0xe9, 0xc0,
|
||||
0x41, 0x5b, 0x5e, 0x18, 0x28, 0x08, 0x63, 0x2a, 0xf6, 0x39, 0x15, 0xe1, 0x29, 0x15, 0xb3, 0x09,
|
||||
0x8d, 0x44, 0x1e, 0x49, 0xb3, 0x05, 0x96, 0x30, 0x8a, 0x6c, 0x81, 0x7e, 0x53, 0x98, 0xef, 0x8e,
|
||||
0xa4, 0x24, 0xd9, 0x37, 0x85, 0x91, 0x53, 0x4f, 0xa6, 0x0a, 0xec, 0x9b, 0x8a, 0x7c, 0x84, 0x9f,
|
||||
0x89, 0x3a, 0x40, 0x4d, 0xe7, 0x0d, 0xcd, 0x02, 0xd8, 0x32, 0x3d, 0xf3, 0xc8, 0x1e, 0xd9, 0xe4,
|
||||
0x14, 0xdd, 0x84, 0x96, 0x69, 0x59, 0xc6, 0x40, 0x42, 0x6c, 0x2c, 0x8b, 0x32, 0x0b, 0xa6, 0x65,
|
||||
0x6d, 0x29, 0x60, 0xf4, 0x03, 0x58, 0xb4, 0x7c, 0xd7, 0x4b, 0xe2, 0xf2, 0x2a, 0x4d, 0x8b, 0x76,
|
||||
0xa8, 0xc8, 0xda, 0x3f, 0x4d, 0xc3, 0xe5, 0xa4, 0x62, 0xd3, 0x99, 0xf9, 0x87, 0x30, 0x9f, 0x9a,
|
||||
0x35, 0x99, 0x12, 0xc7, 0x4c, 0xea, 0x09, 0xc4, 0x54, 0xee, 0x5a, 0xce, 0xe4, 0xae, 0xb9, 0x29,
|
||||
0x7f, 0xe5, 0xfb, 0x48, 0xf9, 0xa7, 0xbf, 0x4b, 0xca, 0x3f, 0x73, 0xa6, 0x94, 0xff, 0x6d, 0x56,
|
||||
0x81, 0x93, 0x83, 0x58, 0xe2, 0xc5, 0xcd, 0xa8, 0x11, 0xe1, 0x38, 0xb2, 0x52, 0x97, 0x2a, 0x0d,
|
||||
0xcc, 0x9d, 0xa7, 0x34, 0x50, 0x2d, 0x2c, 0x0d, 0x50, 0x8b, 0xf0, 0x3c, 0xd3, 0x1f, 0xbb, 0xbe,
|
||||
0xcc, 0xfd, 0xdb, 0x35, 0xc6, 0xc2, 0x82, 0x84, 0x8b, 0xbc, 0xbf, 0xb0, 0x4a, 0x00, 0x45, 0x55,
|
||||
0x02, 0xb4, 0x01, 0xf3, 0x8e, 0x6b, 0x38, 0xf8, 0xb9, 0x41, 0x15, 0x16, 0xb4, 0xeb, 0x5c, 0x7b,
|
||||
0x8e, 0xdb, 0xc3, 0xcf, 0xf7, 0x29, 0x44, 0xfb, 0xfb, 0x12, 0x2c, 0x27, 0x0d, 0x47, 0xe4, 0x85,
|
||||
0x9f, 0x41, 0xcd, 0x97, 0xbe, 0x41, 0x18, 0xcb, 0x46, 0x32, 0xfe, 0xca, 0xfa, 0x10, 0x3d, 0x1e,
|
||||
0x82, 0x7e, 0x5c, 0x58, 0x61, 0x78, 0xbb, 0x80, 0xcc, 0xab, 0x6a, 0x0c, 0x5a, 0x17, 0x16, 0x23,
|
||||
0xe4, 0x89, 0xf9, 0xbd, 0x92, 0xaf, 0x97, 0x93, 0xf9, 0xba, 0x03, 0xb3, 0xdb, 0xf8, 0x99, 0x3d,
|
||||
0xc0, 0xdf, 0x4b, 0x7d, 0x70, 0x03, 0xea, 0x1e, 0xf6, 0xc7, 0x76, 0x10, 0x44, 0x46, 0x5f, 0xd3,
|
||||
0x55, 0x90, 0xf6, 0x9f, 0x33, 0xb0, 0x90, 0x96, 0xec, 0xbd, 0x4c, 0x79, 0xa0, 0x13, 0xef, 0xc2,
|
||||
0xf4, 0xfa, 0x94, 0x33, 0xfa, 0x86, 0x3c, 0x06, 0xca, 0xa9, 0x2c, 0x21, 0x3a, 0x29, 0xc4, 0xd1,
|
||||
0x40, 0xd7, 0x3f, 0x70, 0xc7, 0x63, 0xd3, 0xb1, 0x64, 0xed, 0x56, 0x34, 0xa9, 0xb4, 0x4c, 0x7f,
|
||||
0x48, 0xb7, 0x16, 0x05, 0xb3, 0x6f, 0xea, 0x25, 0x69, 0xb4, 0x6d, 0x3b, 0xac, 0xba, 0xc0, 0x36,
|
||||
0x4e, 0x4d, 0x07, 0x01, 0xda, 0xb6, 0x7d, 0x74, 0x1d, 0xa6, 0xb1, 0xf3, 0x4c, 0x9e, 0xc6, 0x71,
|
||||
0x71, 0x57, 0x1e, 0x3f, 0x3a, 0xeb, 0x46, 0x6f, 0xc3, 0xec, 0xd8, 0x0d, 0x1d, 0x22, 0xe3, 0xee,
|
||||
0x66, 0xb2, 0xc6, 0xa9, 0x8b, 0x5e, 0x74, 0x13, 0xe6, 0x2c, 0xa6, 0x03, 0x19, 0x5c, 0x2f, 0xc4,
|
||||
0x15, 0x0a, 0x06, 0xd7, 0x65, 0x3f, 0xfa, 0x24, 0x8a, 0x23, 0x6a, 0xa9, 0x48, 0x20, 0x25, 0xd4,
|
||||
0xdc, 0x60, 0xe2, 0x71, 0x32, 0x98, 0x00, 0x46, 0xe2, 0x66, 0x21, 0x89, 0xc9, 0xf5, 0x85, 0x35,
|
||||
0xa8, 0x8e, 0xdc, 0x21, 0xb7, 0x83, 0x3a, 0xaf, 0xf4, 0x8f, 0xdc, 0x21, 0x33, 0x83, 0x65, 0x1a,
|
||||
0x3c, 0x59, 0xb6, 0xd3, 0x9e, 0x67, 0xdb, 0x8b, 0x37, 0xe8, 0x99, 0xc8, 0x3e, 0x0c, 0xd7, 0x19,
|
||||
0xe0, 0x76, 0x83, 0x75, 0xd5, 0x18, 0x64, 0xcf, 0x19, 0xb0, 0x23, 0x9b, 0x90, 0xd3, 0x76, 0x93,
|
||||
0xc1, 0xe9, 0x27, 0x8d, 0x79, 0x79, 0xb6, 0xb3, 0x90, 0x8a, 0x79, 0xf3, 0xf6, 0xe7, 0x1b, 0x50,
|
||||
0xc0, 0xf8, 0xc7, 0x12, 0xac, 0x6c, 0xb1, 0x90, 0x4f, 0xf1, 0x04, 0xe7, 0x48, 0xc0, 0xd1, 0xdd,
|
||||
0xa8, 0xd2, 0x91, 0xce, 0xa3, 0xd3, 0x8b, 0x15, 0x78, 0xe8, 0x01, 0x34, 0x25, 0x4d, 0x31, 0xb2,
|
||||
0xf2, 0xaa, 0x1a, 0x49, 0x23, 0x50, 0x9b, 0xda, 0x27, 0xb0, 0x9a, 0xe1, 0x59, 0x84, 0x67, 0x57,
|
||||
0x61, 0x3e, 0xf6, 0x08, 0x11, 0xcb, 0xf5, 0x08, 0xb6, 0x6b, 0x69, 0xf7, 0xe1, 0x42, 0x9f, 0x98,
|
||||
0x3e, 0xc9, 0x2c, 0xf8, 0x0c, 0x63, 0x59, 0x99, 0x24, 0x39, 0x56, 0x54, 0x32, 0xfa, 0xb0, 0xdc,
|
||||
0x27, 0xae, 0xf7, 0x1a, 0x44, 0xe9, 0x4e, 0xa7, 0xcb, 0x76, 0x43, 0x22, 0x62, 0x32, 0xd9, 0xd4,
|
||||
0x56, 0x79, 0x51, 0x27, 0x3b, 0xdb, 0xc7, 0xb0, 0xc2, 0x6b, 0x2a, 0xaf, 0xb3, 0x88, 0x35, 0x59,
|
||||
0xd1, 0xc9, 0xd2, 0xdd, 0x86, 0xa5, 0xd8, 0x95, 0xc7, 0xe9, 0xe1, 0xed, 0x64, 0x7a, 0xb8, 0x9a,
|
||||
0xd5, 0x71, 0x22, 0x3b, 0xfc, 0xab, 0xb2, 0xe2, 0x30, 0x0b, 0x92, 0xc3, 0xcd, 0x64, 0x72, 0x78,
|
||||
0xa9, 0x80, 0x64, 0x22, 0x37, 0xcc, 0x5a, 0x64, 0x25, 0xc7, 0x22, 0xf5, 0x4c, 0x06, 0x39, 0x9d,
|
||||
0x2a, 0x66, 0xa7, 0x78, 0xfb, 0xad, 0x24, 0x90, 0xbb, 0x3c, 0x81, 0x8c, 0xa6, 0x8e, 0xea, 0x5c,
|
||||
0x77, 0x53, 0x09, 0x64, 0xbb, 0x88, 0xcd, 0x28, 0x7f, 0xfc, 0xf3, 0x69, 0xa8, 0x45, 0x7d, 0x19,
|
||||
0xc1, 0x66, 0x85, 0x54, 0xce, 0x11, 0x92, 0x7a, 0x7e, 0x55, 0x5e, 0xe7, 0xfc, 0x9a, 0x7e, 0xd5,
|
||||
0xf9, 0x75, 0x11, 0x6a, 0xec, 0xc3, 0xf0, 0xf1, 0xb1, 0x38, 0x8f, 0xaa, 0x0c, 0xa0, 0xe3, 0xe3,
|
||||
0xd8, 0xa0, 0x66, 0xcf, 0x62, 0x50, 0xa9, 0x4c, 0x75, 0x2e, 0x9d, 0xa9, 0xde, 0x8b, 0x4e, 0x18,
|
||||
0x7e, 0x16, 0xad, 0x67, 0xc9, 0xe5, 0x9e, 0x2d, 0x3b, 0xc9, 0xb3, 0x85, 0x1f, 0x4f, 0xd7, 0x72,
|
||||
0x06, 0xbf, 0xb1, 0x79, 0xea, 0x13, 0x9e, 0xa7, 0xaa, 0x56, 0x25, 0x1c, 0xe1, 0x26, 0x40, 0xb4,
|
||||
0xe7, 0x65, 0xb2, 0x8a, 0xb2, 0x4b, 0xd3, 0x15, 0x2c, 0xea, 0x55, 0x12, 0xf2, 0x8f, 0x8b, 0xb1,
|
||||
0x67, 0xf0, 0x2a, 0xff, 0xa2, 0x46, 0x49, 0x05, 0xf5, 0xcc, 0x7b, 0x99, 0xd2, 0xc6, 0xd9, 0xac,
|
||||
0xee, 0x76, 0xb2, 0xb2, 0x71, 0x3e, 0x73, 0xc9, 0x14, 0x36, 0xd8, 0xa1, 0x6e, 0xfa, 0xa2, 0x9b,
|
||||
0xe7, 0xa4, 0x35, 0x01, 0xe9, 0x12, 0x1a, 0x4a, 0x1d, 0xdb, 0x8e, 0x1d, 0x9c, 0xf0, 0xfe, 0x59,
|
||||
0xd6, 0x0f, 0x12, 0xd4, 0x65, 0xb7, 0xda, 0xf8, 0x85, 0x4d, 0x8c, 0x81, 0x6b, 0x61, 0x66, 0x8c,
|
||||
0x33, 0x7a, 0x95, 0x02, 0xb6, 0x5c, 0x0b, 0xc7, 0x1b, 0xa4, 0x7a, 0xae, 0x0d, 0x52, 0x4b, 0x6d,
|
||||
0x90, 0x15, 0x98, 0xf5, 0xb1, 0x19, 0xb8, 0x8e, 0x48, 0x0c, 0x44, 0x8b, 0x9e, 0x15, 0x63, 0x1c,
|
||||
0x04, 0x74, 0x02, 0x11, 0xc0, 0x88, 0xa6, 0x12, 0x66, 0xcd, 0x17, 0x85, 0x59, 0x13, 0x0a, 0xa6,
|
||||
0xa9, 0x30, 0xab, 0x51, 0x14, 0x66, 0x9d, 0xa5, 0x5e, 0xaa, 0x04, 0x91, 0xcd, 0x89, 0x41, 0xa4,
|
||||
0x1a, 0x8e, 0x2d, 0x24, 0xc2, 0xb1, 0xdf, 0xe5, 0x9e, 0x7a, 0x0c, 0xab, 0x99, 0x5d, 0x20, 0x36,
|
||||
0xd5, 0xdd, 0x54, 0xc5, 0xb5, 0x5d, 0x24, 0xa0, 0xa8, 0xe0, 0xfa, 0xc7, 0x70, 0xe5, 0xd0, 0xb3,
|
||||
0x52, 0xa1, 0x8a, 0x48, 0xb4, 0xce, 0x1e, 0x21, 0xdc, 0x93, 0x51, 0x65, 0xf9, 0x8c, 0x39, 0x1c,
|
||||
0x47, 0xd7, 0x34, 0xd8, 0x28, 0x9e, 0x5d, 0x1c, 0xf9, 0x7f, 0x08, 0x0b, 0x3b, 0x2f, 0xf0, 0xa0,
|
||||
0x7f, 0xea, 0x0c, 0xce, 0xc1, 0x51, 0x0b, 0x2a, 0x83, 0xb1, 0x25, 0x4a, 0x19, 0xf4, 0x53, 0x8d,
|
||||
0x62, 0x2a, 0xc9, 0x28, 0xc6, 0x80, 0x56, 0x3c, 0x83, 0x90, 0xe4, 0x0a, 0x95, 0xa4, 0x45, 0x91,
|
||||
0x29, 0xf1, 0x79, 0x5d, 0xb4, 0x04, 0x1c, 0xfb, 0x3e, 0x5b, 0x2a, 0x87, 0x63, 0xdf, 0x4f, 0xee,
|
||||
0xb9, 0x4a, 0x72, 0xcf, 0x69, 0x7f, 0x53, 0x82, 0x3a, 0x9d, 0xe1, 0x3b, 0xf1, 0x2f, 0x62, 0xf9,
|
||||
0x4a, 0x1c, 0xcb, 0x47, 0x29, 0xc1, 0xb4, 0x9a, 0x12, 0xc4, 0x9c, 0xcf, 0x30, 0x70, 0x96, 0xf3,
|
||||
0xd9, 0x08, 0x8e, 0x7d, 0x5f, 0xdb, 0x80, 0x79, 0xce, 0x9b, 0x58, 0x79, 0x0b, 0x2a, 0xa1, 0x3f,
|
||||
0x92, 0xa6, 0x18, 0xfa, 0x23, 0xed, 0x2f, 0x4a, 0xd0, 0xe8, 0x12, 0x62, 0x0e, 0x4e, 0xce, 0xb1,
|
||||
0x80, 0x88, 0xb9, 0xb2, 0xca, 0x5c, 0x76, 0x11, 0x31, 0xbb, 0xd3, 0x05, 0xec, 0xce, 0x24, 0xd8,
|
||||
0xd5, 0xa0, 0x29, 0x79, 0x29, 0x64, 0xb8, 0x07, 0x68, 0xdf, 0xf5, 0xc9, 0x43, 0xd7, 0x7f, 0x6e,
|
||||
0xfa, 0xd6, 0xf9, 0xf2, 0x05, 0x04, 0xd3, 0xe2, 0xbd, 0x50, 0xe5, 0xc6, 0x8c, 0xce, 0xbe, 0xb5,
|
||||
0x77, 0x60, 0x29, 0x41, 0xaf, 0x70, 0xe2, 0x0f, 0xa1, 0xce, 0xdc, 0xa8, 0x88, 0x29, 0x6f, 0xa8,
|
||||
0x35, 0xd5, 0x49, 0xbe, 0x56, 0xeb, 0xc2, 0x22, 0x3d, 0x27, 0x19, 0x3c, 0xda, 0x78, 0x3f, 0x4c,
|
||||
0x45, 0x5e, 0xcb, 0xc9, 0xf1, 0xa9, 0xa8, 0xeb, 0x1f, 0x4a, 0x30, 0xc3, 0xe0, 0x99, 0x53, 0xed,
|
||||
0x22, 0xd4, 0x7c, 0xec, 0xb9, 0x06, 0x31, 0x87, 0xd1, 0x13, 0x2c, 0x0a, 0x38, 0x30, 0x87, 0x01,
|
||||
0x7b, 0x41, 0x46, 0x3b, 0x2d, 0x7b, 0x88, 0x03, 0x22, 0xdf, 0x61, 0xd5, 0x29, 0x6c, 0x9b, 0x83,
|
||||
0xa8, 0x48, 0x02, 0xfb, 0x8f, 0x78, 0x48, 0x35, 0xad, 0xb3, 0x6f, 0x74, 0x9d, 0xbf, 0x6e, 0x98,
|
||||
0x50, 0x00, 0x63, 0x4f, 0x1e, 0x3a, 0x50, 0x4d, 0xd5, 0xbc, 0xa2, 0xb6, 0xf6, 0x09, 0x20, 0x75,
|
||||
0xcd, 0x42, 0xa8, 0x6f, 0xc3, 0x2c, 0x13, 0x89, 0x8c, 0x09, 0x9a, 0xc9, 0x45, 0xeb, 0xa2, 0x57,
|
||||
0xfb, 0x0c, 0x10, 0x97, 0x62, 0x22, 0x0e, 0x38, 0xbb, 0xc4, 0x3f, 0x86, 0xa5, 0xc4, 0xf8, 0xe8,
|
||||
0x32, 0x3b, 0x41, 0x20, 0x3d, 0xbb, 0x18, 0xfc, 0xeb, 0x12, 0x40, 0x37, 0x24, 0x27, 0xa2, 0xd8,
|
||||
0xa2, 0xae, 0xb2, 0x94, 0x5c, 0x25, 0xed, 0xf3, 0xcc, 0x20, 0x78, 0xee, 0xfa, 0x32, 0xd0, 0x8d,
|
||||
0xda, 0xac, 0x50, 0x12, 0x92, 0x13, 0x59, 0xe0, 0xa5, 0xdf, 0xe8, 0x3a, 0x34, 0xf9, 0xcb, 0x39,
|
||||
0xc3, 0xb4, 0x2c, 0x1f, 0x07, 0x81, 0xa8, 0xf4, 0x36, 0x38, 0xb4, 0xcb, 0x81, 0x14, 0xcd, 0xb6,
|
||||
0xb0, 0x43, 0x6c, 0x72, 0x6a, 0x10, 0xf7, 0x1b, 0xec, 0x88, 0x10, 0xb6, 0x21, 0xa1, 0x07, 0x14,
|
||||
0x48, 0xd1, 0x7c, 0x3c, 0xb4, 0x03, 0xe2, 0x4b, 0x34, 0x59, 0x79, 0x14, 0x50, 0x86, 0xa6, 0xfd,
|
||||
0xb2, 0x04, 0xad, 0xfd, 0x70, 0x34, 0xe2, 0x8b, 0x3c, 0xaf, 0x2c, 0xd1, 0x3b, 0x62, 0x1d, 0xe5,
|
||||
0x94, 0x35, 0xc4, 0x22, 0x12, 0x8b, 0xfb, 0xee, 0xa9, 0xf5, 0x5d, 0x58, 0x54, 0x18, 0x15, 0x4a,
|
||||
0x4b, 0x44, 0x2a, 0xa5, 0x64, 0xa4, 0x42, 0x0d, 0x85, 0x67, 0x93, 0xaf, 0xb7, 0x38, 0xed, 0x02,
|
||||
0x2c, 0x25, 0xc6, 0x8b, 0x63, 0xe9, 0x16, 0x34, 0xc4, 0x85, 0xb2, 0x30, 0x82, 0x35, 0xa8, 0x52,
|
||||
0xf7, 0x32, 0xb0, 0x2d, 0x59, 0xd9, 0x9f, 0xf3, 0x5c, 0x6b, 0xcb, 0xb6, 0x7c, 0xad, 0x07, 0x0d,
|
||||
0x9d, 0x93, 0x17, 0xb8, 0x9f, 0x42, 0x53, 0x5c, 0x3f, 0x1b, 0x89, 0x67, 0x18, 0x71, 0x19, 0x3a,
|
||||
0x41, 0x5b, 0x6f, 0x38, 0x6a, 0x53, 0xfb, 0x39, 0x74, 0xf8, 0xb1, 0x99, 0xa0, 0x2a, 0x97, 0xf6,
|
||||
0x29, 0xc8, 0x97, 0x9d, 0x45, 0xc4, 0x93, 0xc3, 0x1a, 0xbe, 0xda, 0xd4, 0x2e, 0xc3, 0xc5, 0x5c,
|
||||
0xe2, 0x62, 0xdd, 0x1e, 0xb4, 0xe2, 0x0e, 0xcb, 0x96, 0x17, 0x1a, 0xec, 0xa2, 0xa2, 0xa4, 0x5c,
|
||||
0x54, 0xac, 0x44, 0xa1, 0x48, 0x59, 0xfa, 0x6f, 0x16, 0x72, 0xc7, 0x81, 0x63, 0xa5, 0x28, 0x70,
|
||||
0x9c, 0x4e, 0x04, 0x8e, 0xda, 0x97, 0x91, 0xf4, 0x44, 0xd4, 0xfe, 0x11, 0x4b, 0x1d, 0xf8, 0xdc,
|
||||
0xd2, 0x4d, 0xac, 0xe5, 0x2c, 0x8e, 0x63, 0xe8, 0x0a, 0xb2, 0xb6, 0x00, 0x8d, 0x84, 0xc3, 0xd0,
|
||||
0x1e, 0x40, 0x33, 0xe5, 0x01, 0xee, 0xa4, 0x62, 0xa8, 0x8c, 0xd8, 0x52, 0x11, 0xd4, 0xb2, 0x70,
|
||||
0x44, 0x0f, 0x83, 0x5d, 0xe7, 0xd8, 0x95, 0x74, 0xaf, 0x41, 0xfd, 0xb0, 0xe8, 0xa1, 0xe3, 0xb4,
|
||||
0xbc, 0x29, 0x7b, 0x07, 0x16, 0xfb, 0xc4, 0xf5, 0xcd, 0x21, 0xde, 0x65, 0xbb, 0xf6, 0xd8, 0xe6,
|
||||
0x37, 0x41, 0x61, 0x18, 0xf9, 0x6f, 0xf6, 0xad, 0xfd, 0x7b, 0x09, 0x16, 0x1e, 0xda, 0x23, 0x1c,
|
||||
0x9c, 0x06, 0x04, 0x8f, 0x0f, 0x59, 0x3c, 0x7d, 0x09, 0x6a, 0x94, 0x9b, 0x80, 0x98, 0x63, 0x4f,
|
||||
0xde, 0xa4, 0x45, 0x00, 0x2a, 0xa3, 0x80, 0x93, 0x96, 0x19, 0xb6, 0x9a, 0xcb, 0x64, 0x66, 0xa5,
|
||||
0xf9, 0x85, 0x00, 0xa1, 0xf7, 0x01, 0xc2, 0x00, 0x5b, 0xe2, 0xf6, 0xac, 0x92, 0x3a, 0x7a, 0x0e,
|
||||
0xd5, 0x3b, 0x0e, 0x8a, 0xc7, 0xaf, 0xd2, 0x3e, 0x80, 0xba, 0xed, 0xb8, 0x16, 0x66, 0x77, 0x1c,
|
||||
0x96, 0xc8, 0xbe, 0xf3, 0x47, 0x01, 0x47, 0x3c, 0x0c, 0xb0, 0xa5, 0xfd, 0x81, 0xf0, 0xc2, 0x52,
|
||||
0x78, 0x42, 0x07, 0x3b, 0xb0, 0xc8, 0x37, 0xf4, 0x71, 0xb4, 0x68, 0xa9, 0xe8, 0x38, 0xa4, 0x4d,
|
||||
0x09, 0x44, 0x6f, 0xd9, 0xe2, 0x54, 0x94, 0x23, 0xb4, 0xfb, 0x70, 0x21, 0x11, 0xf7, 0x9e, 0x27,
|
||||
0x5d, 0x7c, 0x94, 0xca, 0x35, 0x63, 0x03, 0x11, 0xc9, 0x9e, 0xb4, 0x8f, 0x82, 0x64, 0x2f, 0xe0,
|
||||
0xc9, 0x5e, 0xa0, 0xe9, 0xb0, 0x96, 0x48, 0x81, 0x13, 0x8c, 0x7c, 0x90, 0x3a, 0xe2, 0x2f, 0x17,
|
||||
0x10, 0x4b, 0x9d, 0xf5, 0xff, 0x53, 0x82, 0xe5, 0x3c, 0x84, 0xd7, 0x2c, 0xb6, 0xfc, 0xa4, 0xe0,
|
||||
0x4d, 0xc3, 0xdd, 0x89, 0xdc, 0xfc, 0x56, 0xca, 0x52, 0x8f, 0xa1, 0x93, 0x27, 0xbd, 0xac, 0x2a,
|
||||
0x2a, 0x67, 0x50, 0xc5, 0xff, 0x96, 0x95, 0xf2, 0x61, 0x97, 0x10, 0xdf, 0x3e, 0x0a, 0xa9, 0xf1,
|
||||
0x7e, 0x5f, 0x65, 0x80, 0x07, 0x51, 0x8a, 0xcb, 0xe5, 0x77, 0x23, 0x3b, 0x2a, 0x9e, 0x35, 0x37,
|
||||
0xcd, 0xdd, 0x4b, 0xa6, 0xb9, 0xbc, 0x30, 0x78, 0x7b, 0x22, 0x99, 0x37, 0xb6, 0xf6, 0xf3, 0xb2,
|
||||
0x04, 0xcd, 0xa4, 0x1e, 0xd0, 0x27, 0x00, 0x66, 0xc4, 0xb9, 0x30, 0xf9, 0x4b, 0x93, 0x56, 0xa7,
|
||||
0x2b, 0xf8, 0xe8, 0x1a, 0x54, 0x06, 0x5e, 0x28, 0x34, 0x12, 0xdf, 0x10, 0x6d, 0x79, 0x21, 0x77,
|
||||
0x00, 0xb4, 0x97, 0x06, 0xcd, 0xfc, 0xa6, 0x3f, 0xe3, 0xb9, 0x9e, 0x32, 0x30, 0x47, 0x15, 0x38,
|
||||
0xe8, 0x73, 0x68, 0x3e, 0xf7, 0x6d, 0x62, 0x1e, 0x8d, 0xb0, 0x31, 0x32, 0x4f, 0xb1, 0x2f, 0x3c,
|
||||
0x57, 0xb1, 0x97, 0x69, 0x48, 0xfc, 0x27, 0x14, 0x5d, 0x0b, 0xa1, 0x2a, 0xe7, 0x7f, 0x85, 0x47,
|
||||
0x7e, 0x0c, 0xab, 0x21, 0x45, 0x33, 0xd8, 0x6b, 0x03, 0xc7, 0x74, 0x5c, 0x23, 0xc0, 0xf4, 0x68,
|
||||
0x92, 0x2f, 0xfc, 0xf2, 0xbd, 0xe5, 0x32, 0x1b, 0xb4, 0xe5, 0xfa, 0xb8, 0x67, 0x3a, 0x6e, 0x9f,
|
||||
0x8f, 0xd0, 0xc6, 0x50, 0x57, 0x96, 0xf3, 0x8a, 0x99, 0x1f, 0xc0, 0xa2, 0xbc, 0x7b, 0x0b, 0x30,
|
||||
0x11, 0x7e, 0x7d, 0xd2, 0x9c, 0x0b, 0x02, 0xbd, 0x8f, 0x09, 0xf3, 0xee, 0xb7, 0x2e, 0x41, 0x55,
|
||||
0xfe, 0xc9, 0x02, 0xcd, 0x41, 0xe5, 0x60, 0x6b, 0xbf, 0x35, 0x45, 0x3f, 0x0e, 0xb7, 0xf7, 0x5b,
|
||||
0xa5, 0x5b, 0x63, 0x68, 0xa5, 0xff, 0x60, 0x80, 0x56, 0x61, 0x69, 0x5f, 0xdf, 0xdb, 0xef, 0x3e,
|
||||
0xea, 0x1e, 0xec, 0xee, 0xf5, 0x8c, 0x7d, 0x7d, 0xf7, 0xab, 0xee, 0xc1, 0x4e, 0x6b, 0x0a, 0x5d,
|
||||
0x85, 0xcb, 0x6a, 0xc7, 0xef, 0xef, 0xf5, 0x0f, 0x8c, 0x83, 0x3d, 0x63, 0x6b, 0xaf, 0x77, 0xd0,
|
||||
0xdd, 0xed, 0xed, 0xe8, 0xad, 0x12, 0xba, 0x0c, 0x6b, 0x2a, 0xca, 0x17, 0xbb, 0xdb, 0xbb, 0xfa,
|
||||
0xce, 0x16, 0xfd, 0xee, 0x3e, 0x69, 0x95, 0x6f, 0xdd, 0x87, 0x85, 0xd4, 0x83, 0x21, 0xb4, 0x08,
|
||||
0x8d, 0x7e, 0xb7, 0xb7, 0xfd, 0xc5, 0xde, 0x4f, 0x0d, 0x7d, 0xa7, 0xbb, 0xfd, 0xb3, 0xd6, 0x14,
|
||||
0x5a, 0x86, 0x96, 0x04, 0xf5, 0xf6, 0x0e, 0x38, 0xb4, 0x74, 0xeb, 0x9b, 0x94, 0x49, 0x62, 0x74,
|
||||
0x01, 0x16, 0xa3, 0xb9, 0x8d, 0x2d, 0x7d, 0xa7, 0x7b, 0xb0, 0xb3, 0xdd, 0x9a, 0x4a, 0x82, 0xf5,
|
||||
0xc3, 0x5e, 0x6f, 0xb7, 0xf7, 0xa8, 0x55, 0xa2, 0x54, 0x63, 0xf0, 0xce, 0x4f, 0x77, 0x29, 0x72,
|
||||
0x39, 0x89, 0x7c, 0xd8, 0x7b, 0xdc, 0xdb, 0xfb, 0x49, 0xaf, 0x55, 0xd9, 0xfc, 0xb7, 0x06, 0x34,
|
||||
0x65, 0xcc, 0x80, 0x7d, 0x76, 0x21, 0xfc, 0x19, 0xcc, 0xc9, 0xbf, 0xdb, 0xc4, 0xce, 0x2a, 0xf9,
|
||||
0xdf, 0xa0, 0x4e, 0x3b, 0xdb, 0x21, 0x62, 0xaf, 0x29, 0xb4, 0xcf, 0x62, 0x21, 0xe5, 0x71, 0xd6,
|
||||
0x65, 0x35, 0x3a, 0xc9, 0xbc, 0xfe, 0xea, 0xac, 0x17, 0x75, 0x47, 0x14, 0xfb, 0x34, 0x00, 0x52,
|
||||
0x1f, 0xd6, 0xa2, 0x75, 0x35, 0x4c, 0xc8, 0x3e, 0xd8, 0xed, 0x5c, 0x29, 0xec, 0x8f, 0x88, 0xfe,
|
||||
0x0c, 0x5a, 0xe9, 0x27, 0xb5, 0x28, 0x2e, 0x0a, 0x15, 0x3c, 0xd7, 0xed, 0x5c, 0x9d, 0x80, 0xa1,
|
||||
0x92, 0xce, 0x3c, 0x4b, 0xdd, 0x28, 0x7e, 0x58, 0x98, 0x21, 0x5d, 0xf4, 0x5a, 0x91, 0x8b, 0x22,
|
||||
0xf9, 0xa8, 0x0a, 0xa9, 0x8f, 0x41, 0x73, 0x1e, 0xd7, 0x29, 0xa2, 0xc8, 0x7f, 0x8d, 0xa5, 0x4d,
|
||||
0xa1, 0xaf, 0x60, 0x21, 0x75, 0x17, 0x88, 0xe2, 0x51, 0xf9, 0x37, 0x9b, 0x9d, 0x8d, 0x62, 0x84,
|
||||
0xa4, 0xde, 0xd4, 0x9b, 0xbe, 0x84, 0xde, 0x72, 0xae, 0x0f, 0x13, 0x7a, 0xcb, 0xbd, 0x22, 0x64,
|
||||
0xe6, 0x95, 0xb8, 0xcf, 0x53, 0xcc, 0x2b, 0xef, 0xf2, 0xb0, 0xb3, 0x5e, 0xd4, 0xad, 0x2e, 0x3f,
|
||||
0x75, 0x97, 0xa7, 0x2c, 0x3f, 0xff, 0x8a, 0xb0, 0xb3, 0x51, 0x8c, 0x90, 0xd6, 0x55, 0x7c, 0xb1,
|
||||
0x90, 0xd2, 0x55, 0xe6, 0x1e, 0x2b, 0xa5, 0xab, 0xec, 0x8d, 0x84, 0xd0, 0x55, 0xea, 0x86, 0xe0,
|
||||
0x4a, 0x61, 0x05, 0x35, 0xab, 0xab, 0xfc, 0xa2, 0xac, 0x36, 0x85, 0xbe, 0x85, 0x76, 0x51, 0x99,
|
||||
0x13, 0xc5, 0x31, 0xc2, 0x2b, 0xea, 0xb0, 0x9d, 0x9b, 0x67, 0xc0, 0x8c, 0xa6, 0xec, 0x42, 0x55,
|
||||
0xd6, 0x34, 0x51, 0xec, 0x50, 0x52, 0x85, 0xd4, 0xce, 0x5a, 0x4e, 0x4f, 0x44, 0xe2, 0x03, 0x98,
|
||||
0xa6, 0x50, 0xb4, 0x9c, 0x40, 0x92, 0x43, 0x2f, 0xa4, 0xa0, 0xd1, 0xb0, 0x8f, 0x61, 0x96, 0x17,
|
||||
0xe8, 0x50, 0x9c, 0x39, 0x25, 0xaa, 0x87, 0x9d, 0xd5, 0x0c, 0x3c, 0x1a, 0xfc, 0x25, 0xff, 0xd7,
|
||||
0x9f, 0xa8, 0xb4, 0xa1, 0x8b, 0x89, 0x3f, 0x88, 0x24, 0xeb, 0x79, 0x9d, 0x4b, 0xf9, 0x9d, 0xaa,
|
||||
0x89, 0xa4, 0xc2, 0x8f, 0xf5, 0xa2, 0xf8, 0x30, 0x63, 0x22, 0xf9, 0xf1, 0xa6, 0x36, 0x85, 0x0c,
|
||||
0x5e, 0xb4, 0x4a, 0x11, 0xd6, 0xf2, 0x6d, 0x2b, 0x41, 0xfc, 0xda, 0x44, 0x9c, 0x68, 0x82, 0x23,
|
||||
0x58, 0xca, 0x49, 0xbf, 0xd1, 0xb5, 0x94, 0xf2, 0xf3, 0x32, 0xff, 0xce, 0x5b, 0x93, 0x91, 0x54,
|
||||
0x15, 0x09, 0xf3, 0x5e, 0x51, 0x7d, 0x82, 0x62, 0xd5, 0xab, 0x19, 0xb8, 0x1c, 0xbc, 0xf9, 0xa7,
|
||||
0x15, 0x98, 0xe7, 0x45, 0x12, 0x71, 0xa6, 0x3d, 0x02, 0x88, 0xeb, 0x78, 0xa8, 0x93, 0x58, 0x66,
|
||||
0xa2, 0xa0, 0xd9, 0xb9, 0x98, 0xdb, 0xa7, 0x2a, 0x5f, 0x29, 0xc9, 0x29, 0xca, 0xcf, 0x16, 0xfa,
|
||||
0x14, 0xe5, 0xe7, 0x54, 0xf1, 0xb4, 0x29, 0xb4, 0x0d, 0xb5, 0xa8, 0x4e, 0x84, 0x94, 0xf2, 0x52,
|
||||
0xaa, 0xc8, 0xd5, 0xe9, 0xe4, 0x75, 0xa9, 0x1c, 0x29, 0xb5, 0x1f, 0x85, 0xa3, 0x6c, 0x45, 0x49,
|
||||
0xe1, 0x28, 0xaf, 0x5c, 0x14, 0xaf, 0x8e, 0xa7, 0xba, 0xe9, 0xd5, 0x25, 0xaa, 0x07, 0xe9, 0xd5,
|
||||
0x25, 0xb3, 0x63, 0x6d, 0xea, 0x8b, 0x4b, 0xbf, 0xfa, 0xcd, 0x7a, 0xe9, 0x3f, 0x7e, 0xb3, 0x3e,
|
||||
0xf5, 0x27, 0x2f, 0xd7, 0x4b, 0xbf, 0x7a, 0xb9, 0x5e, 0xfa, 0xd7, 0x97, 0xeb, 0xa5, 0xff, 0x7a,
|
||||
0xb9, 0x5e, 0xfa, 0xc5, 0x7f, 0xaf, 0x4f, 0x1d, 0xcd, 0xb2, 0xbf, 0xc1, 0xbe, 0xff, 0xff, 0x01,
|
||||
0x00, 0x00, 0xff, 0xff, 0x61, 0x12, 0x07, 0xa4, 0xba, 0x3c, 0x00, 0x00,
|
||||
0x94, 0xb6, 0x29, 0xcd, 0xee, 0x66, 0x03, 0x74, 0x5a, 0xec, 0x12, 0xd5, 0x33, 0x64, 0x77, 0x4f,
|
||||
0x77, 0xb5, 0x6d, 0x05, 0x39, 0x24, 0x97, 0x20, 0x97, 0x00, 0x9b, 0x63, 0x6e, 0x39, 0x04, 0x58,
|
||||
0xe4, 0x92, 0x43, 0x0e, 0x41, 0x7e, 0x41, 0xb0, 0x97, 0x05, 0x02, 0x04, 0x08, 0x92, 0x5b, 0xd6,
|
||||
0x39, 0xe4, 0x10, 0x20, 0xbf, 0x61, 0x51, 0x5f, 0xdd, 0xd5, 0x5f, 0xb4, 0xe4, 0x19, 0xec, 0xfa,
|
||||
0xc4, 0xae, 0x57, 0xaf, 0x5e, 0xbd, 0x7a, 0xef, 0xd5, 0xab, 0xf7, 0x5e, 0x15, 0xa1, 0x66, 0x7a,
|
||||
0xf6, 0x1d, 0xcf, 0x77, 0x89, 0x8b, 0xe6, 0xfc, 0xd0, 0x21, 0xf6, 0x18, 0x77, 0x6e, 0x0f, 0x6d,
|
||||
0x72, 0x12, 0x1e, 0xdd, 0x19, 0xb8, 0xe3, 0x77, 0x87, 0xee, 0xd0, 0x7d, 0x97, 0xf5, 0x1f, 0x85,
|
||||
0xc7, 0xac, 0xc5, 0x1a, 0xec, 0x8b, 0x8f, 0xd3, 0x6e, 0x41, 0xf3, 0x2b, 0xec, 0x07, 0xb6, 0xeb,
|
||||
0xe8, 0xf8, 0xdb, 0x10, 0x07, 0x04, 0xb5, 0x61, 0xee, 0x19, 0x87, 0xb4, 0x4b, 0x1b, 0xa5, 0x1b,
|
||||
0x35, 0x5d, 0x36, 0xb5, 0x5f, 0x96, 0x60, 0x21, 0x42, 0x0e, 0x3c, 0xd7, 0x09, 0x70, 0x31, 0x36,
|
||||
0xba, 0x0a, 0xf3, 0x82, 0x27, 0xc3, 0x31, 0xc7, 0xb8, 0x5d, 0x66, 0xdd, 0x75, 0x01, 0xeb, 0x99,
|
||||
0x63, 0x8c, 0xde, 0x81, 0x05, 0x89, 0x22, 0x89, 0x54, 0x18, 0x56, 0x53, 0x80, 0xc5, 0x6c, 0xe8,
|
||||
0x0e, 0x2c, 0x49, 0x44, 0xd3, 0xb3, 0x23, 0xe4, 0x69, 0x86, 0xbc, 0x28, 0xba, 0xba, 0x9e, 0x2d,
|
||||
0xf0, 0xb5, 0x9f, 0x43, 0x6d, 0xbb, 0xd7, 0xdf, 0x72, 0x9d, 0x63, 0x7b, 0x48, 0x59, 0x0c, 0xb0,
|
||||
0x4f, 0xc7, 0xb4, 0x4b, 0x1b, 0x15, 0xca, 0xa2, 0x68, 0xa2, 0x0e, 0x54, 0x03, 0x6c, 0xfa, 0x83,
|
||||
0x13, 0x1c, 0xb4, 0xcb, 0xac, 0x2b, 0x6a, 0xd3, 0x51, 0xae, 0x47, 0x6c, 0xd7, 0x09, 0xda, 0x15,
|
||||
0x3e, 0x4a, 0x34, 0xb5, 0xbf, 0x2d, 0x41, 0x7d, 0xdf, 0xf5, 0xc9, 0x53, 0xd3, 0xf3, 0x6c, 0x67,
|
||||
0x88, 0x6e, 0x43, 0x95, 0xc9, 0x72, 0xe0, 0x8e, 0x98, 0x0c, 0x9a, 0x9b, 0x8b, 0x77, 0x04, 0x4b,
|
||||
0x77, 0xf6, 0x45, 0x87, 0x1e, 0xa1, 0xa0, 0xeb, 0xd0, 0x1c, 0xb8, 0x0e, 0x31, 0x6d, 0x07, 0xfb,
|
||||
0x86, 0xe7, 0xfa, 0x84, 0x49, 0x66, 0x46, 0x6f, 0x44, 0x50, 0x4a, 0x1c, 0x5d, 0x84, 0xda, 0x89,
|
||||
0x1b, 0x10, 0x8e, 0x51, 0x61, 0x18, 0x55, 0x0a, 0x60, 0x9d, 0xab, 0x30, 0xc7, 0x3a, 0x6d, 0x4f,
|
||||
0xc8, 0x60, 0x96, 0x36, 0x77, 0x3d, 0xed, 0xd7, 0x25, 0x98, 0x79, 0xea, 0x86, 0x0e, 0x49, 0x4d,
|
||||
0x63, 0x92, 0x13, 0xa1, 0x1f, 0x65, 0x1a, 0x93, 0x9c, 0xc4, 0xd3, 0x50, 0x0c, 0xae, 0x22, 0x3e,
|
||||
0x0d, 0xed, 0xec, 0x40, 0xd5, 0xc7, 0xa6, 0xe5, 0x3a, 0xa3, 0x53, 0xc6, 0x42, 0x55, 0x8f, 0xda,
|
||||
0x54, 0x77, 0x01, 0x1e, 0xd9, 0x4e, 0xf8, 0xc2, 0xf0, 0xf1, 0xc8, 0x3c, 0xc2, 0x23, 0xc6, 0x4a,
|
||||
0x55, 0x6f, 0x0a, 0xb0, 0xce, 0xa1, 0xe8, 0x63, 0xa8, 0x7b, 0xbe, 0xeb, 0x99, 0x43, 0x93, 0x8a,
|
||||
0xaf, 0x3d, 0xc3, 0x24, 0xb4, 0x16, 0x49, 0x88, 0x71, 0xbb, 0x1f, 0x23, 0xe8, 0x2a, 0xb6, 0xf6,
|
||||
0x35, 0x2c, 0x50, 0x4b, 0x09, 0x3c, 0x73, 0x80, 0xf7, 0x98, 0xfc, 0xa9, 0x5d, 0x31, 0x8e, 0x1d,
|
||||
0x4c, 0x9e, 0xbb, 0xfe, 0x37, 0x6c, 0x59, 0x55, 0xbd, 0x4e, 0x61, 0x3d, 0x0e, 0x42, 0x6b, 0x50,
|
||||
0xe5, 0x8b, 0xb2, 0x2d, 0xb6, 0xa6, 0xaa, 0xce, 0xc4, 0xb5, 0x6f, 0x5b, 0x51, 0x97, 0xed, 0x0d,
|
||||
0xc4, 0x92, 0xe6, 0xb8, 0xe8, 0x06, 0x9a, 0x06, 0xb0, 0xeb, 0x90, 0x7b, 0x3f, 0xfa, 0xca, 0x1c,
|
||||
0x85, 0x18, 0x2d, 0xc3, 0xcc, 0x33, 0xfa, 0xc1, 0xe8, 0x57, 0x74, 0xde, 0xd0, 0xfe, 0xb2, 0x02,
|
||||
0x17, 0x9f, 0xd0, 0xd5, 0xf5, 0x4d, 0xc7, 0x3a, 0x72, 0x5f, 0xf4, 0xf1, 0x20, 0xf4, 0x6d, 0x72,
|
||||
0xba, 0xe5, 0x3a, 0x04, 0xbf, 0x20, 0x68, 0x07, 0x16, 0x1d, 0xc9, 0xaf, 0x21, 0xed, 0x87, 0x52,
|
||||
0xa8, 0x6f, 0xb6, 0xa3, 0x25, 0xa7, 0x56, 0xa4, 0xb7, 0x9c, 0x24, 0x20, 0x40, 0x9f, 0xc7, 0xc2,
|
||||
0x95, 0x44, 0xca, 0x8c, 0xc8, 0x4a, 0x44, 0xa4, 0xbf, 0xc3, 0xf8, 0x10, 0x24, 0xa4, 0xd0, 0x25,
|
||||
0x81, 0xf7, 0x81, 0x6e, 0x34, 0xc3, 0x0c, 0x8c, 0x30, 0xc0, 0x3e, 0x5b, 0x69, 0x7d, 0x73, 0x29,
|
||||
0x1a, 0x1c, 0xaf, 0x53, 0xaf, 0xf9, 0xa1, 0xd3, 0x0d, 0x0e, 0x03, 0xec, 0xb3, 0xed, 0x28, 0xd4,
|
||||
0x6b, 0xf8, 0xae, 0x4b, 0x8e, 0x03, 0xa9, 0x52, 0x09, 0xd6, 0x19, 0x14, 0xbd, 0x0b, 0x4b, 0x41,
|
||||
0xe8, 0x79, 0x23, 0x3c, 0xc6, 0x0e, 0x31, 0x47, 0xc6, 0xd0, 0x77, 0x43, 0x2f, 0x68, 0xcf, 0x6c,
|
||||
0x54, 0x6e, 0x54, 0x74, 0xa4, 0x76, 0x3d, 0x62, 0x3d, 0x68, 0x1d, 0xc0, 0xf3, 0xed, 0x67, 0xf6,
|
||||
0x08, 0x0f, 0xb1, 0xd5, 0x9e, 0x65, 0x44, 0x15, 0x08, 0xba, 0x0b, 0xcb, 0x01, 0x1e, 0x0c, 0xdc,
|
||||
0xb1, 0x67, 0x78, 0xbe, 0x7b, 0x6c, 0x8f, 0x30, 0x37, 0xc8, 0x39, 0x66, 0x90, 0x48, 0xf4, 0xed,
|
||||
0xf3, 0x2e, 0x6a, 0x9a, 0xda, 0x2f, 0xca, 0x70, 0x81, 0x09, 0x60, 0xdf, 0xb5, 0x84, 0x2e, 0xc4,
|
||||
0x76, 0xbf, 0x06, 0x8d, 0x01, 0x63, 0xc8, 0xf0, 0x4c, 0x1f, 0x3b, 0x44, 0xd8, 0xfd, 0x3c, 0x07,
|
||||
0xee, 0x33, 0x18, 0xda, 0x83, 0x56, 0x20, 0x54, 0x67, 0x0c, 0xb8, 0xee, 0x84, 0x84, 0xdf, 0x8a,
|
||||
0x84, 0x34, 0x41, 0xcf, 0xfa, 0x42, 0x90, 0x51, 0xfc, 0x5c, 0x70, 0x1a, 0x0c, 0xc8, 0x88, 0xbb,
|
||||
0x8b, 0xfa, 0xe6, 0x0f, 0x92, 0x74, 0xd2, 0x6c, 0xde, 0xe9, 0x73, 0xec, 0x1d, 0x87, 0xf8, 0xa7,
|
||||
0xba, 0x1c, 0xdb, 0xb9, 0x0f, 0xf3, 0x6a, 0x07, 0x6a, 0x41, 0xe5, 0x1b, 0x7c, 0x2a, 0x96, 0x40,
|
||||
0x3f, 0x63, 0xbb, 0xe4, 0x9b, 0x95, 0x37, 0xee, 0x97, 0xff, 0xa0, 0xa4, 0xf9, 0x80, 0xe2, 0x59,
|
||||
0x9e, 0x62, 0x62, 0x5a, 0x26, 0x31, 0x11, 0x82, 0x69, 0xe6, 0x7e, 0x39, 0x09, 0xf6, 0x4d, 0xa9,
|
||||
0x86, 0x62, 0x6b, 0xd4, 0x74, 0xfa, 0x89, 0x2e, 0x41, 0x2d, 0x32, 0x42, 0xe1, 0x83, 0x63, 0x00,
|
||||
0xf5, 0x85, 0x26, 0x21, 0x78, 0xec, 0x11, 0x66, 0x10, 0x0d, 0x5d, 0x36, 0xb5, 0x7f, 0x99, 0x86,
|
||||
0x56, 0x46, 0x03, 0x1f, 0x42, 0x75, 0x2c, 0xa6, 0x17, 0xb6, 0x7f, 0x31, 0x76, 0x88, 0x19, 0x0e,
|
||||
0xf5, 0x08, 0x99, 0xfa, 0x1b, 0xba, 0x19, 0x95, 0xe3, 0x22, 0x6a, 0x53, 0xb5, 0x8e, 0xdc, 0xa1,
|
||||
0x61, 0xd9, 0x3e, 0x1e, 0x10, 0xd7, 0x3f, 0x15, 0x5c, 0xce, 0x8f, 0xdc, 0xe1, 0xb6, 0x84, 0xa1,
|
||||
0xf7, 0x00, 0x2c, 0x27, 0xa0, 0x1a, 0x3d, 0xb6, 0x87, 0x8c, 0xd7, 0xfa, 0x26, 0x8a, 0xe6, 0x8e,
|
||||
0x8e, 0x04, 0xbd, 0x66, 0x39, 0x81, 0x60, 0xf6, 0x23, 0x68, 0x50, 0x17, 0x6b, 0x8c, 0xb9, 0x37,
|
||||
0xe7, 0x56, 0x5c, 0xdf, 0x5c, 0x56, 0x38, 0x8e, 0x5c, 0xbd, 0x3e, 0xef, 0xc5, 0x8d, 0x00, 0x7d,
|
||||
0x0a, 0xb3, 0xcc, 0xc5, 0x05, 0xed, 0x59, 0x36, 0xe6, 0x7a, 0xce, 0x2a, 0x85, 0xb6, 0x9f, 0x30,
|
||||
0x3c, 0xae, 0x6c, 0x31, 0x08, 0x3d, 0x81, 0xba, 0xe9, 0x38, 0x2e, 0x31, 0xf9, 0x06, 0x9f, 0x63,
|
||||
0x34, 0x6e, 0x15, 0xd3, 0xe8, 0xc6, 0xc8, 0x9c, 0x90, 0x3a, 0x1c, 0xfd, 0x08, 0x66, 0x98, 0x07,
|
||||
0x68, 0x57, 0xd9, 0xaa, 0xd7, 0x27, 0x9b, 0x9f, 0xce, 0x91, 0x3b, 0x1f, 0x41, 0x5d, 0x61, 0xed,
|
||||
0x3c, 0xe6, 0xd6, 0xf9, 0x0c, 0x5a, 0x69, 0x8e, 0xce, 0x65, 0xae, 0xbb, 0xb0, 0xac, 0x87, 0x4e,
|
||||
0xcc, 0x98, 0x8c, 0x3f, 0xde, 0x83, 0x59, 0xa1, 0x3f, 0x6e, 0x3b, 0x6b, 0x85, 0x12, 0xd1, 0x05,
|
||||
0xa2, 0xf6, 0x29, 0x5c, 0x48, 0x91, 0x12, 0xd1, 0xc9, 0x5b, 0xd0, 0xf4, 0x5c, 0xcb, 0x08, 0x38,
|
||||
0xd8, 0xb0, 0x2d, 0xe9, 0x0c, 0xbc, 0x08, 0x77, 0xd7, 0xa2, 0xc3, 0xfb, 0xc4, 0xf5, 0xb2, 0xac,
|
||||
0x9c, 0x6d, 0x78, 0x1b, 0x56, 0xd2, 0xc3, 0xf9, 0xf4, 0xda, 0xe7, 0xb0, 0xaa, 0xe3, 0xb1, 0xfb,
|
||||
0x0c, 0xbf, 0x2e, 0xe9, 0x0e, 0xb4, 0xb3, 0x04, 0x62, 0xe2, 0x31, 0xb4, 0x4f, 0x4c, 0x12, 0x06,
|
||||
0xe7, 0x23, 0x7e, 0x53, 0x25, 0x20, 0x8e, 0x4e, 0x4e, 0x07, 0x35, 0xa1, 0x6c, 0x7b, 0x62, 0x50,
|
||||
0xd9, 0xf6, 0xb4, 0xcf, 0xa1, 0x16, 0x1d, 0x5a, 0x68, 0x33, 0x8e, 0x8c, 0xca, 0xaf, 0x38, 0xd9,
|
||||
0xa2, 0x98, 0xe9, 0x71, 0xc6, 0x5b, 0x8b, 0x99, 0x36, 0x01, 0x22, 0x3f, 0x23, 0x4f, 0x4a, 0x94,
|
||||
0xa5, 0xa7, 0x2b, 0x58, 0xda, 0xdf, 0x27, 0x9c, 0x8e, 0xc2, 0xb2, 0x15, 0xb1, 0x6c, 0x25, 0x9c,
|
||||
0x50, 0xf9, 0x3c, 0x4e, 0xe8, 0x0e, 0xcc, 0x04, 0xc4, 0x24, 0xdc, 0x0d, 0x36, 0x95, 0xc5, 0x25,
|
||||
0xa7, 0xc4, 0x3a, 0x47, 0x43, 0x97, 0x01, 0x06, 0x3e, 0x36, 0x09, 0xb6, 0x0c, 0x93, 0xfb, 0xc7,
|
||||
0x8a, 0x5e, 0x13, 0x90, 0x2e, 0x41, 0xf7, 0x61, 0x4e, 0x46, 0x2a, 0x33, 0x8c, 0x8d, 0x8d, 0x1c,
|
||||
0x82, 0x09, 0xe9, 0xeb, 0x72, 0x40, 0xbc, 0xa7, 0x67, 0x27, 0xef, 0x69, 0x31, 0x8e, 0x23, 0x2b,
|
||||
0x6e, 0x69, 0xae, 0xd0, 0x2d, 0xf1, 0x11, 0x67, 0x71, 0x4b, 0xd5, 0x42, 0xb7, 0x24, 0x68, 0x4c,
|
||||
0x74, 0x4b, 0xbf, 0x4f, 0x07, 0xf3, 0x14, 0xda, 0xd9, 0x0d, 0x22, 0x1c, 0xc3, 0x7b, 0x30, 0x1b,
|
||||
0x30, 0xc8, 0x04, 0x27, 0x23, 0x86, 0x08, 0x44, 0xed, 0x21, 0x2c, 0xa7, 0x2c, 0x80, 0x07, 0x8a,
|
||||
0x91, 0xbd, 0x94, 0xce, 0x64, 0x2f, 0xda, 0xff, 0x97, 0x54, 0xeb, 0x7d, 0x68, 0x8f, 0x08, 0xf6,
|
||||
0x33, 0xd6, 0xfb, 0xbe, 0x24, 0xca, 0x4d, 0xf7, 0x72, 0x11, 0x51, 0x1e, 0xc3, 0x09, 0x4b, 0xec,
|
||||
0x43, 0x93, 0xe9, 0xd0, 0x08, 0xf0, 0x88, 0x1d, 0x88, 0x22, 0x14, 0xf9, 0x61, 0xce, 0x68, 0x3e,
|
||||
0x2f, 0x37, 0x80, 0xbe, 0x40, 0xe7, 0xea, 0x6b, 0x8c, 0x54, 0x58, 0xe7, 0x01, 0xa0, 0x2c, 0xd2,
|
||||
0xb9, 0xf4, 0xf0, 0x25, 0xdd, 0xfb, 0x34, 0x71, 0xc9, 0xf1, 0xf4, 0xc7, 0x8c, 0x8d, 0x09, 0x4a,
|
||||
0xe0, 0x7c, 0xea, 0x02, 0x51, 0xfb, 0xbb, 0x0a, 0x40, 0xdc, 0xf9, 0xc6, 0x6e, 0xfa, 0x0f, 0xa3,
|
||||
0x2d, 0xc8, 0xa3, 0x89, 0x2b, 0x39, 0xf4, 0x72, 0x37, 0xdf, 0xc3, 0xe4, 0xe6, 0xe3, 0x71, 0xc5,
|
||||
0x5b, 0x79, 0xa3, 0xdf, 0xd8, 0x6d, 0xb7, 0x05, 0x2b, 0x69, 0x75, 0x8b, 0x4d, 0x77, 0x13, 0x66,
|
||||
0x6c, 0x82, 0xc7, 0x3c, 0x0d, 0x57, 0xd3, 0x11, 0x05, 0x97, 0x63, 0x68, 0x57, 0xa1, 0xb6, 0x3b,
|
||||
0x36, 0x87, 0xb8, 0xef, 0xe1, 0x01, 0x9d, 0xcb, 0xa6, 0x0d, 0x31, 0x3f, 0x6f, 0x68, 0x9b, 0x50,
|
||||
0x7d, 0x8c, 0x4f, 0xf9, 0x1e, 0x3c, 0x23, 0x7f, 0xda, 0x5f, 0x97, 0x61, 0x95, 0xf9, 0xce, 0x2d,
|
||||
0x99, 0x04, 0xeb, 0x38, 0x70, 0x43, 0x7f, 0x80, 0x03, 0xa6, 0x52, 0x2f, 0x34, 0x3c, 0xec, 0xdb,
|
||||
0xae, 0x25, 0xb2, 0xbe, 0xda, 0xc0, 0x0b, 0xf7, 0x19, 0x80, 0x26, 0xca, 0xb4, 0xfb, 0xdb, 0xd0,
|
||||
0x15, 0xb6, 0x55, 0xd1, 0xab, 0x03, 0x2f, 0xfc, 0x31, 0x6d, 0xcb, 0xb1, 0xc1, 0x89, 0xe9, 0xe3,
|
||||
0x80, 0xd9, 0x10, 0x1f, 0xdb, 0x67, 0x00, 0xf4, 0x1e, 0x5c, 0x18, 0xe3, 0xb1, 0xeb, 0x9f, 0x1a,
|
||||
0x23, 0x7b, 0x6c, 0x13, 0xc3, 0x76, 0x8c, 0xa3, 0x53, 0x82, 0x03, 0x61, 0x38, 0x88, 0x77, 0x3e,
|
||||
0xa1, 0x7d, 0xbb, 0xce, 0x17, 0xb4, 0x07, 0x69, 0xd0, 0x70, 0xdd, 0xb1, 0x11, 0x0c, 0x5c, 0x1f,
|
||||
0x1b, 0xa6, 0xf5, 0x35, 0x3b, 0x3c, 0x2a, 0x7a, 0xdd, 0x75, 0xc7, 0x7d, 0x0a, 0xeb, 0x5a, 0x5f,
|
||||
0xa3, 0x2b, 0x50, 0x1f, 0x78, 0x61, 0x80, 0x89, 0x41, 0x7f, 0xd8, 0x21, 0x51, 0xd3, 0x81, 0x83,
|
||||
0xb6, 0xbc, 0x30, 0x50, 0x10, 0xc6, 0x54, 0xec, 0x73, 0x2a, 0xc2, 0x53, 0x2a, 0x66, 0x13, 0x1a,
|
||||
0x89, 0x3c, 0x92, 0x66, 0x0b, 0x2c, 0x61, 0x14, 0xd9, 0x02, 0xfd, 0xa6, 0x30, 0xdf, 0x1d, 0x49,
|
||||
0x49, 0xb2, 0x6f, 0x0a, 0x23, 0xa7, 0x9e, 0x4c, 0x15, 0xd8, 0x37, 0x15, 0xf9, 0x08, 0x3f, 0x13,
|
||||
0x75, 0x80, 0x9a, 0xce, 0x1b, 0x9a, 0x05, 0xb0, 0x65, 0x7a, 0xe6, 0x91, 0x3d, 0xb2, 0xc9, 0x29,
|
||||
0xba, 0x09, 0x2d, 0xd3, 0xb2, 0x8c, 0x81, 0x84, 0xd8, 0x58, 0x16, 0x65, 0x16, 0x4c, 0xcb, 0xda,
|
||||
0x52, 0xc0, 0xe8, 0x07, 0xb0, 0x68, 0xf9, 0xae, 0x97, 0xc4, 0xe5, 0x55, 0x9a, 0x16, 0xed, 0x50,
|
||||
0x91, 0xb5, 0x7f, 0x9e, 0x86, 0xcb, 0x49, 0xc5, 0xa6, 0x33, 0xf3, 0x0f, 0x61, 0x3e, 0x35, 0x6b,
|
||||
0x32, 0x25, 0x8e, 0x99, 0xd4, 0x13, 0x88, 0xa9, 0xdc, 0xb5, 0x9c, 0xc9, 0x5d, 0x73, 0x53, 0xfe,
|
||||
0xca, 0xf7, 0x91, 0xf2, 0x4f, 0x7f, 0x97, 0x94, 0x7f, 0xe6, 0x4c, 0x29, 0xff, 0xdb, 0xac, 0x02,
|
||||
0x27, 0x07, 0xb1, 0xc4, 0x8b, 0x9b, 0x51, 0x23, 0xc2, 0x71, 0x64, 0xa5, 0x2e, 0x55, 0x1a, 0x98,
|
||||
0x3b, 0x4f, 0x69, 0xa0, 0x5a, 0x58, 0x1a, 0xa0, 0x16, 0xe1, 0x79, 0xa6, 0x3f, 0x76, 0x7d, 0x99,
|
||||
0xfb, 0xb7, 0x6b, 0x8c, 0x85, 0x05, 0x09, 0x17, 0x79, 0x7f, 0x61, 0x95, 0x00, 0x8a, 0xaa, 0x04,
|
||||
0x68, 0x03, 0xe6, 0x1d, 0xd7, 0x70, 0xf0, 0x73, 0x83, 0x2a, 0x2c, 0x68, 0xd7, 0xb9, 0xf6, 0x1c,
|
||||
0xb7, 0x87, 0x9f, 0xef, 0x53, 0x88, 0xf6, 0x0f, 0x25, 0x58, 0x4e, 0x1a, 0x8e, 0xc8, 0x0b, 0x3f,
|
||||
0x83, 0x9a, 0x2f, 0x7d, 0x83, 0x30, 0x96, 0x8d, 0x64, 0xfc, 0x95, 0xf5, 0x21, 0x7a, 0x3c, 0x04,
|
||||
0xfd, 0xb8, 0xb0, 0xc2, 0xf0, 0x76, 0x01, 0x99, 0x57, 0xd5, 0x18, 0xb4, 0x2e, 0x2c, 0x46, 0xc8,
|
||||
0x13, 0xf3, 0x7b, 0x25, 0x5f, 0x2f, 0x27, 0xf3, 0x75, 0x07, 0x66, 0xb7, 0xf1, 0x33, 0x7b, 0x80,
|
||||
0xbf, 0x97, 0xfa, 0xe0, 0x06, 0xd4, 0x3d, 0xec, 0x8f, 0xed, 0x20, 0x88, 0x8c, 0xbe, 0xa6, 0xab,
|
||||
0x20, 0xed, 0xbf, 0x66, 0x60, 0x21, 0x2d, 0xd9, 0x7b, 0x99, 0xf2, 0x40, 0x27, 0xde, 0x85, 0xe9,
|
||||
0xf5, 0x29, 0x67, 0xf4, 0x0d, 0x79, 0x0c, 0x94, 0x53, 0x59, 0x42, 0x74, 0x52, 0x88, 0xa3, 0x81,
|
||||
0xae, 0x7f, 0xe0, 0x8e, 0xc7, 0xa6, 0x63, 0xc9, 0xda, 0xad, 0x68, 0x52, 0x69, 0x99, 0xfe, 0x90,
|
||||
0x6e, 0x2d, 0x0a, 0x66, 0xdf, 0xd4, 0x4b, 0xd2, 0x68, 0xdb, 0x76, 0x58, 0x75, 0x81, 0x6d, 0x9c,
|
||||
0x9a, 0x0e, 0x02, 0xb4, 0x6d, 0xfb, 0xe8, 0x3a, 0x4c, 0x63, 0xe7, 0x99, 0x3c, 0x8d, 0xe3, 0xe2,
|
||||
0xae, 0x3c, 0x7e, 0x74, 0xd6, 0x8d, 0xde, 0x86, 0xd9, 0xb1, 0x1b, 0x3a, 0x44, 0xc6, 0xdd, 0xcd,
|
||||
0x64, 0x8d, 0x53, 0x17, 0xbd, 0xe8, 0x26, 0xcc, 0x59, 0x4c, 0x07, 0x32, 0xb8, 0x5e, 0x88, 0x2b,
|
||||
0x14, 0x0c, 0xae, 0xcb, 0x7e, 0xf4, 0x49, 0x14, 0x47, 0xd4, 0x52, 0x91, 0x40, 0x4a, 0xa8, 0xb9,
|
||||
0xc1, 0xc4, 0xe3, 0x64, 0x30, 0x01, 0x8c, 0xc4, 0xcd, 0x42, 0x12, 0x93, 0xeb, 0x0b, 0x6b, 0x50,
|
||||
0x1d, 0xb9, 0x43, 0x6e, 0x07, 0x75, 0x5e, 0xe9, 0x1f, 0xb9, 0x43, 0x66, 0x06, 0xcb, 0x34, 0x78,
|
||||
0xb2, 0x6c, 0xa7, 0x3d, 0xcf, 0xb6, 0x17, 0x6f, 0xd0, 0x33, 0x91, 0x7d, 0x18, 0xae, 0x33, 0xc0,
|
||||
0xed, 0x06, 0xeb, 0xaa, 0x31, 0xc8, 0x9e, 0x33, 0x60, 0x47, 0x36, 0x21, 0xa7, 0xed, 0x26, 0x83,
|
||||
0xd3, 0x4f, 0x1a, 0xf3, 0xf2, 0x6c, 0x67, 0x21, 0x15, 0xf3, 0xe6, 0xed, 0xcf, 0x37, 0xa0, 0x80,
|
||||
0xf1, 0x4f, 0x25, 0x58, 0xd9, 0x62, 0x21, 0x9f, 0xe2, 0x09, 0xce, 0x91, 0x80, 0xa3, 0xbb, 0x51,
|
||||
0xa5, 0x23, 0x9d, 0x47, 0xa7, 0x17, 0x2b, 0xf0, 0xd0, 0x03, 0x68, 0x4a, 0x9a, 0x62, 0x64, 0xe5,
|
||||
0x55, 0x35, 0x92, 0x46, 0xa0, 0x36, 0xb5, 0x4f, 0x60, 0x35, 0xc3, 0xb3, 0x08, 0xcf, 0xae, 0xc2,
|
||||
0x7c, 0xec, 0x11, 0x22, 0x96, 0xeb, 0x11, 0x6c, 0xd7, 0xd2, 0xee, 0xc3, 0x85, 0x3e, 0x31, 0x7d,
|
||||
0x92, 0x59, 0xf0, 0x19, 0xc6, 0xb2, 0x32, 0x49, 0x72, 0xac, 0xa8, 0x64, 0xf4, 0x61, 0xb9, 0x4f,
|
||||
0x5c, 0xef, 0x35, 0x88, 0xd2, 0x9d, 0x4e, 0x97, 0xed, 0x86, 0x44, 0xc4, 0x64, 0xb2, 0xa9, 0xad,
|
||||
0xf2, 0xa2, 0x4e, 0x76, 0xb6, 0x8f, 0x61, 0x85, 0xd7, 0x54, 0x5e, 0x67, 0x11, 0x6b, 0xb2, 0xa2,
|
||||
0x93, 0xa5, 0xbb, 0x0d, 0x4b, 0xb1, 0x2b, 0x8f, 0xd3, 0xc3, 0xdb, 0xc9, 0xf4, 0x70, 0x35, 0xab,
|
||||
0xe3, 0x44, 0x76, 0xf8, 0x37, 0x65, 0xc5, 0x61, 0x16, 0x24, 0x87, 0x9b, 0xc9, 0xe4, 0xf0, 0x52,
|
||||
0x01, 0xc9, 0x44, 0x6e, 0x98, 0xb5, 0xc8, 0x4a, 0x8e, 0x45, 0xea, 0x99, 0x0c, 0x72, 0x3a, 0x55,
|
||||
0xcc, 0x4e, 0xf1, 0xf6, 0x3b, 0x49, 0x20, 0x77, 0x79, 0x02, 0x19, 0x4d, 0x1d, 0xd5, 0xb9, 0xee,
|
||||
0xa6, 0x12, 0xc8, 0x76, 0x11, 0x9b, 0x51, 0xfe, 0xf8, 0x57, 0xd3, 0x50, 0x8b, 0xfa, 0x32, 0x82,
|
||||
0xcd, 0x0a, 0xa9, 0x9c, 0x23, 0x24, 0xf5, 0xfc, 0xaa, 0xbc, 0xce, 0xf9, 0x35, 0xfd, 0xaa, 0xf3,
|
||||
0xeb, 0x22, 0xd4, 0xd8, 0x87, 0xe1, 0xe3, 0x63, 0x71, 0x1e, 0x55, 0x19, 0x40, 0xc7, 0xc7, 0xb1,
|
||||
0x41, 0xcd, 0x9e, 0xc5, 0xa0, 0x52, 0x99, 0xea, 0x5c, 0x3a, 0x53, 0xbd, 0x17, 0x9d, 0x30, 0xfc,
|
||||
0x2c, 0x5a, 0xcf, 0x92, 0xcb, 0x3d, 0x5b, 0x76, 0x92, 0x67, 0x0b, 0x3f, 0x9e, 0xae, 0xe5, 0x0c,
|
||||
0x7e, 0x63, 0xf3, 0xd4, 0x27, 0x3c, 0x4f, 0x55, 0xad, 0x4a, 0x38, 0xc2, 0x4d, 0x80, 0x68, 0xcf,
|
||||
0xcb, 0x64, 0x15, 0x65, 0x97, 0xa6, 0x2b, 0x58, 0xd4, 0xab, 0x24, 0xe4, 0x1f, 0x17, 0x63, 0xcf,
|
||||
0xe0, 0x55, 0xfe, 0x55, 0x8d, 0x92, 0x0a, 0xea, 0x99, 0xf7, 0x32, 0xa5, 0x8d, 0xb3, 0x59, 0xdd,
|
||||
0xed, 0x64, 0x65, 0xe3, 0x7c, 0xe6, 0x92, 0x29, 0x6c, 0xb0, 0x43, 0xdd, 0xf4, 0x45, 0x37, 0xcf,
|
||||
0x49, 0x6b, 0x02, 0xd2, 0x25, 0x34, 0x94, 0x3a, 0xb6, 0x1d, 0x3b, 0x38, 0xe1, 0xfd, 0xb3, 0xac,
|
||||
0x1f, 0x24, 0xa8, 0xcb, 0x6e, 0xb5, 0xf1, 0x0b, 0x9b, 0x18, 0x03, 0xd7, 0xc2, 0xcc, 0x18, 0x67,
|
||||
0xf4, 0x2a, 0x05, 0x6c, 0xb9, 0x16, 0x8e, 0x37, 0x48, 0xf5, 0x5c, 0x1b, 0xa4, 0x96, 0xda, 0x20,
|
||||
0x2b, 0x30, 0xeb, 0x63, 0x33, 0x70, 0x1d, 0x91, 0x18, 0x88, 0x16, 0x3d, 0x2b, 0xc6, 0x38, 0x08,
|
||||
0xe8, 0x04, 0x22, 0x80, 0x11, 0x4d, 0x25, 0xcc, 0x9a, 0x2f, 0x0a, 0xb3, 0x26, 0x14, 0x4c, 0x53,
|
||||
0x61, 0x56, 0xa3, 0x28, 0xcc, 0x3a, 0x4b, 0xbd, 0x54, 0x09, 0x22, 0x9b, 0x13, 0x83, 0x48, 0x35,
|
||||
0x1c, 0x5b, 0x48, 0x84, 0x63, 0xbf, 0xcf, 0x3d, 0xf5, 0x18, 0x56, 0x33, 0xbb, 0x40, 0x6c, 0xaa,
|
||||
0xbb, 0xa9, 0x8a, 0x6b, 0xbb, 0x48, 0x40, 0x51, 0xc1, 0xf5, 0xcf, 0xe0, 0xca, 0xa1, 0x67, 0xa5,
|
||||
0x42, 0x15, 0x91, 0x68, 0x9d, 0x3d, 0x42, 0xb8, 0x27, 0xa3, 0xca, 0xf2, 0x19, 0x73, 0x38, 0x8e,
|
||||
0xae, 0x69, 0xb0, 0x51, 0x3c, 0xbb, 0x38, 0xf2, 0xff, 0x04, 0x16, 0x76, 0x5e, 0xe0, 0x41, 0xff,
|
||||
0xd4, 0x19, 0x9c, 0x83, 0xa3, 0x16, 0x54, 0x06, 0x63, 0x4b, 0x94, 0x32, 0xe8, 0xa7, 0x1a, 0xc5,
|
||||
0x54, 0x92, 0x51, 0x8c, 0x01, 0xad, 0x78, 0x06, 0x21, 0xc9, 0x15, 0x2a, 0x49, 0x8b, 0x22, 0x53,
|
||||
0xe2, 0xf3, 0xba, 0x68, 0x09, 0x38, 0xf6, 0x7d, 0xb6, 0x54, 0x0e, 0xc7, 0xbe, 0x9f, 0xdc, 0x73,
|
||||
0x95, 0xe4, 0x9e, 0xd3, 0xbe, 0x86, 0x3a, 0x9d, 0xe0, 0x3b, 0xb1, 0x2f, 0x42, 0xf9, 0x4a, 0x1c,
|
||||
0xca, 0x47, 0x19, 0xc1, 0xb4, 0x92, 0x11, 0x68, 0x1b, 0x30, 0xcf, 0xe7, 0x12, 0x0b, 0x69, 0x41,
|
||||
0x25, 0xf4, 0x47, 0xd2, 0xb2, 0x42, 0x7f, 0xa4, 0xfd, 0x11, 0x34, 0xba, 0x84, 0x98, 0x83, 0x93,
|
||||
0x73, 0xf0, 0x13, 0xcd, 0x55, 0x56, 0xb3, 0x8f, 0x0c, 0x4f, 0x9a, 0x06, 0x4d, 0x49, 0xbb, 0x70,
|
||||
0xfe, 0x1e, 0xa0, 0x7d, 0xd7, 0x27, 0x0f, 0x5d, 0xff, 0xb9, 0xe9, 0x5b, 0xe7, 0x8b, 0xe6, 0x11,
|
||||
0x4c, 0x8b, 0xd7, 0x3c, 0x95, 0x1b, 0x33, 0x3a, 0xfb, 0xd6, 0xde, 0x81, 0xa5, 0x04, 0xbd, 0xc2,
|
||||
0x89, 0x3f, 0x84, 0x3a, 0x73, 0x72, 0x22, 0xe2, 0xbb, 0xa1, 0x56, 0x3c, 0x27, 0x79, 0x42, 0xad,
|
||||
0x0b, 0x8b, 0xf4, 0x14, 0x63, 0xf0, 0x68, 0x5b, 0xfc, 0x30, 0x15, 0x17, 0x2d, 0x27, 0xc7, 0xa7,
|
||||
0x62, 0xa2, 0x7f, 0x2c, 0xc1, 0x0c, 0x83, 0x67, 0xce, 0x9c, 0x8b, 0x50, 0xf3, 0xb1, 0xe7, 0x1a,
|
||||
0xc4, 0x1c, 0x46, 0x0f, 0xa4, 0x28, 0xe0, 0xc0, 0x1c, 0x06, 0xec, 0x7d, 0x17, 0xed, 0xb4, 0xec,
|
||||
0x21, 0x0e, 0x88, 0x7c, 0x25, 0x55, 0xa7, 0xb0, 0x6d, 0x0e, 0xa2, 0x22, 0x09, 0xec, 0x3f, 0xe5,
|
||||
0x01, 0xcf, 0xb4, 0xce, 0xbe, 0xd1, 0x75, 0xfe, 0xf6, 0x60, 0x42, 0x79, 0x8a, 0x3d, 0x48, 0xe8,
|
||||
0x40, 0x35, 0x55, 0x91, 0x8a, 0xda, 0xda, 0x27, 0x80, 0xd4, 0x35, 0x0b, 0xa1, 0xbe, 0x0d, 0xb3,
|
||||
0x4c, 0x24, 0xf2, 0xc4, 0x6e, 0x26, 0x17, 0xad, 0x8b, 0x5e, 0xed, 0x33, 0x40, 0x5c, 0x8a, 0x89,
|
||||
0x53, 0xfa, 0xec, 0x12, 0xff, 0x18, 0x96, 0x12, 0xe3, 0xa3, 0xab, 0xe6, 0x04, 0x81, 0xf4, 0xec,
|
||||
0x62, 0xf0, 0xaf, 0x4b, 0x00, 0xdd, 0x90, 0x9c, 0x88, 0x52, 0x88, 0xba, 0xca, 0x52, 0x72, 0x95,
|
||||
0xb4, 0xcf, 0x33, 0x83, 0xe0, 0xb9, 0xeb, 0xcb, 0x30, 0x34, 0x6a, 0xb3, 0x32, 0x46, 0x48, 0x4e,
|
||||
0x64, 0xf9, 0x95, 0x7e, 0xa3, 0xeb, 0xd0, 0xe4, 0xef, 0xda, 0x0c, 0xd3, 0xb2, 0x7c, 0x1c, 0x04,
|
||||
0xa2, 0x0e, 0xdb, 0xe0, 0xd0, 0x2e, 0x07, 0x52, 0x34, 0xdb, 0xc2, 0x0e, 0xb1, 0xc9, 0xa9, 0x41,
|
||||
0xdc, 0x6f, 0xb0, 0x23, 0x02, 0xcc, 0x86, 0x84, 0x1e, 0x50, 0x20, 0x45, 0xf3, 0xf1, 0xd0, 0x0e,
|
||||
0x88, 0x2f, 0xd1, 0x64, 0x5d, 0x50, 0x40, 0x19, 0x9a, 0xf6, 0xcb, 0x12, 0xb4, 0xf6, 0xc3, 0xd1,
|
||||
0x88, 0x2f, 0xf2, 0xbc, 0xb2, 0x44, 0xef, 0x88, 0x75, 0x94, 0x53, 0xd6, 0x10, 0x8b, 0x48, 0x2c,
|
||||
0xee, 0xbb, 0x27, 0xbe, 0x77, 0x61, 0x51, 0x61, 0x54, 0x28, 0x2d, 0x11, 0x47, 0x94, 0x92, 0x71,
|
||||
0x04, 0x35, 0x14, 0x9e, 0xeb, 0xbd, 0xde, 0xe2, 0xb4, 0x0b, 0xb0, 0x94, 0x18, 0x2f, 0x0e, 0x8d,
|
||||
0x5b, 0xd0, 0x10, 0xd7, 0xbd, 0xc2, 0x08, 0xd6, 0xa0, 0x4a, 0xdd, 0xcb, 0xc0, 0xb6, 0x64, 0xdd,
|
||||
0x7d, 0xce, 0x73, 0xad, 0x2d, 0xdb, 0xf2, 0xb5, 0x1e, 0x34, 0x74, 0x4e, 0x5e, 0xe0, 0x7e, 0x0a,
|
||||
0x4d, 0x71, 0x39, 0x6c, 0x24, 0x1e, 0x49, 0xc4, 0x45, 0xe2, 0x04, 0x6d, 0xbd, 0xe1, 0xa8, 0x4d,
|
||||
0xed, 0xe7, 0xd0, 0xe1, 0x87, 0x5a, 0x82, 0xaa, 0x5c, 0xda, 0xa7, 0x20, 0xdf, 0x5d, 0x16, 0x11,
|
||||
0x4f, 0x0e, 0x6b, 0xf8, 0x6a, 0x53, 0xbb, 0x0c, 0x17, 0x73, 0x89, 0x8b, 0x75, 0x7b, 0xd0, 0x8a,
|
||||
0x3b, 0x2c, 0x5b, 0x5e, 0x37, 0xb0, 0x6b, 0x84, 0x92, 0x72, 0x8d, 0xb0, 0x12, 0x05, 0x0a, 0xdc,
|
||||
0xa1, 0x8b, 0x96, 0x12, 0xd6, 0x55, 0x8a, 0xc2, 0xba, 0xe9, 0x44, 0x58, 0xa7, 0x7d, 0x19, 0x49,
|
||||
0x4f, 0xc4, 0xd4, 0x1f, 0xb1, 0xc0, 0x9e, 0xcf, 0x2d, 0xdd, 0xc4, 0x5a, 0xce, 0xe2, 0x38, 0x86,
|
||||
0xae, 0x20, 0x6b, 0x0b, 0xd0, 0x48, 0x38, 0x0c, 0xed, 0x01, 0x34, 0x53, 0x1e, 0xe0, 0x4e, 0x2a,
|
||||
0xc2, 0xc9, 0x88, 0x2d, 0x15, 0xdf, 0x2c, 0x0b, 0x47, 0xf4, 0x30, 0xd8, 0x75, 0x8e, 0x5d, 0x49,
|
||||
0xf7, 0x1a, 0xd4, 0x0f, 0x8b, 0x9e, 0x21, 0x4e, 0xcb, 0x7b, 0xac, 0x77, 0x60, 0xb1, 0x4f, 0x5c,
|
||||
0xdf, 0x1c, 0xe2, 0x5d, 0xb6, 0x6b, 0x8f, 0x6d, 0x7e, 0x4f, 0x13, 0x86, 0x91, 0xff, 0x66, 0xdf,
|
||||
0xda, 0x7f, 0x94, 0x60, 0xe1, 0xa1, 0x3d, 0xc2, 0xc1, 0x69, 0x40, 0xf0, 0xf8, 0x90, 0x45, 0xbb,
|
||||
0x97, 0xa0, 0x46, 0xb9, 0x09, 0x88, 0x39, 0xf6, 0xe4, 0x3d, 0x57, 0x04, 0xa0, 0x32, 0x0a, 0x38,
|
||||
0x69, 0x99, 0xff, 0xaa, 0x99, 0x46, 0x66, 0x56, 0x1a, 0xfd, 0x0b, 0x10, 0x7a, 0x1f, 0x20, 0x0c,
|
||||
0xb0, 0x25, 0xee, 0xb6, 0x2a, 0xa9, 0xa3, 0xe7, 0x50, 0xbd, 0x81, 0xa0, 0x78, 0xfc, 0xa2, 0xeb,
|
||||
0x03, 0xa8, 0xdb, 0x8e, 0x6b, 0x61, 0x76, 0x03, 0x61, 0x89, 0xdc, 0x38, 0x7f, 0x14, 0x70, 0xc4,
|
||||
0xc3, 0x00, 0x5b, 0xda, 0x1f, 0x0b, 0x2f, 0x2c, 0x85, 0x27, 0x74, 0xb0, 0x03, 0x8b, 0x7c, 0x43,
|
||||
0x1f, 0x47, 0x8b, 0x96, 0x8a, 0x8e, 0x03, 0xce, 0x94, 0x40, 0xf4, 0x96, 0x2d, 0x4e, 0x45, 0x39,
|
||||
0x42, 0xbb, 0x0f, 0x17, 0x12, 0x51, 0xe9, 0x79, 0x92, 0xb9, 0x47, 0xa9, 0x4c, 0x30, 0x36, 0x10,
|
||||
0x91, 0x8a, 0x49, 0xfb, 0x28, 0x48, 0xc5, 0x02, 0x9e, 0x8a, 0x05, 0x9a, 0x0e, 0x6b, 0x89, 0x04,
|
||||
0x35, 0xc1, 0xc8, 0x07, 0xa9, 0x23, 0xfe, 0x72, 0x01, 0xb1, 0xd4, 0x59, 0xff, 0xbf, 0x25, 0x58,
|
||||
0xce, 0x43, 0x78, 0xcd, 0x52, 0xc8, 0x4f, 0x0a, 0x5e, 0x1c, 0xdc, 0x9d, 0xc8, 0xcd, 0xef, 0xa4,
|
||||
0x68, 0xf4, 0x18, 0x3a, 0x79, 0xd2, 0xcb, 0xaa, 0xa2, 0x72, 0x06, 0x55, 0xfc, 0x5f, 0x59, 0x29,
|
||||
0xee, 0x75, 0x09, 0xf1, 0xed, 0xa3, 0x90, 0x1a, 0xef, 0xf7, 0x95, 0xa4, 0x3f, 0x88, 0x12, 0x50,
|
||||
0x2e, 0xbf, 0x1b, 0xd9, 0x51, 0xf1, 0xac, 0xb9, 0x49, 0xe8, 0x5e, 0x32, 0x09, 0xe5, 0x65, 0xbb,
|
||||
0xdb, 0x13, 0xc9, 0xbc, 0xb1, 0x95, 0x99, 0x97, 0x25, 0x68, 0x26, 0xf5, 0x80, 0x3e, 0x01, 0x30,
|
||||
0x23, 0xce, 0x85, 0xc9, 0x5f, 0x9a, 0xb4, 0x3a, 0x5d, 0xc1, 0x47, 0xd7, 0xa0, 0x32, 0xf0, 0x42,
|
||||
0xa1, 0x91, 0xf8, 0xfe, 0x66, 0xcb, 0x0b, 0xb9, 0x03, 0xa0, 0xbd, 0x34, 0x68, 0xe6, 0xf7, 0xf0,
|
||||
0x19, 0xcf, 0xf5, 0x94, 0x81, 0x39, 0xaa, 0xc0, 0x41, 0x9f, 0x43, 0xf3, 0xb9, 0x6f, 0x13, 0xf3,
|
||||
0x68, 0x84, 0x8d, 0x91, 0x79, 0x8a, 0x7d, 0xe1, 0xb9, 0x8a, 0xbd, 0x4c, 0x43, 0xe2, 0x3f, 0xa1,
|
||||
0xe8, 0x5a, 0x08, 0x55, 0x39, 0xff, 0x2b, 0x3c, 0xf2, 0x63, 0x58, 0x0d, 0x29, 0x9a, 0xc1, 0xde,
|
||||
0x02, 0x38, 0xa6, 0xe3, 0x1a, 0x01, 0xa6, 0x47, 0x93, 0x7c, 0x7f, 0x97, 0xef, 0x2d, 0x97, 0xd9,
|
||||
0xa0, 0x2d, 0xd7, 0xc7, 0x3d, 0xd3, 0x71, 0xfb, 0x7c, 0x84, 0x36, 0x86, 0xba, 0xb2, 0x9c, 0x57,
|
||||
0xcc, 0xfc, 0x00, 0x16, 0xe5, 0xcd, 0x58, 0x80, 0x89, 0xf0, 0xeb, 0x93, 0xe6, 0x5c, 0x10, 0xe8,
|
||||
0x7d, 0x4c, 0x98, 0x77, 0xbf, 0x75, 0x09, 0xaa, 0xf2, 0x2f, 0x10, 0x68, 0x0e, 0x2a, 0x07, 0x5b,
|
||||
0xfb, 0xad, 0x29, 0xfa, 0x71, 0xb8, 0xbd, 0xdf, 0x2a, 0xdd, 0x1a, 0x43, 0x2b, 0xfd, 0xfc, 0x1f,
|
||||
0xad, 0xc2, 0xd2, 0xbe, 0xbe, 0xb7, 0xdf, 0x7d, 0xd4, 0x3d, 0xd8, 0xdd, 0xeb, 0x19, 0xfb, 0xfa,
|
||||
0xee, 0x57, 0xdd, 0x83, 0x9d, 0xd6, 0x14, 0xba, 0x0a, 0x97, 0xd5, 0x8e, 0x3f, 0xdc, 0xeb, 0x1f,
|
||||
0x18, 0x07, 0x7b, 0xc6, 0xd6, 0x5e, 0xef, 0xa0, 0xbb, 0xdb, 0xdb, 0xd1, 0x5b, 0x25, 0x74, 0x19,
|
||||
0xd6, 0x54, 0x94, 0x2f, 0x76, 0xb7, 0x77, 0xf5, 0x9d, 0x2d, 0xfa, 0xdd, 0x7d, 0xd2, 0x2a, 0xdf,
|
||||
0xba, 0x0f, 0x0b, 0xa9, 0xe7, 0x3c, 0x68, 0x11, 0x1a, 0xfd, 0x6e, 0x6f, 0xfb, 0x8b, 0xbd, 0x9f,
|
||||
0x1a, 0xfa, 0x4e, 0x77, 0xfb, 0x67, 0xad, 0x29, 0xb4, 0x0c, 0x2d, 0x09, 0xea, 0xed, 0x1d, 0x70,
|
||||
0x68, 0xe9, 0xd6, 0x37, 0x29, 0x93, 0xc4, 0xe8, 0x02, 0x2c, 0x46, 0x73, 0x1b, 0x5b, 0xfa, 0x4e,
|
||||
0xf7, 0x60, 0x67, 0xbb, 0x35, 0x95, 0x04, 0xeb, 0x87, 0xbd, 0xde, 0x6e, 0xef, 0x51, 0xab, 0x44,
|
||||
0xa9, 0xc6, 0xe0, 0x9d, 0x9f, 0xee, 0x52, 0xe4, 0x72, 0x12, 0xf9, 0xb0, 0xf7, 0xb8, 0xb7, 0xf7,
|
||||
0x93, 0x5e, 0xab, 0xb2, 0xf9, 0xef, 0x0d, 0x68, 0xca, 0x98, 0x01, 0xfb, 0xec, 0xba, 0xf6, 0x33,
|
||||
0x98, 0x93, 0x7f, 0x86, 0x89, 0x9d, 0x55, 0xf2, 0x9f, 0x3b, 0x9d, 0x76, 0xb6, 0x43, 0xc4, 0x5e,
|
||||
0x53, 0x68, 0x9f, 0xc5, 0x42, 0xca, 0xd3, 0xa9, 0xcb, 0x6a, 0x74, 0x92, 0x79, 0x9b, 0xd5, 0x59,
|
||||
0x2f, 0xea, 0x8e, 0x28, 0xf6, 0x69, 0x00, 0xa4, 0x3e, 0x7b, 0x45, 0xeb, 0x6a, 0x98, 0x90, 0x7d,
|
||||
0x4e, 0xdb, 0xb9, 0x52, 0xd8, 0x1f, 0x11, 0xfd, 0x19, 0xb4, 0xd2, 0x0f, 0x5e, 0x51, 0x5c, 0xb2,
|
||||
0x29, 0x78, 0x4c, 0xdb, 0xb9, 0x3a, 0x01, 0x43, 0x25, 0x9d, 0x79, 0x34, 0xba, 0x51, 0xfc, 0xec,
|
||||
0x2f, 0x43, 0xba, 0xe8, 0x2d, 0x21, 0x17, 0x45, 0xf2, 0xc9, 0x13, 0x52, 0x9f, 0x6a, 0xe6, 0x3c,
|
||||
0x7d, 0x53, 0x44, 0x91, 0xff, 0x56, 0x4a, 0x9b, 0x42, 0x5f, 0xc1, 0x42, 0xea, 0xa6, 0x0e, 0xc5,
|
||||
0xa3, 0xf2, 0xef, 0x1d, 0x3b, 0x1b, 0xc5, 0x08, 0x49, 0xbd, 0xa9, 0xf7, 0x70, 0x09, 0xbd, 0xe5,
|
||||
0x5c, 0xee, 0x25, 0xf4, 0x96, 0x7b, 0x81, 0xc7, 0xcc, 0x2b, 0x71, 0xdb, 0xa6, 0x98, 0x57, 0xde,
|
||||
0xd5, 0x5e, 0x67, 0xbd, 0xa8, 0x5b, 0x5d, 0x7e, 0xea, 0xa6, 0x4d, 0x59, 0x7e, 0xfe, 0x05, 0x5e,
|
||||
0x67, 0xa3, 0x18, 0x21, 0xad, 0xab, 0xb8, 0xec, 0x9f, 0xd2, 0x55, 0xe6, 0x96, 0x29, 0xa5, 0xab,
|
||||
0xec, 0x7d, 0x81, 0xd0, 0x55, 0xaa, 0x7e, 0x7f, 0xa5, 0xb0, 0xbe, 0x99, 0xd5, 0x55, 0x7e, 0xc9,
|
||||
0x54, 0x9b, 0x42, 0xdf, 0x42, 0xbb, 0xa8, 0x08, 0x89, 0xe2, 0x18, 0xe1, 0x15, 0x55, 0xd2, 0xce,
|
||||
0xcd, 0x33, 0x60, 0x46, 0x53, 0x76, 0xa1, 0x2a, 0x2b, 0x8e, 0x28, 0x76, 0x28, 0xa9, 0x32, 0x67,
|
||||
0x67, 0x2d, 0xa7, 0x27, 0x22, 0xf1, 0x01, 0x4c, 0x53, 0x28, 0x5a, 0x4e, 0x20, 0xc9, 0xa1, 0x17,
|
||||
0x52, 0xd0, 0x68, 0xd8, 0xc7, 0x30, 0xcb, 0x0b, 0x74, 0x28, 0xce, 0x9c, 0x12, 0xd5, 0xc0, 0xce,
|
||||
0x6a, 0x06, 0x1e, 0x0d, 0xfe, 0x92, 0xff, 0x27, 0x4f, 0x54, 0xda, 0xd0, 0xc5, 0xc4, 0xdf, 0x37,
|
||||
0x92, 0xf5, 0xbc, 0xce, 0xa5, 0xfc, 0x4e, 0xd5, 0x44, 0x52, 0xe1, 0xc7, 0x7a, 0x51, 0x7c, 0x98,
|
||||
0x31, 0x91, 0xfc, 0x78, 0x53, 0x9b, 0x42, 0x06, 0x2f, 0x5a, 0xa5, 0x08, 0x6b, 0xf9, 0xb6, 0x95,
|
||||
0x20, 0x7e, 0x6d, 0x22, 0x4e, 0x34, 0xc1, 0x11, 0x2c, 0xe5, 0xa4, 0xdf, 0xe8, 0x5a, 0x4a, 0xf9,
|
||||
0x79, 0x99, 0x7f, 0xe7, 0xad, 0xc9, 0x48, 0xaa, 0x8a, 0x84, 0x79, 0xaf, 0xa8, 0x3e, 0x41, 0xb1,
|
||||
0xea, 0xd5, 0x0c, 0x5c, 0x0e, 0xde, 0xfc, 0x8b, 0x0a, 0xcc, 0xf3, 0x22, 0x89, 0x38, 0xd3, 0x1e,
|
||||
0x01, 0xc4, 0x75, 0x3c, 0xd4, 0x49, 0x2c, 0x33, 0x51, 0xd0, 0xec, 0x5c, 0xcc, 0xed, 0x53, 0x95,
|
||||
0xaf, 0x94, 0xe4, 0x14, 0xe5, 0x67, 0x0b, 0x7d, 0x8a, 0xf2, 0x73, 0xaa, 0x78, 0xda, 0x14, 0xda,
|
||||
0x86, 0x5a, 0x54, 0x27, 0x42, 0x4a, 0x79, 0x29, 0x55, 0xe4, 0xea, 0x74, 0xf2, 0xba, 0x54, 0x8e,
|
||||
0x94, 0xda, 0x8f, 0xc2, 0x51, 0xb6, 0xa2, 0xa4, 0x70, 0x94, 0x57, 0x2e, 0x8a, 0x57, 0xc7, 0x53,
|
||||
0xdd, 0xf4, 0xea, 0x12, 0xd5, 0x83, 0xf4, 0xea, 0x92, 0xd9, 0xb1, 0x36, 0xf5, 0xc5, 0xa5, 0x5f,
|
||||
0xfd, 0x66, 0xbd, 0xf4, 0x9f, 0xbf, 0x59, 0x9f, 0xfa, 0xf3, 0x97, 0xeb, 0xa5, 0x5f, 0xbd, 0x5c,
|
||||
0x2f, 0xfd, 0xdb, 0xcb, 0xf5, 0xd2, 0x7f, 0xbf, 0x5c, 0x2f, 0xfd, 0xe2, 0x7f, 0xd6, 0xa7, 0x8e,
|
||||
0x66, 0xd9, 0x9f, 0x54, 0xdf, 0xff, 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xa9, 0xc0, 0x61,
|
||||
0x58, 0x3c, 0x00, 0x00,
|
||||
}
|
||||
|
|
|
|||
21
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto
generated
vendored
21
vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto
generated
vendored
|
|
@ -523,7 +523,6 @@ message LinuxContainerSecurityContext {
|
|||
repeated int64 supplemental_groups = 8;
|
||||
// AppArmor profile for the container, candidate values are:
|
||||
// * runtime/default: equivalent to not specifying a profile.
|
||||
// * unconfined: no profiles are loaded
|
||||
// * localhost/<profile_name>: profile loaded on the node
|
||||
// (localhost) by name. The possible profile names are detailed at
|
||||
// http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference
|
||||
|
|
@ -828,17 +827,7 @@ message ExecRequest {
|
|||
// Whether to exec the command in a TTY.
|
||||
bool tty = 3;
|
||||
// Whether to stream stdin.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
bool stdin = 4;
|
||||
// Whether to stream stdout.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
bool stdout = 5;
|
||||
// Whether to stream stderr.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
// If `tty` is true, `stderr` MUST be false. Multiplexing is not supported
|
||||
// in this case. The output of stdout and stderr will be combined to a
|
||||
// single stream.
|
||||
bool stderr = 6;
|
||||
}
|
||||
|
||||
message ExecResponse {
|
||||
|
|
@ -850,20 +839,10 @@ message AttachRequest {
|
|||
// ID of the container to which to attach.
|
||||
string container_id = 1;
|
||||
// Whether to stream stdin.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
bool stdin = 2;
|
||||
// Whether the process being attached is running in a TTY.
|
||||
// This must match the TTY setting in the ContainerConfig.
|
||||
bool tty = 3;
|
||||
// Whether to stream stdout.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
bool stdout = 4;
|
||||
// Whether to stream stderr.
|
||||
// One of `stdin`, `stdout`, and `stderr` MUST be true.
|
||||
// If `tty` is true, `stderr` MUST be false. Multiplexing is not supported
|
||||
// in this case. The output of stdout and stderr will be combined to a
|
||||
// single stream.
|
||||
bool stderr = 5;
|
||||
}
|
||||
|
||||
message AttachResponse {
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD
generated
vendored
|
|
@ -21,7 +21,6 @@ go_library(
|
|||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/container",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
@ -58,7 +57,6 @@ go_test(
|
|||
"ref_test.go",
|
||||
"sync_result_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/container",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
|
|
@ -73,7 +71,6 @@ go_test(
|
|||
go_test(
|
||||
name = "go_default_xtest",
|
||||
srcs = ["runtime_cache_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/container_test",
|
||||
deps = [
|
||||
":go_default_library",
|
||||
"//pkg/kubelet/container/testing:go_default_library",
|
||||
|
|
|
|||
5
vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go
generated
vendored
5
vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go
generated
vendored
|
|
@ -127,8 +127,9 @@ type Runtime interface {
|
|||
// DirectStreamingRuntime is the interface implemented by runtimes for which the streaming calls
|
||||
// (exec/attach/port-forward) should be served directly by the Kubelet.
|
||||
type DirectStreamingRuntime interface {
|
||||
// Runs the command in the container of the specified pod. Attaches
|
||||
// the processes stdin, stdout, and stderr. Optionally uses a tty.
|
||||
// Runs the command in the container of the specified pod using nsenter.
|
||||
// Attaches the processes stdin, stdout, and stderr. Optionally uses a
|
||||
// tty.
|
||||
ExecInContainer(containerID ContainerID, cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize <-chan remotecommand.TerminalSize, timeout time.Duration) error
|
||||
// Forward the specified port from the specified pod to the stream.
|
||||
PortForward(pod *Pod, port int32, stream io.ReadWriteCloser) error
|
||||
|
|
|
|||
164
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go
generated
vendored
164
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go
generated
vendored
|
|
@ -54,9 +54,9 @@ import (
|
|||
corelisters "k8s.io/client-go/listers/core/v1"
|
||||
"k8s.io/client-go/tools/cache"
|
||||
"k8s.io/client-go/tools/record"
|
||||
"k8s.io/client-go/util/certificate"
|
||||
"k8s.io/client-go/util/flowcontrol"
|
||||
"k8s.io/client-go/util/integer"
|
||||
"k8s.io/kubernetes/cmd/kubelet/app/options"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
|
|
@ -64,7 +64,7 @@ import (
|
|||
kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig"
|
||||
kubeletconfigv1alpha1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1alpha1"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
|
||||
kubeletcertificate "k8s.io/kubernetes/pkg/kubelet/certificate"
|
||||
"k8s.io/kubernetes/pkg/kubelet/certificate"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
"k8s.io/kubernetes/pkg/kubelet/config"
|
||||
"k8s.io/kubernetes/pkg/kubelet/configmap"
|
||||
|
|
@ -196,28 +196,13 @@ type Bootstrap interface {
|
|||
// Builder creates and initializes a Kubelet instance
|
||||
type Builder func(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
||||
kubeDeps *Dependencies,
|
||||
crOptions *config.ContainerRuntimeOptions,
|
||||
hostnameOverride string,
|
||||
nodeIP string,
|
||||
providerID string,
|
||||
cloudProvider string,
|
||||
certDirectory string,
|
||||
rootDirectory string,
|
||||
allowedUnsafeSysctls []string,
|
||||
containerized bool,
|
||||
remoteRuntimeEndpoint string,
|
||||
remoteImageEndpoint string,
|
||||
experimentalMounterPath string,
|
||||
experimentalKernelMemcgNotification bool,
|
||||
experimentalCheckNodeCapabilitiesBeforeMount bool,
|
||||
experimentalNodeAllocatableIgnoreEvictionThreshold bool,
|
||||
minimumGCAge metav1.Duration,
|
||||
maxPerPodContainerCount int32,
|
||||
maxContainerCount int32,
|
||||
masterServiceNamespace string,
|
||||
registerSchedulable bool,
|
||||
nonMasqueradeCIDR string,
|
||||
keepTerminatedPodVolumes bool) (Bootstrap, error)
|
||||
crOptions *options.ContainerRuntimeOptions,
|
||||
hostnameOverride,
|
||||
nodeIP,
|
||||
providerID,
|
||||
cloudProvider,
|
||||
certDirectory,
|
||||
rootDirectory string) (Bootstrap, error)
|
||||
|
||||
// Dependencies is a bin for things we might consider "injected dependencies" -- objects constructed
|
||||
// at runtime that are necessary for running the Kubelet. This is a temporary solution for grouping
|
||||
|
|
@ -301,12 +286,12 @@ func makePodSourceConfig(kubeCfg *kubeletconfiginternal.KubeletConfiguration, ku
|
|||
return cfg, nil
|
||||
}
|
||||
|
||||
func getRuntimeAndImageServices(remoteRuntimeEndpoint string, remoteImageEndpoint string, runtimeRequestTimeout metav1.Duration) (internalapi.RuntimeService, internalapi.ImageManagerService, error) {
|
||||
rs, err := remote.NewRemoteRuntimeService(remoteRuntimeEndpoint, runtimeRequestTimeout.Duration)
|
||||
func getRuntimeAndImageServices(config *kubeletconfiginternal.KubeletConfiguration) (internalapi.RuntimeService, internalapi.ImageManagerService, error) {
|
||||
rs, err := remote.NewRemoteRuntimeService(config.RemoteRuntimeEndpoint, config.RuntimeRequestTimeout.Duration)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
is, err := remote.NewRemoteImageService(remoteImageEndpoint, runtimeRequestTimeout.Duration)
|
||||
is, err := remote.NewRemoteImageService(config.RemoteImageEndpoint, config.RuntimeRequestTimeout.Duration)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
|
@ -317,28 +302,13 @@ func getRuntimeAndImageServices(remoteRuntimeEndpoint string, remoteImageEndpoin
|
|||
// No initialization of Kubelet and its modules should happen here.
|
||||
func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
||||
kubeDeps *Dependencies,
|
||||
crOptions *config.ContainerRuntimeOptions,
|
||||
hostnameOverride string,
|
||||
nodeIP string,
|
||||
providerID string,
|
||||
cloudProvider string,
|
||||
certDirectory string,
|
||||
rootDirectory string,
|
||||
allowedUnsafeSysctls []string,
|
||||
containerized bool,
|
||||
remoteRuntimeEndpoint string,
|
||||
remoteImageEndpoint string,
|
||||
experimentalMounterPath string,
|
||||
experimentalKernelMemcgNotification bool,
|
||||
experimentalCheckNodeCapabilitiesBeforeMount bool,
|
||||
experimentalNodeAllocatableIgnoreEvictionThreshold bool,
|
||||
minimumGCAge metav1.Duration,
|
||||
maxPerPodContainerCount int32,
|
||||
maxContainerCount int32,
|
||||
masterServiceNamespace string,
|
||||
registerSchedulable bool,
|
||||
nonMasqueradeCIDR string,
|
||||
keepTerminatedPodVolumes bool) (*Kubelet, error) {
|
||||
crOptions *options.ContainerRuntimeOptions,
|
||||
hostnameOverride,
|
||||
nodeIP,
|
||||
providerID,
|
||||
cloudProvider,
|
||||
certDirectory,
|
||||
rootDirectory string) (*Kubelet, error) {
|
||||
if rootDirectory == "" {
|
||||
return nil, fmt.Errorf("invalid root directory %q", rootDirectory)
|
||||
}
|
||||
|
|
@ -406,9 +376,9 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
}
|
||||
|
||||
containerGCPolicy := kubecontainer.ContainerGCPolicy{
|
||||
MinAge: minimumGCAge.Duration,
|
||||
MaxPerPodContainer: int(maxPerPodContainerCount),
|
||||
MaxContainers: int(maxContainerCount),
|
||||
MinAge: kubeCfg.MinimumGCAge.Duration,
|
||||
MaxPerPodContainer: int(kubeCfg.MaxPerPodContainerCount),
|
||||
MaxContainers: int(kubeCfg.MaxContainerCount),
|
||||
}
|
||||
|
||||
daemonEndpoints := &v1.NodeDaemonEndpoints{
|
||||
|
|
@ -422,7 +392,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
}
|
||||
|
||||
enforceNodeAllocatable := kubeCfg.EnforceNodeAllocatable
|
||||
if experimentalNodeAllocatableIgnoreEvictionThreshold {
|
||||
if kubeCfg.ExperimentalNodeAllocatableIgnoreEvictionThreshold {
|
||||
// Do not provide kubeCfg.EnforceNodeAllocatable to eviction threshold parsing if we are not enforcing Evictions
|
||||
enforceNodeAllocatable = []string{}
|
||||
}
|
||||
|
|
@ -434,7 +404,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
PressureTransitionPeriod: kubeCfg.EvictionPressureTransitionPeriod.Duration,
|
||||
MaxPodGracePeriodSeconds: int64(kubeCfg.EvictionMaxPodGracePeriod),
|
||||
Thresholds: thresholds,
|
||||
KernelMemcgNotification: experimentalKernelMemcgNotification,
|
||||
KernelMemcgNotification: kubeCfg.ExperimentalKernelMemcgNotification,
|
||||
}
|
||||
|
||||
serviceIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
|
||||
|
|
@ -488,12 +458,12 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
resyncInterval: kubeCfg.SyncFrequency.Duration,
|
||||
sourcesReady: config.NewSourcesReady(kubeDeps.PodConfig.SeenAllSources),
|
||||
registerNode: kubeCfg.RegisterNode,
|
||||
registerSchedulable: registerSchedulable,
|
||||
registerSchedulable: kubeCfg.RegisterSchedulable,
|
||||
clusterDomain: kubeCfg.ClusterDomain,
|
||||
clusterDNS: clusterDNS,
|
||||
serviceLister: serviceLister,
|
||||
nodeInfo: nodeInfo,
|
||||
masterServiceNamespace: masterServiceNamespace,
|
||||
masterServiceNamespace: kubeCfg.MasterServiceNamespace,
|
||||
streamingConnectionIdleTimeout: kubeCfg.StreamingConnectionIdleTimeout.Duration,
|
||||
recorder: kubeDeps.Recorder,
|
||||
cadvisor: kubeDeps.CAdvisorInterface,
|
||||
|
|
@ -524,7 +494,6 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
iptablesMasqueradeBit: int(kubeCfg.IPTablesMasqueradeBit),
|
||||
iptablesDropBit: int(kubeCfg.IPTablesDropBit),
|
||||
experimentalHostUserNamespaceDefaulting: utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalHostUserNamespaceDefaultingGate),
|
||||
keepTerminatedPodVolumes: keepTerminatedPodVolumes,
|
||||
}
|
||||
|
||||
secretManager := secret.NewCachingSecretManager(
|
||||
|
|
@ -547,7 +516,17 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
}
|
||||
glog.Infof("Hairpin mode set to %q", hairpinMode)
|
||||
|
||||
plug, err := network.InitNetworkPlugin(kubeDeps.NetworkPlugins, crOptions.NetworkPluginName, &criNetworkHost{&networkHost{klet}, &network.NoopPortMappingGetter{}}, hairpinMode, nonMasqueradeCIDR, int(crOptions.NetworkPluginMTU))
|
||||
// TODO(#36485) Remove this workaround once we fix the init-container issue.
|
||||
// Touch iptables lock file, which will be shared among all processes accessing
|
||||
// the iptables.
|
||||
f, err := os.OpenFile(utilipt.LockfilePath16x, os.O_CREATE, 0600)
|
||||
if err != nil {
|
||||
glog.Warningf("Failed to open iptables lock file: %v", err)
|
||||
} else if err = f.Close(); err != nil {
|
||||
glog.Warningf("Failed to close iptables lock file: %v", err)
|
||||
}
|
||||
|
||||
plug, err := network.InitNetworkPlugin(kubeDeps.NetworkPlugins, crOptions.NetworkPluginName, &criNetworkHost{&networkHost{klet}, &network.NoopPortMappingGetter{}}, hairpinMode, kubeCfg.NonMasqueradeCIDR, int(crOptions.NetworkPluginMTU))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -566,10 +545,10 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
// podManager is also responsible for keeping secretManager and configMapManager contents up-to-date.
|
||||
klet.podManager = kubepod.NewBasicPodManager(kubepod.NewBasicMirrorClient(klet.kubeClient), secretManager, configMapManager)
|
||||
|
||||
if remoteRuntimeEndpoint != "" {
|
||||
// remoteImageEndpoint is same as remoteRuntimeEndpoint if not explicitly specified
|
||||
if remoteImageEndpoint == "" {
|
||||
remoteImageEndpoint = remoteRuntimeEndpoint
|
||||
if kubeCfg.RemoteRuntimeEndpoint != "" {
|
||||
// kubeCfg.RemoteImageEndpoint is same as kubeCfg.RemoteRuntimeEndpoint if not explicitly specified
|
||||
if kubeCfg.RemoteImageEndpoint == "" {
|
||||
kubeCfg.RemoteImageEndpoint = kubeCfg.RemoteRuntimeEndpoint
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -580,7 +559,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
}
|
||||
pluginSettings := dockershim.NetworkPluginSettings{
|
||||
HairpinMode: hairpinMode,
|
||||
NonMasqueradeCIDR: nonMasqueradeCIDR,
|
||||
NonMasqueradeCIDR: kubeCfg.NonMasqueradeCIDR,
|
||||
PluginName: crOptions.NetworkPluginName,
|
||||
PluginConfDir: crOptions.CNIConfDir,
|
||||
PluginBinDir: binDir,
|
||||
|
|
@ -608,8 +587,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
// Create and start the CRI shim running as a grpc server.
|
||||
streamingConfig := getStreamingConfig(kubeCfg, kubeDeps)
|
||||
ds, err := dockershim.NewDockerService(kubeDeps.DockerClient, crOptions.PodSandboxImage, streamingConfig,
|
||||
&pluginSettings, kubeCfg.RuntimeCgroups, kubeCfg.CgroupDriver, crOptions.DockershimRootDirectory,
|
||||
crOptions.DockerDisableSharedPID)
|
||||
&pluginSettings, kubeCfg.RuntimeCgroups, kubeCfg.CgroupDriver, crOptions.DockerExecHandlerName,
|
||||
crOptions.DockershimRootDirectory, crOptions.DockerDisableSharedPID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -622,10 +601,10 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
|
||||
// The unix socket for kubelet <-> dockershim communication.
|
||||
glog.V(5).Infof("RemoteRuntimeEndpoint: %q, RemoteImageEndpoint: %q",
|
||||
remoteRuntimeEndpoint,
|
||||
remoteImageEndpoint)
|
||||
kubeCfg.RemoteRuntimeEndpoint,
|
||||
kubeCfg.RemoteImageEndpoint)
|
||||
glog.V(2).Infof("Starting the GRPC server for the docker CRI shim.")
|
||||
server := dockerremote.NewDockerServer(remoteRuntimeEndpoint, ds)
|
||||
server := dockerremote.NewDockerServer(kubeCfg.RemoteRuntimeEndpoint, ds)
|
||||
if err := server.Start(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -644,7 +623,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
default:
|
||||
return nil, fmt.Errorf("unsupported CRI runtime: %q", kubeCfg.ContainerRuntime)
|
||||
}
|
||||
runtimeService, imageService, err := getRuntimeAndImageServices(remoteRuntimeEndpoint, remoteImageEndpoint, kubeCfg.RuntimeRequestTimeout)
|
||||
runtimeService, imageService, err := getRuntimeAndImageServices(kubeCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -681,7 +660,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
// be removed. Related issue:
|
||||
// https://github.com/kubernetes/kubernetes/issues/51798
|
||||
if (kubeCfg.ContainerRuntime == kubetypes.DockerContainerRuntime &&
|
||||
goruntime.GOOS == "linux") || remoteRuntimeEndpoint == "/var/run/crio.sock" {
|
||||
goruntime.GOOS == "linux") || kubeCfg.RemoteRuntimeEndpoint == "/var/run/crio.sock" {
|
||||
klet.StatsProvider = stats.NewCadvisorStatsProvider(
|
||||
klet.cadvisor,
|
||||
klet.resourceAnalyzer,
|
||||
|
|
@ -774,7 +753,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
|
||||
ips = append(ips, cloudIPs...)
|
||||
names := append([]string{klet.GetHostname(), hostnameOverride}, cloudNames...)
|
||||
klet.serverCertificateManager, err = kubeletcertificate.NewKubeletServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names, certDirectory)
|
||||
klet.serverCertificateManager, err = certificate.NewKubeletServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names, certDirectory)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to initialize certificate manager: %v", err)
|
||||
}
|
||||
|
|
@ -802,11 +781,11 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
|
||||
// If the experimentalMounterPathFlag is set, we do not want to
|
||||
// check node capabilities since the mount path is not the default
|
||||
if len(experimentalMounterPath) != 0 {
|
||||
experimentalCheckNodeCapabilitiesBeforeMount = false
|
||||
if len(kubeCfg.ExperimentalMounterPath) != 0 {
|
||||
kubeCfg.ExperimentalCheckNodeCapabilitiesBeforeMount = false
|
||||
// Replace the nameserver in containerized-mounter's rootfs/etc/resolve.conf with kubelet.ClusterDNS
|
||||
// so that service name could be resolved
|
||||
klet.setupDNSinContainerizedMounter(experimentalMounterPath)
|
||||
klet.setupDNSinContainerizedMounter(kubeCfg.ExperimentalMounterPath)
|
||||
}
|
||||
|
||||
// setup volumeManager
|
||||
|
|
@ -821,8 +800,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
kubeDeps.Mounter,
|
||||
klet.getPodsDir(),
|
||||
kubeDeps.Recorder,
|
||||
experimentalCheckNodeCapabilitiesBeforeMount,
|
||||
keepTerminatedPodVolumes)
|
||||
kubeCfg.ExperimentalCheckNodeCapabilitiesBeforeMount,
|
||||
kubeCfg.KeepTerminatedPodVolumes)
|
||||
|
||||
runtimeCache, err := kubecontainer.NewRuntimeCache(klet.containerRuntime)
|
||||
if err != nil {
|
||||
|
|
@ -854,7 +833,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,
|
|||
}
|
||||
// Safe, whitelisted sysctls can always be used as unsafe sysctls in the spec
|
||||
// Hence, we concatenate those two lists.
|
||||
safeAndUnsafeSysctls := append(sysctl.SafeSysctlWhitelist(), allowedUnsafeSysctls...)
|
||||
safeAndUnsafeSysctls := append(sysctl.SafeSysctlWhitelist(), kubeCfg.AllowedUnsafeSysctls...)
|
||||
unsafeWhitelist, err := sysctl.NewWhitelist(safeAndUnsafeSysctls, v1.UnsafeSysctlsPodAnnotationKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
@ -1179,13 +1158,6 @@ type Kubelet struct {
|
|||
|
||||
// StatsProvider provides the node and the container stats.
|
||||
*stats.StatsProvider
|
||||
|
||||
// containerized should be set to true if the kubelet is running in a container
|
||||
containerized bool
|
||||
|
||||
// This flag, if set, instructs the kubelet to keep volumes from terminated pods mounted to the node.
|
||||
// This can be useful for debugging volume related issues.
|
||||
keepTerminatedPodVolumes bool // DEPRECATED
|
||||
}
|
||||
|
||||
func allLocalIPsWithoutLoopback() ([]net.IP, error) {
|
||||
|
|
@ -1473,10 +1445,6 @@ func (kl *Kubelet) GetClusterDNS(pod *v1.Pod) ([]string, []string, bool, error)
|
|||
//
|
||||
// If any step of this workflow errors, the error is returned, and is repeated
|
||||
// on the next syncPod call.
|
||||
//
|
||||
// This operation writes all events that are dispatched in order to provide
|
||||
// the most accurate information possible about an error situation to aid debugging.
|
||||
// Callers should not throw an event if this operation returns an error.
|
||||
func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
||||
// pull out the required options
|
||||
pod := o.pod
|
||||
|
|
@ -1494,7 +1462,6 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
kl.statusManager.SetPodStatus(pod, apiPodStatus)
|
||||
// we kill the pod with the specified grace period since this is a termination
|
||||
if err := kl.killPod(pod, nil, podStatus, killPodOptions.PodTerminationGracePeriodSecondsOverride); err != nil {
|
||||
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToKillPod, "error killing pod: %v", err)
|
||||
// there was an error killing the pod, so we return that error directly
|
||||
utilruntime.HandleError(err)
|
||||
return err
|
||||
|
|
@ -1561,7 +1528,6 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
if !runnable.Admit || pod.DeletionTimestamp != nil || apiPodStatus.Phase == v1.PodFailed {
|
||||
var syncErr error
|
||||
if err := kl.killPod(pod, nil, podStatus, nil); err != nil {
|
||||
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToKillPod, "error killing pod: %v", err)
|
||||
syncErr = fmt.Errorf("error killing pod: %v", err)
|
||||
utilruntime.HandleError(syncErr)
|
||||
} else {
|
||||
|
|
@ -1576,7 +1542,6 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
|
||||
// If the network plugin is not ready, only start the pod if it uses the host network
|
||||
if rs := kl.runtimeState.networkErrors(); len(rs) != 0 && !kubecontainer.IsHostNetworkPod(pod) {
|
||||
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.NetworkNotReady, "network is not ready: %v", rs)
|
||||
return fmt.Errorf("network is not ready: %v", rs)
|
||||
}
|
||||
|
||||
|
|
@ -1619,7 +1584,6 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
glog.V(2).Infof("Failed to update QoS cgroups while syncing pod: %v", err)
|
||||
}
|
||||
if err := pcm.EnsureExists(pod); err != nil {
|
||||
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToCreatePodContainer, "unable to ensure pod container exists: %v", err)
|
||||
return fmt.Errorf("failed to ensure that the pod: %v cgroups exist and are correctly applied: %v", pod.UID, err)
|
||||
}
|
||||
}
|
||||
|
|
@ -1643,21 +1607,15 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
}
|
||||
}
|
||||
if mirrorPod == nil || deleted {
|
||||
node, err := kl.GetNode()
|
||||
if err != nil || node.DeletionTimestamp != nil {
|
||||
glog.V(4).Infof("No need to create a mirror pod, since node %q has been removed from the cluster", kl.nodeName)
|
||||
} else {
|
||||
glog.V(4).Infof("Creating a mirror pod for static pod %q", format.Pod(pod))
|
||||
if err := kl.podManager.CreateMirrorPod(pod); err != nil {
|
||||
glog.Errorf("Failed creating a mirror pod for %q: %v", format.Pod(pod), err)
|
||||
}
|
||||
glog.V(3).Infof("Creating a mirror pod for static pod %q", format.Pod(pod))
|
||||
if err := kl.podManager.CreateMirrorPod(pod); err != nil {
|
||||
glog.Errorf("Failed creating a mirror pod for %q: %v", format.Pod(pod), err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Make data directories for the pod
|
||||
if err := kl.makePodDataDirs(pod); err != nil {
|
||||
kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToMakePodDataDirectories, "error making pod data directories: %v", err)
|
||||
glog.Errorf("Unable to make pod data directories for pod %q: %v", format.Pod(pod), err)
|
||||
return err
|
||||
}
|
||||
|
|
@ -1679,8 +1637,6 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error {
|
|||
result := kl.containerRuntime.SyncPod(pod, apiPodStatus, podStatus, pullSecrets, kl.backOff)
|
||||
kl.reasonCache.Update(pod.UID, result)
|
||||
if err := result.Error(); err != nil {
|
||||
// Do not record an event here, as we keep all event logging for sync pod failures
|
||||
// local to container runtime so we get better errors
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -1932,7 +1888,7 @@ func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handle
|
|||
break
|
||||
}
|
||||
glog.V(4).Infof("SyncLoop (SYNC): %d pods; %s", len(podsToSync), format.Pods(podsToSync))
|
||||
handler.HandlePodSyncs(podsToSync)
|
||||
kl.HandlePodSyncs(podsToSync)
|
||||
case update := <-kl.livenessManager.Updates():
|
||||
if update.Result == proberesults.Failure {
|
||||
// The liveness manager detected a failure; sync the pod.
|
||||
|
|
|
|||
12
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go
generated
vendored
12
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go
generated
vendored
|
|
@ -27,8 +27,8 @@ import (
|
|||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/kubernetes/cmd/kubelet/app/options"
|
||||
"k8s.io/kubernetes/pkg/kubelet/cm"
|
||||
"k8s.io/kubernetes/pkg/kubelet/config"
|
||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||
utilfile "k8s.io/kubernetes/pkg/util/file"
|
||||
utilnode "k8s.io/kubernetes/pkg/util/node"
|
||||
|
|
@ -46,7 +46,7 @@ func (kl *Kubelet) getRootDir() string {
|
|||
// getPodsDir returns the full path to the directory under which pod
|
||||
// directories are created.
|
||||
func (kl *Kubelet) getPodsDir() string {
|
||||
return filepath.Join(kl.getRootDir(), config.DefaultKubeletPodsDirName)
|
||||
return filepath.Join(kl.getRootDir(), options.DefaultKubeletPodsDirName)
|
||||
}
|
||||
|
||||
// getPluginsDir returns the full path to the directory under which plugin
|
||||
|
|
@ -54,7 +54,7 @@ func (kl *Kubelet) getPodsDir() string {
|
|||
// they need to persist. Plugins should create subdirectories under this named
|
||||
// after their own names.
|
||||
func (kl *Kubelet) getPluginsDir() string {
|
||||
return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsDirName)
|
||||
return filepath.Join(kl.getRootDir(), options.DefaultKubeletPluginsDirName)
|
||||
}
|
||||
|
||||
// getPluginDir returns a data directory name for a given plugin name.
|
||||
|
|
@ -80,7 +80,7 @@ func (kl *Kubelet) getPodDir(podUID types.UID) string {
|
|||
// which volumes are created for the specified pod. This directory may not
|
||||
// exist if the pod does not exist.
|
||||
func (kl *Kubelet) getPodVolumesDir(podUID types.UID) string {
|
||||
return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumesDirName)
|
||||
return filepath.Join(kl.getPodDir(podUID), options.DefaultKubeletVolumesDirName)
|
||||
}
|
||||
|
||||
// getPodVolumeDir returns the full path to the directory which represents the
|
||||
|
|
@ -94,7 +94,7 @@ func (kl *Kubelet) getPodVolumeDir(podUID types.UID, pluginName string, volumeNa
|
|||
// which plugins may store data for the specified pod. This directory may not
|
||||
// exist if the pod does not exist.
|
||||
func (kl *Kubelet) getPodPluginsDir(podUID types.UID) string {
|
||||
return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletPluginsDirName)
|
||||
return filepath.Join(kl.getPodDir(podUID), options.DefaultKubeletPluginsDirName)
|
||||
}
|
||||
|
||||
// getPodPluginDir returns a data directory name for a given plugin name for a
|
||||
|
|
@ -108,7 +108,7 @@ func (kl *Kubelet) getPodPluginDir(podUID types.UID, pluginName string) string {
|
|||
// which container data is held for the specified pod. This directory may not
|
||||
// exist if the pod or container does not exist.
|
||||
func (kl *Kubelet) getPodContainerDir(podUID types.UID, ctrName string) string {
|
||||
return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletContainersDirName, ctrName)
|
||||
return filepath.Join(kl.getPodDir(podUID), options.DefaultKubeletContainersDirName, ctrName)
|
||||
}
|
||||
|
||||
// GetPods returns all pods bound to the kubelet and their spec, and the mirror
|
||||
|
|
|
|||
34
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go
generated
vendored
34
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go
generated
vendored
|
|
@ -30,6 +30,7 @@ import (
|
|||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/conversion"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
|
|
@ -117,9 +118,15 @@ func (kl *Kubelet) tryRegisterWithAPIServer(node *v1.Node) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
originalNode := existingNode.DeepCopy()
|
||||
if originalNode == nil {
|
||||
glog.Errorf("Nil %q node object", kl.nodeName)
|
||||
clonedNode, err := conversion.NewCloner().DeepCopy(existingNode)
|
||||
if err != nil {
|
||||
glog.Errorf("Unable to clone %q node object %#v: %v", kl.nodeName, existingNode, err)
|
||||
return false
|
||||
}
|
||||
|
||||
originalNode, ok := clonedNode.(*v1.Node)
|
||||
if !ok || originalNode == nil {
|
||||
glog.Errorf("Unable to cast %q node object %#v to v1.Node", kl.nodeName, clonedNode)
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
@ -169,6 +176,10 @@ func (kl *Kubelet) updateDefaultLabels(initialNode, existingNode *v1.Node) bool
|
|||
var needsUpdate bool = false
|
||||
//Set default labels but make sure to not set labels with empty values
|
||||
for _, label := range defaultLabels {
|
||||
if _, hasInitialValue := initialNode.Labels[label]; !hasInitialValue {
|
||||
continue
|
||||
}
|
||||
|
||||
if existingNode.Labels[label] != initialNode.Labels[label] {
|
||||
existingNode.Labels[label] = initialNode.Labels[label]
|
||||
needsUpdate = true
|
||||
|
|
@ -272,7 +283,7 @@ func (kl *Kubelet) initialNode() (*v1.Node, error) {
|
|||
glog.Infof("Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes")
|
||||
}
|
||||
|
||||
if kl.keepTerminatedPodVolumes {
|
||||
if kl.kubeletConfiguration.KeepTerminatedPodVolumes {
|
||||
if node.Annotations == nil {
|
||||
node.Annotations = make(map[string]string)
|
||||
}
|
||||
|
|
@ -402,9 +413,14 @@ func (kl *Kubelet) tryUpdateNodeStatus(tryNumber int) error {
|
|||
return fmt.Errorf("error getting node %q: %v", kl.nodeName, err)
|
||||
}
|
||||
|
||||
originalNode := node.DeepCopy()
|
||||
if originalNode == nil {
|
||||
return fmt.Errorf("nil %q node object", kl.nodeName)
|
||||
clonedNode, err := conversion.NewCloner().DeepCopy(node)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error clone node %q: %v", kl.nodeName, err)
|
||||
}
|
||||
|
||||
originalNode, ok := clonedNode.(*v1.Node)
|
||||
if !ok || originalNode == nil {
|
||||
return fmt.Errorf("failed to cast %q node object %#v to v1.Node", kl.nodeName, clonedNode)
|
||||
}
|
||||
|
||||
kl.updatePodCIDR(node.Spec.PodCIDR)
|
||||
|
|
@ -440,9 +456,6 @@ func (kl *Kubelet) setNodeAddress(node *v1.Node) error {
|
|||
}
|
||||
|
||||
if kl.externalCloudProvider {
|
||||
if kl.nodeIP != nil {
|
||||
node.ObjectMeta.Annotations[kubeletapis.AnnotationProvidedIPAddr] = kl.nodeIP.String()
|
||||
}
|
||||
// We rely on the external cloud provider to supply the addresses.
|
||||
return nil
|
||||
}
|
||||
|
|
@ -500,6 +513,7 @@ func (kl *Kubelet) setNodeAddress(node *v1.Node) error {
|
|||
// 4) Try to get the IP from the network interface used as default gateway
|
||||
if kl.nodeIP != nil {
|
||||
ipAddr = kl.nodeIP
|
||||
node.ObjectMeta.Annotations[kubeletapis.AnnotationProvidedIPAddr] = kl.nodeIP.String()
|
||||
} else if addr := net.ParseIP(kl.hostname); addr != nil {
|
||||
ipAddr = addr
|
||||
} else {
|
||||
|
|
|
|||
31
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status_test.go
generated
vendored
31
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status_test.go
generated
vendored
|
|
@ -1233,6 +1233,37 @@ func TestUpdateDefaultLabels(t *testing.T) {
|
|||
"please-persist": "foo",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "make sure existing labels do not get deleted when initial node has no opinion",
|
||||
initialNode: &v1.Node{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Labels: map[string]string{},
|
||||
},
|
||||
},
|
||||
existingNode: &v1.Node{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Labels: map[string]string{
|
||||
kubeletapis.LabelHostname: "new-hostname",
|
||||
kubeletapis.LabelZoneFailureDomain: "new-zone-failure-domain",
|
||||
kubeletapis.LabelZoneRegion: "new-zone-region",
|
||||
kubeletapis.LabelInstanceType: "new-instance-type",
|
||||
kubeletapis.LabelOS: "new-os",
|
||||
kubeletapis.LabelArch: "new-arch",
|
||||
"please-persist": "foo",
|
||||
},
|
||||
},
|
||||
},
|
||||
needsUpdate: false,
|
||||
finalLabels: map[string]string{
|
||||
kubeletapis.LabelHostname: "new-hostname",
|
||||
kubeletapis.LabelZoneFailureDomain: "new-zone-failure-domain",
|
||||
kubeletapis.LabelZoneRegion: "new-zone-region",
|
||||
kubeletapis.LabelInstanceType: "new-instance-type",
|
||||
kubeletapis.LabelOS: "new-os",
|
||||
kubeletapis.LabelArch: "new-arch",
|
||||
"please-persist": "foo",
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "no update needed",
|
||||
initialNode: &v1.Node{
|
||||
|
|
|
|||
19
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go
generated
vendored
19
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go
generated
vendored
|
|
@ -127,8 +127,8 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
|
|||
mountEtcHostsFile = mountEtcHostsFile && (mount.MountPath != etcHostsPath)
|
||||
vol, ok := podVolumes[mount.Name]
|
||||
if !ok || vol.Mounter == nil {
|
||||
glog.Errorf("Mount cannot be satisfied for container %q, because the volume is missing or the volume mounter is nil: %+v", container.Name, mount)
|
||||
return nil, fmt.Errorf("cannot find volume %q to mount into container %q", mount.Name, container.Name)
|
||||
glog.Warningf("Mount cannot be satisfied for container %q, because the volume is missing or the volume mounter is nil: %q", container.Name, mount)
|
||||
continue
|
||||
}
|
||||
|
||||
relabelVolume := false
|
||||
|
|
@ -864,7 +864,7 @@ func (kl *Kubelet) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bo
|
|||
glog.V(3).Infof("Pod %q is terminated, but some containers have not been cleaned up: %+v", format.Pod(pod), runtimeStatus.ContainerStatuses)
|
||||
return false
|
||||
}
|
||||
if kl.podVolumesExist(pod.UID) && !kl.keepTerminatedPodVolumes {
|
||||
if kl.podVolumesExist(pod.UID) && !kl.kubeletConfiguration.KeepTerminatedPodVolumes {
|
||||
// We shouldnt delete pods whose volumes have not been cleaned up if we are not keeping terminated pod volumes
|
||||
glog.V(3).Infof("Pod %q is terminated, but some volumes have not been cleaned up", format.Pod(pod))
|
||||
return false
|
||||
|
|
@ -1348,16 +1348,21 @@ func (kl *Kubelet) convertStatusToAPIStatus(pod *v1.Pod, podStatus *kubecontaine
|
|||
// set status for Pods created on versions of kube older than 1.6
|
||||
apiPodStatus.QOSClass = v1qos.GetPodQOS(pod)
|
||||
|
||||
oldPodStatus, found := kl.statusManager.GetPodStatus(pod.UID)
|
||||
if !found {
|
||||
oldPodStatus = pod.Status
|
||||
}
|
||||
|
||||
apiPodStatus.ContainerStatuses = kl.convertToAPIContainerStatuses(
|
||||
pod, podStatus,
|
||||
pod.Status.ContainerStatuses,
|
||||
oldPodStatus.ContainerStatuses,
|
||||
pod.Spec.Containers,
|
||||
len(pod.Spec.InitContainers) > 0,
|
||||
false,
|
||||
)
|
||||
apiPodStatus.InitContainerStatuses = kl.convertToAPIContainerStatuses(
|
||||
pod, podStatus,
|
||||
pod.Status.InitContainerStatuses,
|
||||
oldPodStatus.InitContainerStatuses,
|
||||
pod.Spec.InitContainers,
|
||||
len(pod.Spec.InitContainers) > 0,
|
||||
true,
|
||||
|
|
@ -1424,7 +1429,7 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
|
|||
}
|
||||
oldStatus, found := oldStatuses[container.Name]
|
||||
if found {
|
||||
if isInitContainer && oldStatus.State.Terminated != nil {
|
||||
if oldStatus.State.Terminated != nil {
|
||||
// Do not update status on terminated init containers as
|
||||
// they be removed at any time.
|
||||
status = &oldStatus
|
||||
|
|
@ -1704,7 +1709,7 @@ func (kl *Kubelet) cleanupOrphanedPodCgroups(cgroupPods map[types.UID]cm.CgroupN
|
|||
// parent croup. If the volumes still exist, reduce the cpu shares for any
|
||||
// process in the cgroup to the minimum value while we wait. if the kubelet
|
||||
// is configured to keep terminated volumes, we will delete the cgroup and not block.
|
||||
if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist && !kl.keepTerminatedPodVolumes {
|
||||
if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist && !kl.kubeletConfiguration.KeepTerminatedPodVolumes {
|
||||
glog.V(3).Infof("Orphaned pod %q found, but volumes not yet removed. Reducing cpu to minimum", uid)
|
||||
if err := pcm.ReduceCPULimits(val); err != nil {
|
||||
glog.Warningf("Failed to reduce cpu time for pod %q pending volume cleanup due to %v", uid, err)
|
||||
|
|
|
|||
30
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods_test.go
generated
vendored
30
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods_test.go
generated
vendored
|
|
@ -223,36 +223,6 @@ func TestMakeMounts(t *testing.T) {
|
|||
expectErr: true,
|
||||
expectedErrMsg: "unable to provision SubPath `no/backsteps/../allowed`: must not contain '..'",
|
||||
},
|
||||
"volume doesn't exist": {
|
||||
podVolumes: kubecontainer.VolumeMap{},
|
||||
container: v1.Container{
|
||||
VolumeMounts: []v1.VolumeMount{
|
||||
{
|
||||
MountPath: "/mnt/path3",
|
||||
Name: "disk",
|
||||
ReadOnly: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
expectErr: true,
|
||||
expectedErrMsg: "cannot find volume \"disk\" to mount into container \"\"",
|
||||
},
|
||||
"volume mounter is nil": {
|
||||
podVolumes: kubecontainer.VolumeMap{
|
||||
"disk": kubecontainer.VolumeInfo{},
|
||||
},
|
||||
container: v1.Container{
|
||||
VolumeMounts: []v1.VolumeMount{
|
||||
{
|
||||
MountPath: "/mnt/path3",
|
||||
Name: "disk",
|
||||
ReadOnly: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
expectErr: true,
|
||||
expectedErrMsg: "cannot find volume \"disk\" to mount into container \"\"",
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range testCases {
|
||||
|
|
|
|||
19
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go
generated
vendored
19
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go
generated
vendored
|
|
@ -22,6 +22,7 @@ import (
|
|||
"github.com/golang/glog"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
"k8s.io/client-go/kubernetes/scheme"
|
||||
"k8s.io/kubernetes/pkg/api/v1/resource"
|
||||
)
|
||||
|
||||
|
|
@ -43,14 +44,28 @@ func (kl *Kubelet) defaultPodLimitsForDownwardAPI(pod *v1.Pod, container *v1.Con
|
|||
}
|
||||
allocatable := node.Status.Allocatable
|
||||
glog.Infof("allocatable: %v", allocatable)
|
||||
outputPod := pod.DeepCopy()
|
||||
podCopy, err := scheme.Scheme.Copy(pod)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to perform a deep copy of pod object: %v", err)
|
||||
}
|
||||
outputPod, ok := podCopy.(*v1.Pod)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("unexpected type returned from deep copy of pod object")
|
||||
}
|
||||
for idx := range outputPod.Spec.Containers {
|
||||
resource.MergeContainerResourceLimits(&outputPod.Spec.Containers[idx], allocatable)
|
||||
}
|
||||
|
||||
var outputContainer *v1.Container
|
||||
if container != nil {
|
||||
outputContainer = container.DeepCopy()
|
||||
containerCopy, err := scheme.Scheme.DeepCopy(container)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to perform a deep copy of container object: %v", err)
|
||||
}
|
||||
outputContainer, ok = containerCopy.(*v1.Container)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("unexpected type returned from deep copy of container object")
|
||||
}
|
||||
resource.MergeContainerResourceLimits(outputContainer, allocatable)
|
||||
}
|
||||
return outputPod, outputContainer, nil
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go
generated
vendored
|
|
@ -69,6 +69,7 @@ func (kl *Kubelet) newVolumeMounterFromPlugins(spec *volume.Spec, pod *v1.Pod, o
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("can't use volume plugins for %s: %v", spec.Name(), err)
|
||||
}
|
||||
opts.Containerized = kl.kubeletConfiguration.Containerized
|
||||
physicalMounter, err := plugin.NewMounter(spec, pod, opts)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to instantiate mounter for volume: %s using plugin: %s with a root cause: %v", spec.Name(), plugin.GetPluginName(), err)
|
||||
|
|
|
|||
24
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes_test.go
generated
vendored
24
vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes_test.go
generated
vendored
|
|
@ -58,7 +58,9 @@ func TestListVolumesForPod(t *testing.T) {
|
|||
})
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
kubelet.podManager.SetPods([]*v1.Pod{pod})
|
||||
err := kubelet.volumeManager.WaitForAttachAndMount(pod)
|
||||
|
|
@ -140,7 +142,9 @@ func TestPodVolumesExist(t *testing.T) {
|
|||
}
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
kubelet.podManager.SetPods(pods)
|
||||
for _, pod := range pods {
|
||||
|
|
@ -173,7 +177,9 @@ func TestVolumeAttachAndMountControllerDisabled(t *testing.T) {
|
|||
})
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
kubelet.podManager.SetPods([]*v1.Pod{pod})
|
||||
err := kubelet.volumeManager.WaitForAttachAndMount(pod)
|
||||
|
|
@ -217,7 +223,9 @@ func TestVolumeUnmountAndDetachControllerDisabled(t *testing.T) {
|
|||
})
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
// Add pod
|
||||
kubelet.podManager.SetPods([]*v1.Pod{pod})
|
||||
|
|
@ -304,7 +312,9 @@ func TestVolumeAttachAndMountControllerEnabled(t *testing.T) {
|
|||
})
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
kubelet.podManager.SetPods([]*v1.Pod{pod})
|
||||
|
||||
|
|
@ -371,7 +381,9 @@ func TestVolumeUnmountAndDetachControllerEnabled(t *testing.T) {
|
|||
})
|
||||
|
||||
stopCh := runVolumeManager(kubelet)
|
||||
defer close(stopCh)
|
||||
defer func() {
|
||||
close(stopCh)
|
||||
}()
|
||||
|
||||
// Add pod
|
||||
kubelet.podManager.SetPods([]*v1.Pod{pod})
|
||||
|
|
|
|||
11
vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go
generated
vendored
11
vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go
generated
vendored
|
|
@ -162,9 +162,6 @@ func (p *podWorkers) managePodLoop(podUpdates <-chan UpdatePodOptions) {
|
|||
// the previous sync.
|
||||
status, err := p.podCache.GetNewerThan(podUID, lastSyncTime)
|
||||
if err != nil {
|
||||
// This is the legacy event thrown by manage pod loop
|
||||
// all other events are now dispatched from syncPodFn
|
||||
p.recorder.Eventf(update.Pod, v1.EventTypeWarning, events.FailedSync, "error determining status: %v", err)
|
||||
return err
|
||||
}
|
||||
err = p.syncPodFn(syncPodOptions{
|
||||
|
|
@ -182,8 +179,14 @@ func (p *podWorkers) managePodLoop(podUpdates <-chan UpdatePodOptions) {
|
|||
update.OnCompleteFunc(err)
|
||||
}
|
||||
if err != nil {
|
||||
// IMPORTANT: we do not log errors here, the syncPodFn is responsible for logging errors
|
||||
glog.Errorf("Error syncing pod %s (%q), skipping: %v", update.Pod.UID, format.Pod(update.Pod), err)
|
||||
// if we failed sync, we throw more specific events for why it happened.
|
||||
// as a result, i question the value of this event.
|
||||
// TODO: determine if we can remove this in a future release.
|
||||
// do not include descriptive text that can vary on why it failed so in a pathological
|
||||
// scenario, kubelet does not create enough discrete events that miss default aggregation
|
||||
// window.
|
||||
p.recorder.Eventf(update.Pod, v1.EventTypeWarning, events.FailedSync, "Error syncing pod")
|
||||
}
|
||||
p.wrapUp(update.Pod.UID, err)
|
||||
}
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD
generated
vendored
|
|
@ -15,7 +15,6 @@ go_library(
|
|||
"pod_update.go",
|
||||
"types.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/types",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
@ -31,7 +30,6 @@ go_test(
|
|||
"pod_update_test.go",
|
||||
"types_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/types",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["util_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util",
|
||||
library = ":go_default_library",
|
||||
deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"],
|
||||
)
|
||||
|
|
@ -29,7 +28,6 @@ go_library(
|
|||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util",
|
||||
deps = [
|
||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||
] + select({
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD
generated
vendored
|
|
@ -12,7 +12,6 @@ go_library(
|
|||
"pod.go",
|
||||
"resources.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/format",
|
||||
deps = [
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||
|
|
@ -22,7 +21,6 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["resources_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/format",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/kubelet/util/ioutils/BUILD
generated
vendored
|
|
@ -8,7 +8,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["ioutils.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/ioutils",
|
||||
)
|
||||
|
||||
filegroup(
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD
generated
vendored
|
|
@ -9,7 +9,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["sliceutils.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/sliceutils",
|
||||
deps = [
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||
|
|
@ -32,7 +31,6 @@ filegroup(
|
|||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["sliceutils_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/kubelet/util/sliceutils",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//pkg/kubelet/container:go_default_library",
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/security/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/security/BUILD
generated
vendored
|
|
@ -8,7 +8,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["doc.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/security",
|
||||
)
|
||||
|
||||
filegroup(
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD
generated
vendored
|
|
@ -13,7 +13,6 @@ go_library(
|
|||
"validate.go",
|
||||
"validate_disabled.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/security/apparmor",
|
||||
deps = [
|
||||
"//pkg/features:go_default_library",
|
||||
"//pkg/kubelet/types:go_default_library",
|
||||
|
|
@ -29,7 +28,6 @@ go_test(
|
|||
data = [
|
||||
"testdata/profiles",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/security/apparmor",
|
||||
library = ":go_default_library",
|
||||
deps = [
|
||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||
|
|
|
|||
7
vendor/k8s.io/kubernetes/pkg/security/apparmor/helpers.go
generated
vendored
7
vendor/k8s.io/kubernetes/pkg/security/apparmor/helpers.go
generated
vendored
|
|
@ -35,16 +35,13 @@ const (
|
|||
ProfileRuntimeDefault = "runtime/default"
|
||||
// The prefix for specifying profiles loaded on the node.
|
||||
ProfileNamePrefix = "localhost/"
|
||||
|
||||
// Unconfined profile
|
||||
ProfileNameUnconfined = "unconfined"
|
||||
)
|
||||
|
||||
// Checks whether app armor is required for pod to be run.
|
||||
func isRequired(pod *v1.Pod) bool {
|
||||
for key, value := range pod.Annotations {
|
||||
for key := range pod.Annotations {
|
||||
if strings.HasPrefix(key, ContainerAnnotationKeyPrefix) {
|
||||
return value != ProfileNameUnconfined
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/security/apparmor/validate.go
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/security/apparmor/validate.go
generated
vendored
|
|
@ -136,7 +136,7 @@ func validateProfile(profile string, loadedProfiles map[string]bool) error {
|
|||
}
|
||||
|
||||
func ValidateProfileFormat(profile string) error {
|
||||
if profile == "" || profile == ProfileRuntimeDefault || profile == ProfileNameUnconfined {
|
||||
if profile == "" || profile == ProfileRuntimeDefault {
|
||||
return nil
|
||||
}
|
||||
if !strings.HasPrefix(profile, ProfileNamePrefix) {
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/security/apparmor/validate_test.go
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/security/apparmor/validate_test.go
generated
vendored
|
|
@ -63,7 +63,6 @@ func TestValidateProfile(t *testing.T) {
|
|||
}{
|
||||
{"", true},
|
||||
{ProfileRuntimeDefault, true},
|
||||
{ProfileNameUnconfined, true},
|
||||
{"baz", false}, // Missing local prefix.
|
||||
{ProfileNamePrefix + "/usr/sbin/ntpd", true},
|
||||
{ProfileNamePrefix + "foo-bar", true},
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD
generated
vendored
|
|
@ -12,7 +12,6 @@ go_library(
|
|||
"jwt.go",
|
||||
"util.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/serviceaccount",
|
||||
deps = [
|
||||
"//pkg/api:go_default_library",
|
||||
"//vendor/github.com/dgrijalva/jwt-go:go_default_library",
|
||||
|
|
@ -27,7 +26,6 @@ go_library(
|
|||
go_test(
|
||||
name = "go_default_xtest",
|
||||
srcs = ["jwt_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/serviceaccount_test",
|
||||
deps = [
|
||||
":go_default_library",
|
||||
"//pkg/controller/serviceaccount:go_default_library",
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/util/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/util/BUILD
generated
vendored
|
|
@ -38,7 +38,6 @@ filegroup(
|
|||
"//pkg/util/net:all-srcs",
|
||||
"//pkg/util/netsh:all-srcs",
|
||||
"//pkg/util/node:all-srcs",
|
||||
"//pkg/util/nsenter:all-srcs",
|
||||
"//pkg/util/oom:all-srcs",
|
||||
"//pkg/util/parsers:all-srcs",
|
||||
"//pkg/util/pointer:all-srcs",
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/util/file/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/util/file/BUILD
generated
vendored
|
|
@ -8,7 +8,6 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["file.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/file",
|
||||
)
|
||||
|
||||
filegroup(
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/util/filesystem/BUILD
generated
vendored
|
|
@ -13,7 +13,6 @@ go_library(
|
|||
"filesystem.go",
|
||||
"watcher.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/filesystem",
|
||||
deps = [
|
||||
"//vendor/github.com/fsnotify/fsnotify:go_default_library",
|
||||
"//vendor/github.com/spf13/afero:go_default_library",
|
||||
|
|
|
|||
5
vendor/k8s.io/kubernetes/pkg/util/filesystem/defaultfs.go
generated
vendored
5
vendor/k8s.io/kubernetes/pkg/util/filesystem/defaultfs.go
generated
vendored
|
|
@ -62,11 +62,6 @@ func (DefaultFs) RemoveAll(path string) error {
|
|||
return os.RemoveAll(path)
|
||||
}
|
||||
|
||||
// Remove via os.RemoveAll
|
||||
func (DefaultFs) Remove(name string) error {
|
||||
return os.Remove(name)
|
||||
}
|
||||
|
||||
// ReadFile via ioutil.ReadFile
|
||||
func (DefaultFs) ReadFile(filename string) ([]byte, error) {
|
||||
return ioutil.ReadFile(filename)
|
||||
|
|
|
|||
5
vendor/k8s.io/kubernetes/pkg/util/filesystem/fakefs.go
generated
vendored
5
vendor/k8s.io/kubernetes/pkg/util/filesystem/fakefs.go
generated
vendored
|
|
@ -92,11 +92,6 @@ func (fs *fakeFs) RemoveAll(path string) error {
|
|||
return fs.a.RemoveAll(path)
|
||||
}
|
||||
|
||||
// Remove via afero.RemoveAll
|
||||
func (fs *fakeFs) Remove(name string) error {
|
||||
return fs.a.Remove(name)
|
||||
}
|
||||
|
||||
// fakeFile implements File; for use with fakeFs
|
||||
type fakeFile struct {
|
||||
file afero.File
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/util/filesystem/filesystem.go
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/util/filesystem/filesystem.go
generated
vendored
|
|
@ -31,7 +31,6 @@ type Filesystem interface {
|
|||
MkdirAll(path string, perm os.FileMode) error
|
||||
Chtimes(name string, atime time.Time, mtime time.Time) error
|
||||
RemoveAll(path string) error
|
||||
Remove(name string) error
|
||||
|
||||
// from "io/ioutil"
|
||||
ReadFile(filename string) ([]byte, error)
|
||||
|
|
|
|||
2
vendor/k8s.io/kubernetes/pkg/util/hash/BUILD
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/util/hash/BUILD
generated
vendored
|
|
@ -9,14 +9,12 @@ load(
|
|||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["hash.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/hash",
|
||||
deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"],
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["hash_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/hash",
|
||||
library = ":go_default_library",
|
||||
deps = ["//vendor/github.com/davecgh/go-spew/spew:go_default_library"],
|
||||
)
|
||||
|
|
|
|||
1
vendor/k8s.io/kubernetes/pkg/util/io/BUILD
generated
vendored
1
vendor/k8s.io/kubernetes/pkg/util/io/BUILD
generated
vendored
|
|
@ -11,7 +11,6 @@ go_library(
|
|||
"consistentread.go",
|
||||
"writer.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/util/io",
|
||||
deps = ["//vendor/github.com/golang/glog:go_default_library"],
|
||||
)
|
||||
|
||||
|
|
|
|||
3
vendor/k8s.io/kubernetes/pkg/util/mount/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/util/mount/BUILD
generated
vendored
|
|
@ -25,14 +25,12 @@ go_library(
|
|||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
importpath = "k8s.io/kubernetes/pkg/util/mount",
|
||||
deps = [
|
||||
"//vendor/github.com/golang/glog:go_default_library",
|
||||
"//vendor/k8s.io/utils/exec:go_default_library",
|
||||
] + select({
|
||||
"@io_bazel_rules_go//go/platform:linux_amd64": [
|
||||
"//pkg/util/io:go_default_library",
|
||||
"//pkg/util/nsenter:go_default_library",
|
||||
"//vendor/golang.org/x/sys/unix:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||
],
|
||||
|
|
@ -54,7 +52,6 @@ go_test(
|
|||
],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
importpath = "k8s.io/kubernetes/pkg/util/mount",
|
||||
library = ":go_default_library",
|
||||
deps = ["//vendor/k8s.io/utils/exec/testing:go_default_library"],
|
||||
)
|
||||
|
|
|
|||
18
vendor/k8s.io/kubernetes/pkg/util/mount/fake.go
generated
vendored
18
vendor/k8s.io/kubernetes/pkg/util/mount/fake.go
generated
vendored
|
|
@ -125,7 +125,7 @@ func (f *FakeMounter) List() ([]MountPoint, error) {
|
|||
}
|
||||
|
||||
func (f *FakeMounter) IsMountPointMatch(mp MountPoint, dir string) bool {
|
||||
return mp.Path == dir
|
||||
return (mp.Path == dir)
|
||||
}
|
||||
|
||||
func (f *FakeMounter) IsNotMountPoint(dir string) (bool, error) {
|
||||
|
|
@ -175,19 +175,3 @@ func (f *FakeMounter) GetDeviceNameFromMount(mountPath, pluginDir string) (strin
|
|||
func (f *FakeMounter) MakeRShared(path string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FakeMounter) GetFileType(pathname string) (FileType, error) {
|
||||
return FileType("fake"), nil
|
||||
}
|
||||
|
||||
func (f *FakeMounter) MakeDir(pathname string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FakeMounter) MakeFile(pathname string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FakeMounter) ExistsPath(pathname string) bool {
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
91
vendor/k8s.io/kubernetes/pkg/util/mount/mount.go
generated
vendored
91
vendor/k8s.io/kubernetes/pkg/util/mount/mount.go
generated
vendored
|
|
@ -19,25 +19,13 @@ limitations under the License.
|
|||
package mount
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/golang/glog"
|
||||
)
|
||||
|
||||
type FileType string
|
||||
|
||||
const (
|
||||
// Default mount command if mounter path is not specified
|
||||
defaultMountCommand = "mount"
|
||||
MountsInGlobalPDPath = "mounts"
|
||||
FileTypeDirectory FileType = "Directory"
|
||||
FileTypeFile FileType = "File"
|
||||
FileTypeSocket FileType = "Socket"
|
||||
FileTypeCharDev FileType = "CharDevice"
|
||||
FileTypeBlockDev FileType = "BlockDevice"
|
||||
defaultMountCommand = "mount"
|
||||
MountsInGlobalPDPath = "mounts"
|
||||
)
|
||||
|
||||
type Interface interface {
|
||||
|
|
@ -77,18 +65,6 @@ type Interface interface {
|
|||
// MakeRShared checks that given path is on a mount with 'rshared' mount
|
||||
// propagation. If not, it bind-mounts the path as rshared.
|
||||
MakeRShared(path string) error
|
||||
// GetFileType checks for file/directory/socket/block/character devices.
|
||||
// Will operate in the host mount namespace if kubelet is running in a container
|
||||
GetFileType(pathname string) (FileType, error)
|
||||
// MakeFile creates an empty file.
|
||||
// Will operate in the host mount namespace if kubelet is running in a container
|
||||
MakeFile(pathname string) error
|
||||
// MakeDir creates a new directory.
|
||||
// Will operate in the host mount namespace if kubelet is running in a container
|
||||
MakeDir(pathname string) error
|
||||
// ExistsPath checks whether the path exists.
|
||||
// Will operate in the host mount namespace if kubelet is running in a container
|
||||
ExistsPath(pathname string) bool
|
||||
}
|
||||
|
||||
// Exec executes command where mount utilities are. This can be either the host,
|
||||
|
|
@ -138,41 +114,6 @@ func (mounter *SafeFormatAndMount) FormatAndMount(source string, target string,
|
|||
return mounter.formatAndMount(source, target, fstype, options)
|
||||
}
|
||||
|
||||
// GetMountRefs finds all other references to the device referenced
|
||||
// by mountPath; returns a list of paths.
|
||||
func GetMountRefs(mounter Interface, mountPath string) ([]string, error) {
|
||||
mps, err := mounter.List()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Find the device name.
|
||||
deviceName := ""
|
||||
// If mountPath is symlink, need get its target path.
|
||||
slTarget, err := filepath.EvalSymlinks(mountPath)
|
||||
if err != nil {
|
||||
slTarget = mountPath
|
||||
}
|
||||
for i := range mps {
|
||||
if mps[i].Path == slTarget {
|
||||
deviceName = mps[i].Device
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Find all references to the device.
|
||||
var refs []string
|
||||
if deviceName == "" {
|
||||
glog.Warningf("could not determine device for path: %q", mountPath)
|
||||
} else {
|
||||
for i := range mps {
|
||||
if mps[i].Device == deviceName && mps[i].Path != slTarget {
|
||||
refs = append(refs, mps[i].Path)
|
||||
}
|
||||
}
|
||||
}
|
||||
return refs, nil
|
||||
}
|
||||
|
||||
// GetMountRefsByDev finds all references to the device provided
|
||||
// by mountPath; returns a list of paths.
|
||||
func GetMountRefsByDev(mounter Interface, mountPath string) ([]string, error) {
|
||||
|
|
@ -239,34 +180,6 @@ func GetDeviceNameFromMount(mounter Interface, mountPath string) (string, int, e
|
|||
return device, refCount, nil
|
||||
}
|
||||
|
||||
// getDeviceNameFromMount find the device name from /proc/mounts in which
|
||||
// the mount path reference should match the given plugin directory. In case no mount path reference
|
||||
// matches, returns the volume name taken from its given mountPath
|
||||
func getDeviceNameFromMount(mounter Interface, mountPath, pluginDir string) (string, error) {
|
||||
refs, err := GetMountRefs(mounter, mountPath)
|
||||
if err != nil {
|
||||
glog.V(4).Infof("GetMountRefs failed for mount path %q: %v", mountPath, err)
|
||||
return "", err
|
||||
}
|
||||
if len(refs) == 0 {
|
||||
glog.V(4).Infof("Directory %s is not mounted", mountPath)
|
||||
return "", fmt.Errorf("directory %s is not mounted", mountPath)
|
||||
}
|
||||
basemountPath := path.Join(pluginDir, MountsInGlobalPDPath)
|
||||
for _, ref := range refs {
|
||||
if strings.HasPrefix(ref, basemountPath) {
|
||||
volumeID, err := filepath.Rel(basemountPath, ref)
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to get volume id from mount %s - %v", mountPath, err)
|
||||
return "", err
|
||||
}
|
||||
return volumeID, nil
|
||||
}
|
||||
}
|
||||
|
||||
return path.Base(mountPath), nil
|
||||
}
|
||||
|
||||
// IsNotMountPoint determines if a directory is a mountpoint.
|
||||
// It should return ErrNotExist when the directory does not exist.
|
||||
// This method uses the List() of all mountpoints
|
||||
|
|
|
|||
170
vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go
generated
vendored
170
vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go
generated
vendored
|
|
@ -22,6 +22,8 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
|
@ -42,6 +44,9 @@ const (
|
|||
procMountsPath = "/proc/mounts"
|
||||
// Location of the mountinfo file
|
||||
procMountInfoPath = "/proc/self/mountinfo"
|
||||
)
|
||||
|
||||
const (
|
||||
// 'fsck' found errors and corrected them
|
||||
fsckErrorsCorrected = 1
|
||||
// 'fsck' found errors but exited without correcting them
|
||||
|
|
@ -68,12 +73,12 @@ func New(mounterPath string) Interface {
|
|||
|
||||
// Mount mounts source to target as fstype with given options. 'source' and 'fstype' must
|
||||
// be an emtpy string in case it's not required, e.g. for remount, or for auto filesystem
|
||||
// type, where kernel handles fstype for you. The mount 'options' is a list of options,
|
||||
// type, where kernel handles fs type for you. The mount 'options' is a list of options,
|
||||
// currently come from mount(8), e.g. "ro", "remount", "bind", etc. If no more option is
|
||||
// required, call Mount with an empty string list or nil.
|
||||
func (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error {
|
||||
// Path to mounter binary if containerized mounter is needed. Otherwise, it is set to empty.
|
||||
// All Linux distros are expected to be shipped with a mount utility that a support bind mounts.
|
||||
// All Linux distros are expected to be shipped with a mount utility that an support bind mounts.
|
||||
mounterPath := ""
|
||||
bind, bindRemountOpts := isBind(options)
|
||||
if bind {
|
||||
|
|
@ -141,6 +146,41 @@ func (m *Mounter) doMount(mounterPath string, mountCmd string, source string, ta
|
|||
return err
|
||||
}
|
||||
|
||||
// GetMountRefs finds all other references to the device referenced
|
||||
// by mountPath; returns a list of paths.
|
||||
func GetMountRefs(mounter Interface, mountPath string) ([]string, error) {
|
||||
mps, err := mounter.List()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Find the device name.
|
||||
deviceName := ""
|
||||
// If mountPath is symlink, need get its target path.
|
||||
slTarget, err := filepath.EvalSymlinks(mountPath)
|
||||
if err != nil {
|
||||
slTarget = mountPath
|
||||
}
|
||||
for i := range mps {
|
||||
if mps[i].Path == slTarget {
|
||||
deviceName = mps[i].Device
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Find all references to the device.
|
||||
var refs []string
|
||||
if deviceName == "" {
|
||||
glog.Warningf("could not determine device for path: %q", mountPath)
|
||||
} else {
|
||||
for i := range mps {
|
||||
if mps[i].Device == deviceName && mps[i].Path != slTarget {
|
||||
refs = append(refs, mps[i].Path)
|
||||
}
|
||||
}
|
||||
}
|
||||
return refs, nil
|
||||
}
|
||||
|
||||
// detectSystemd returns true if OS runs with systemd as init. When not sure
|
||||
// (permission errors, ...), it returns false.
|
||||
// There may be different ways how to detect systemd, this one makes sure that
|
||||
|
|
@ -252,29 +292,17 @@ func (mounter *Mounter) DeviceOpened(pathname string) (bool, error) {
|
|||
// PathIsDevice uses FileInfo returned from os.Stat to check if path refers
|
||||
// to a device.
|
||||
func (mounter *Mounter) PathIsDevice(pathname string) (bool, error) {
|
||||
pathType, err := mounter.GetFileType(pathname)
|
||||
isDevice := pathType == FileTypeCharDev || pathType == FileTypeBlockDev
|
||||
return isDevice, err
|
||||
return pathIsDevice(pathname)
|
||||
}
|
||||
|
||||
func exclusiveOpenFailsOnDevice(pathname string) (bool, error) {
|
||||
var isDevice bool
|
||||
finfo, err := os.Stat(pathname)
|
||||
if os.IsNotExist(err) {
|
||||
isDevice = false
|
||||
}
|
||||
// err in call to os.Stat
|
||||
isDevice, err := pathIsDevice(pathname)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf(
|
||||
"PathIsDevice failed for path %q: %v",
|
||||
pathname,
|
||||
err)
|
||||
}
|
||||
// path refers to a device
|
||||
if finfo.Mode()&os.ModeDevice != 0 {
|
||||
isDevice = true
|
||||
}
|
||||
|
||||
if !isDevice {
|
||||
glog.Errorf("Path %q is not refering to a device.", pathname)
|
||||
return false, nil
|
||||
|
|
@ -294,11 +322,56 @@ func exclusiveOpenFailsOnDevice(pathname string) (bool, error) {
|
|||
return false, errno
|
||||
}
|
||||
|
||||
func pathIsDevice(pathname string) (bool, error) {
|
||||
finfo, err := os.Stat(pathname)
|
||||
if os.IsNotExist(err) {
|
||||
return false, nil
|
||||
}
|
||||
// err in call to os.Stat
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
// path refers to a device
|
||||
if finfo.Mode()&os.ModeDevice != 0 {
|
||||
return true, nil
|
||||
}
|
||||
// path does not refer to device
|
||||
return false, nil
|
||||
}
|
||||
|
||||
//GetDeviceNameFromMount: given a mount point, find the device name from its global mount point
|
||||
func (mounter *Mounter) GetDeviceNameFromMount(mountPath, pluginDir string) (string, error) {
|
||||
return getDeviceNameFromMount(mounter, mountPath, pluginDir)
|
||||
}
|
||||
|
||||
// getDeviceNameFromMount find the device name from /proc/mounts in which
|
||||
// the mount path reference should match the given plugin directory. In case no mount path reference
|
||||
// matches, returns the volume name taken from its given mountPath
|
||||
func getDeviceNameFromMount(mounter Interface, mountPath, pluginDir string) (string, error) {
|
||||
refs, err := GetMountRefs(mounter, mountPath)
|
||||
if err != nil {
|
||||
glog.V(4).Infof("GetMountRefs failed for mount path %q: %v", mountPath, err)
|
||||
return "", err
|
||||
}
|
||||
if len(refs) == 0 {
|
||||
glog.V(4).Infof("Directory %s is not mounted", mountPath)
|
||||
return "", fmt.Errorf("directory %s is not mounted", mountPath)
|
||||
}
|
||||
basemountPath := path.Join(pluginDir, MountsInGlobalPDPath)
|
||||
for _, ref := range refs {
|
||||
if strings.HasPrefix(ref, basemountPath) {
|
||||
volumeID, err := filepath.Rel(basemountPath, ref)
|
||||
if err != nil {
|
||||
glog.Errorf("Failed to get volume id from mount %s - %v", mountPath, err)
|
||||
return "", err
|
||||
}
|
||||
return volumeID, nil
|
||||
}
|
||||
}
|
||||
|
||||
return path.Base(mountPath), nil
|
||||
}
|
||||
|
||||
func listProcMounts(mountFilePath string) ([]MountPoint, error) {
|
||||
content, err := utilio.ConsistentRead(mountFilePath, maxListTries)
|
||||
if err != nil {
|
||||
|
|
@ -345,64 +418,9 @@ func parseProcMounts(content []byte) ([]MountPoint, error) {
|
|||
}
|
||||
|
||||
func (mounter *Mounter) MakeRShared(path string) error {
|
||||
return doMakeRShared(path, procMountInfoPath)
|
||||
}
|
||||
|
||||
func (mounter *Mounter) GetFileType(pathname string) (FileType, error) {
|
||||
var pathType FileType
|
||||
finfo, err := os.Stat(pathname)
|
||||
if os.IsNotExist(err) {
|
||||
return pathType, fmt.Errorf("path %q does not exist", pathname)
|
||||
}
|
||||
// err in call to os.Stat
|
||||
if err != nil {
|
||||
return pathType, err
|
||||
}
|
||||
|
||||
mode := finfo.Sys().(*syscall.Stat_t).Mode
|
||||
switch mode & syscall.S_IFMT {
|
||||
case syscall.S_IFSOCK:
|
||||
return FileTypeSocket, nil
|
||||
case syscall.S_IFBLK:
|
||||
return FileTypeBlockDev, nil
|
||||
case syscall.S_IFCHR:
|
||||
return FileTypeBlockDev, nil
|
||||
case syscall.S_IFDIR:
|
||||
return FileTypeDirectory, nil
|
||||
case syscall.S_IFREG:
|
||||
return FileTypeFile, nil
|
||||
}
|
||||
|
||||
return pathType, fmt.Errorf("only recognise file, directory, socket, block device and character device")
|
||||
}
|
||||
|
||||
func (mounter *Mounter) MakeDir(pathname string) error {
|
||||
err := os.MkdirAll(pathname, os.FileMode(0755))
|
||||
if err != nil {
|
||||
if !os.IsExist(err) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mounter *Mounter) MakeFile(pathname string) error {
|
||||
f, err := os.OpenFile(pathname, os.O_CREATE, os.FileMode(0644))
|
||||
defer f.Close()
|
||||
if err != nil {
|
||||
if !os.IsExist(err) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mounter *Mounter) ExistsPath(pathname string) bool {
|
||||
_, err := os.Stat(pathname)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
mountCmd := defaultMountCommand
|
||||
mountArgs := []string{}
|
||||
return doMakeRShared(path, procMountInfoPath, mountCmd, mountArgs)
|
||||
}
|
||||
|
||||
// formatAndMount uses unix utils to format and mount the given disk
|
||||
|
|
@ -471,7 +489,7 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string,
|
|||
return mountErr
|
||||
}
|
||||
|
||||
// getDiskFormat uses 'lsblk' to see if the given disk is unformated
|
||||
// diskLooksUnformatted uses 'lsblk' to see if the given disk is unformated
|
||||
func (mounter *SafeFormatAndMount) getDiskFormat(disk string) (string, error) {
|
||||
args := []string{"-n", "-o", "FSTYPE", disk}
|
||||
glog.V(4).Infof("Attempting to determine if disk %q is formatted using lsblk with args: (%v)", disk, args)
|
||||
|
|
@ -573,7 +591,7 @@ func parseMountInfo(filename string) ([]mountInfo, error) {
|
|||
// path is shared and bind-mounts it as rshared if needed. mountCmd and
|
||||
// mountArgs are expected to contain mount-like command, doMakeRShared will add
|
||||
// '--bind <path> <path>' and '--make-rshared <path>' to mountArgs.
|
||||
func doMakeRShared(path string, mountInfoFilename string) error {
|
||||
func doMakeRShared(path string, mountInfoFilename string, mountCmd string, mountArgs []string) error {
|
||||
shared, err := isShared(path, mountInfoFilename)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue